文档章节

Android启动流程

AntMoon
 AntMoon
发布于 2016/01/28 14:02
字数 769
阅读 12
收藏 1

当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init.c)代码如下:

int main(int argc, char **argv)
{

    // 创建文件夹 挂载
    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);

    // 打卡日志
    log_init();

    INFO("reading config file\n");
    // 加载init.rc配置文件
    init_parse_config_file("/init.rc");

}

加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd

从c++代码调到java代码:

int main(int argc, const char* const argv[])
{
    ...
    // Android运行时环境
    AppRuntime runtime;
    ...
    // Next arg is startup classname or "--zygote"
    if (i < argc) {
        arg = argv[i++];
        if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ? 
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
            set_process_name("zygote");
            // 启动java代码
            runtime.start("com.android.internal.os.ZygoteInit",
         ...

}

ZygoteInit.java 代码:

public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);

// 加载Android依赖的类
        preloadClasses();
        //cacheRegisterMaps();
        preloadResources();
        ...

        if (argv[1].equals("true")) {
            // 启动系统服务
            startSystemServer();
        } else if (!argv[1].equals("false")) {
       ...
}


private static boolean startSystemServer()
     ...
        args = new String[] {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006",
            "--capabilities=130104352,130104352",
            "--rlimit=8,",
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
      ...

        /* Request to fork the system server process */
        // 母进程开始分叉服务 启动SystemServer
        pid = Zygote.forkSystemServer(
                parsedArgs.uid, parsedArgs.gid,
                parsedArgs.gids, debugFlags, rlimits,
                parsedArgs.permittedCapabilities,
                parsedArgs.effectiveCapabilities);
    ..
}

SystemServer.java 代码

public static void main(String[] args) {
    ... 
    // 加载jni库
    System.loadLibrary("android_servers");
    // 调用native方法
    init1(args);
}
native public static void init1(String[] args);

SystemServer 对应的c++代码 comandroidserver_SystemServer.cpp 代码如下:

// 类似java的抽象方法
extern "C" int system_init();

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{   
    // 转调
    system_init();
}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */ 
    // 函数指针 把init1方法映射到android_server_SystemServer_init1
    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};

systeminit 的实现方法在Systeminit.cpp 代码如下:

extern "C" status_t system_init()
{
    ...
    // 启动硬件的服务
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }



    AndroidRuntime* runtime = AndroidRuntime::getRuntime();

    LOGI("System server: starting Android services.\n");
    // 启动完硬件服务后,又回到Systemserver的init2方法
    runtime->callStatic("com/android/server/SystemServer", "init2");
    ...
}

SystemServer 的init2方法代码:

public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }

ServerThread的run方法:

public void run() { ... // 开启Android各种服务并且添加到ServiceManager去管理 Slog.i(TAG, "Device Policy"); devicePolicy = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICEPOLICYSERVICE, ottle =

...
    // We now tell the activity manager it is okay to run third party
    // code.  It will call back into us once it has gotten to the state
    // where third party code can really run (but before it has actually
    // started launching the initial applications), for us to complete our
    // initialization.
    // 各种服务开启后调用ActivityManagerService.systemReady
    ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady(new Runnable() {
        public void run() {
            Slog.i(TAG, "Making services ready");

ActivityMangerService的systemReady的方法:

public void systemReady(final Runnable goingCallback) {
        ...
        // 打开第一个Activity
            mMainStack.resumeTopActivityLocked(null);
        }
    }

ActivityStack的resumeTopActivityLocked方法

final boolean resumeTopActivityLocked(ActivityRecord prev) {
        // Find the first activity that is not finishing.
        // 没有已经打开的Activity next为 null
        ActivityRecord next = topRunningActivityLocked(null);

        // Remember how we'll process this pause/resume situation, and ensure
        // that the state is reset however we wind up proceeding.
        final boolean userLeaving = mUserLeaving;
        mUserLeaving = false;

        if (next == null) {
            // There are no more activities!  Let's just start up the
            // Launcher...

            if (mMainStack) {
                // 启动lucher应用的锁屏界面
                return mService.startHomeActivityLocked();
            }
        }

Android系统启动完成,打开了Luncher应用的Home界面。

© 著作权归作者所有

AntMoon
粉丝 0
博文 19
码字总数 4923
作品 0
津南
私信 提问
Android插件化快速入门与实例解析(VirtualApk)必须了解一下

 集成一个第三方相册功能,只需集成一个插件APK到项目中,无需集成额外代码,并且支持随时更新相册功能,无需发布版本更新,无需AndroidManifest中声明四大组件,这就是插件化。   插件化...

android自学
2018/07/22
0
0
源码分析 — Activity的启动流程

原文链接:https://blog.csdn.net/lj19851227/article/details/82562115 前言 熟悉Activity的启动流程和运行原理是一个合格的应用开发人员所应该具备的基本素质,其重要程度就不多做描述了。...

一叶飘舟
08/04
0
0
(Android 9.0)Activity启动流程源码分析

前言 熟悉Activity的启动流程和运行原理是一个合格的应用开发人员所应该具备的基本素质,其重要程度就不多做描述了。同时,知识栈应该不断的更新,最新发布的Android 9.0版本相较于之前的几个...

天王盖地虎626
06/21
30
0
Android进阶(四):Activity启动过程(最详细&最简单)

1.前言 最近一直在看 《Android进阶解密》 的一本书,这本书编写逻辑、流程都非常好,而且很容易看懂,非常推荐大家去看看(没有收广告费,单纯觉得作者写的很好)。 上一篇简单的介绍了And...

天王盖地虎626
06/20
18
0
彻底理解startActivity的启动过程这一篇就够了

基于Android 6.0的源码剖析, 分析android Activity启动流程,相关源码: frameworks/base/services/core/java/com/android/server/am/ - ActivityManagerService.java - ActivityStackSuper......

天王盖地虎626
06/20
25
0

没有更多内容

加载失败,请刷新页面

加载更多

还为PDF转Word抓狂?以下神器让你在职场倍受欢迎!

身在职场的你,是否一直在琢磨:如何能让自己在公司更受欢迎?如何才能在办公室里混个好人缘?如何在同事圈里留个好印象?其实,想要让自己成为受欢迎的人,只要让自己成为大家需要的人不就行...

foxit2world
25分钟前
7
0
AndServer+Service打造Android服务器实现so文件调用

so 文件调用 随着 Android 移动安全的高速发展,不管是为了执行效率还是程序的安全性等,关键代码下沉 native 层已成为基本操作。 native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 可以实...

夜幕NightTeam
26分钟前
4
0
Docker下kafka学习三部曲之二:本地环境搭建

在上一章《 Docker下kafka学习,三部曲之一:极速体验kafka》中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来学习如何编写...

程序员欣宸
27分钟前
4
0
萌新推荐!不再为Excel转换PDF发愁,Aspose.Cells for .NET一步到位!

Aspose.Cells for .NET(点击下载)是Excel电子表格编程API,可加快电子表格管理和处理任务,支持构建具有生成,修改,转换,呈现和打印电子表格功能的跨平台应用程序。 将Excel工作簿转换为...

mnrssj
27分钟前
6
0
对于绘画小白怎么画制服?该注意什么?

怎样制作学生服装?想必绘画初学者们常常会想的问题吧,不知道怎样才能画好人物的衣服,别着急,今日就在这儿讲一些关于如何绘画学生衣服校服的教程给我们!期望能够帮到你们! 轻便西装是不...

热爱画画的我
33分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部