Android 本机服务器列表

List of Android native servers

如何获取 Android 本机服务器的完整列表。具体来说,我问的是Android 7.1.2。我尝试了几种方法,但我认为它们都是错误的。

第一个:

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有区别吗?

'native' 人们的意思是 'written in native platforms language' 这意味着 C/C++ android。一项服务通常意味着 'object in memory that has exposed binder interface'。其他进程可以调用它的 IBinder 派生接口。因此,在示例中,来自 ps 列表的音频服务器是由 init.rc 在启动时启动的服务器,它是用 C++ 编写的,您可以将其称为本机服务器。它内部至少有 2 个服务:audio_flinger 和 audio_policy - 它们也是 C/C++ 代码,它们是公开它的 IBinder 接口的对象,所以你可以调用它们 'native services' .

所有服务的列表在这里: adb shell 服务列表

一些内部运行时信息,如果你喜欢运行时调试:

adb shell dumpsys

servers/deamons 的列表你做对了 - 'ps' 但并不是所有的 'rild' 或提到的 'surfaceflinger' 都在其名称中有服务器。

阅读 /system/core/rootdir/init.rc plus device///init*.rc 在 android 源目录中。

是的。本机服务器是完全独立于 android java 代码(即合子)的 c/c++ 程序(具有 void main(argc, argv){} 入口点)。因此,您可以仅使用 initd 启动 android,而无需使用 zygote 或系统服务器。 运行 那些来自您的板 init.rc 的本机服务器。

因此,当您查找所有这些列表时,请从您的 运行ning 设备读取 /init.rc。并查找 'service ...' 部分。您将只有几个 init*.rc 文件。 有些来自system/core/rootdir/initrc,有些来自 device/name_of_the_manufacturer/name_of_board/initrc

每个部分 'system ...' 定义内核启动后 initd 启动的内容。

服务音频服务器/system/bin/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=initrc

在源代码树的根目录中,忽略来自不同 device/manufacturers/

的那些