Android源码阅读记录

Android源码阅读记录,第1张

从Android SystemServer开始

安卓的Framework层也就是zygote是从SystemServer开始的,所有重要的上层服务都集中在SystemServer这个进程中,这个进程的名字为app_process(64位为app_process64).这个进程的启动脚本示例如下:

init.zygote64.rc

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    onrestart restart vendor.servicetracker-1-1
    writepid /dev/cpuset/foreground/tasks

可以看到,当我们这个进程被重启以后很多需要被依赖的本地进程需要被拉起来,这些restart的server都是以binder的服务端存在的本地服务,提供了例如音频camera等的基础服务功能,我们Framework只是作为客户端会去调用这些服务里的一些功能,然后framework再为上层应用提供接口,作为中间人统筹管理这些所有的硬件资源。

上面提到的app_process这个进程源码目录在frameworks/base/cmds/app_pro
cess它只是作为一个启动器的存在,只有一个源文件就是app_main.cpp它可以被编译成32以及64位的版本。

这里的main函数通过AppRuntime继承自AndroidRuntime来启动java的类。

if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    }
这里的zygote是通过参数来判断的,我们上面的rc文件中可以看到我们通过这个进程带的参数是

--zygote --start-system-server

启动systemserver是从这里开始的,当然这个进程也可以启动普通app,当后面启动应用的时候还需要这个进程来创建镜像。

具体的如何启动vm然后怎么加载的java类我们先不做探讨。

我们知道在启动zygote的时候是调用了ZygoteInit这个类来完成的,它同样有个main函数如下:

frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

 @UnsupportedAppUsage
    public static void main(String argv[]) {
        ZygoteServer zygoteServer = null;

。。。。。省略一部分


            zygoteServer = new ZygoteServer(isPrimaryZygote);

            if (startSystemServer) {
                Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);

                // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
                // child (system_server) process.
                if (r != null) {
                    r.run();
                    return;
                }
            }

这里可以看到通过forkSystemServer继续去创建

 private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {

这个函数里有个参数列表比较重要

/* Hardcoded command line to start the system server */
        String args[] = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                        + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",
        };

这里的setgroups限制了那些uid的访问权限。以及指定了我们的类com.android.server.SystemServer

然后通过Zygote这个类继续创建如下:

 /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.mUid, parsedArgs.mGid,
                    parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags,
                    null,
                    parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);

当我们第一次创建子进程成功的时候这个pid肯定返回的是0,到这我们的SystemServer就要被启动了,并被作为主进程存在。

frameworks\base\core\java\com\android\internal\os\Zygote.java

 public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
        ZygoteHooks.preFork();
        // Resets nice priority for zygote process.
        resetNicePriority();
        int pid = nativeForkSystemServer(
                uid, gid, gids, runtimeFlags, rlimits,
                permittedCapabilities, effectiveCapabilities);
        // Enable tracing as soon as we enter the system_server.
        if (pid == 0) {
            Trace.setTracingEnabled(true, runtimeFlags);
        }
        ZygoteHooks.postForkCommon();
        return pid;
    }

这里的nativeForkSystemServer就到了c++的底层程序了属于linux的编程,很容易就可以创建子进程。

这样我们就可以继续分析SystemServer。

SystemServer可以开始了,去到它的main函数。

frameworks\base\services\java\com\android\server\SystemServer.java

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/798147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存