2017-08-12 66 views
1

如何獲取Android本機服務器的完整列表。具體來說,我問的是Android 7.1.2。我嘗試了幾種方法,但在我看來他們都錯了。Android本地服務器列表

第一:

AOSP$ ls -l out/target/product/generic_x86_64/system/bin/ | grep server 
-rwxrwxr-x 1 gluttton gluttton 13840 сер 7 00:37 audioserver 
-rwxrwxr-x 1 gluttton gluttton 5560 сер 7 00:40 cameraserver 
-rwxrwxr-x 1 gluttton gluttton 124432 сер 7 01:00 drmserver 
-rwxrwxr-x 1 gluttton gluttton 1125788 сер 7 01:00 gdbserver 
-rwxrwxr-x 1 gluttton gluttton 1115512 сер 7 01:00 gdbserver64 
-rwxrwxr-x 1 gluttton gluttton 17936 сер 7 01:05 mediadrmserver 
-rwxrwxr-x 1 gluttton gluttton 9652 сер 7 01:05 mediaserver 

但並不是所有的服務器稱爲<some>serversurfaceflinger是這種例外的一個例子。

二:

AOSP$ grep native frameworks/base/services/java/com/android/server/SystemServer.java 
    private static native void startSensorService(); 
      // libnativehelper's JniInvocation::Init code where we already 
      // Initialize native services. 
        reportWtf("observing native crashes", e); 

但是看起來並非所有的服務器都被SystemServer開始。

獎勵問題:native servernative service之間是否有區別?

+0

貌似相關:http://android-developers.narkive.com/coXimivq/native-daemons-started-by-init。 – Gluttton

回答

1

是的。本地服務器是完全獨立於android java代碼(即。zygote)的c/C++程序(具有void main(argc,argv){}入口點)。所以你可以只使用initd而不使用zygote或系統服務器來啓動android。並從你的開發板的init.rc運行這些本地服務器。

因此,當您查找所有這些列表時,請從正在運行的設備中讀取/init.rc。並尋找'服務...'部分。你將有幾個init * .rc文件。 有些是從系統/核心/ ROOTDIR /初始化RC的,有些是從 設備/ name_of_the_manufacturer/name_of_board /初始化 RC

每節「系統...」定義內核啓動之後怎麼用INITD啓動。

服務AUDIOSERVER /系統/斌/ AUDIOSERVER

class main 

user audioserver 

# media gid needed for /dev/fm (radio) and for /data/misc/media (tee) 

group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct 

ioprio rt 4 

writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks 

在Android的7,你必須找到-name INIT * .RC,因爲他們散落斷言的源代碼樹。

因此,要回答你的問題: 的grep -rn服務--include = 初始化 RC

在你的源代碼樹的根目錄,而忽略那些來自不同設備/廠商/

2

「原生」人的意思是'用原生平臺語言編寫',這意味着Android的C/C++。服務通常意味着'內存中的對象具有公開的綁定器界面'。其他進程可以將其稱爲IBinder派生接口。因此,在例子中,ps列出的audioserver是啓動時由init.rc啓動的服務器,它使用C++編寫,您可以將其稱爲本機服務器。它至少有2個服務:audio_flinger和audio_policy - 它們也是C/C++代碼,它們是暴露它的IBinder接口的對象,所以你可以稱它們爲「本地服務」。

所有服務的列表在這裏: 亞行shell服務列表

一些內部運行的信息,如果你想運行時的調試:

亞行外殼dumpsys

服務器列表/守護程序你正確地做 - 'ps',但不是所有的人都喜歡'rild'或提到的'surfaceflinger'在它的名字中有一個服務器。

在您的android源代碼目錄中讀取/system/core/rootdir/init.rc加上設備/// init * .rc。

+0

感謝您的回答。我所做的大部分建議都沒有幫助我。當我談到'native'服務時,我的意思是它不需要'zygote'或'system_server'來啓動 - 它是正確的嗎? – Gluttton

+0

是的,本機服務器是完全獨立於android java代碼(即.zygote)的c/C++程序(具有void main(argc,argv){}入口點)。所以你可以只使用initd而不使用zygote或系統服務器來啓動android。並從你的開發板的init.rc運行這些本地服務器。 因此,當您查找所有這些列表時,請從正在運行的設備中讀取/init.rc。並尋找 –