用Source Insight来追踪Android系统启动流程的源码,并将我认为重要的源码进行分析

1、当系统引导程序启动Linux内核,内核会记载各种数据结构和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:Init.c(system\core\init)

//Init.c中的main()方法int main(int argc, char **argv){    //解析执行init.rc配置文件    init_parse_config_file("/init.rc");}

2、执行配置文件init.rc(system\core\rootdir)中定义好的指令,进行环境初始化;执行了很多bin指令,来启动系统服务

//启动孵化器进程,执行app_process(一个编译好的可执行文件)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

3、在app_process文件下找到app_main.cpp,查看main()方法

int main(int argc, const char* const argv[]){    //启动一个系统服务:ZygoteInit  runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);}

4、在ZygoteInit.java中,查看main()方法

public static void main(String argv[]) {    //预加载Android系统所需要的类    preloadClasses();    if (argv[1].equals("true")) {        //调用方法开启系统服务        startSystemServer();     }}

preloadClasses(),加载Android运行时环境

/*** The name of a resource file that contains classes to preload.*///“preloaded-classes”这个文件里面是Android中所有需要加载的全包名private static final String PRELOADED_CLASSES = "preloaded-classes";private static void preloadClasses() {    //用类加载器,根据文件名,加载资源作为一个输入流    InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(PRELOADED_CLASSES);    BufferedReader br = new BufferedReader(new InputStreamReader(is), 256);    String line;    //一行一行的读取全包名    while ((line = br.readLine()) != null) {    //根据全包名加载类      Class.forName(line);    }  }

startSystemServer(),这个方法开启系统服务

String args[] = {     "--setuid=1000",     "--setgid=1000",     "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,                  1009,1010,1018,3001,3002,3003",     "--capabilities=130104352,130104352",     "--runtime-init",     "--nice-name=system_server",     //开启SystemServer服务     "com.android.server.SystemServer",};

5、启动SystemServer服务

//C库中的init1()方法native public static void init1(String[] args);public static void main(String[] args) {    //加载C库    System.loadLibrary("android_servers");    //执行C库里的init1方法    init1(args);}

在om_android_server_SystemServer.cpp文件,找到init1()方法

static JNINativeMethod gMethods[] = {    /* name, signature, funcPtr */    //给init1方法映射一个指针,最后调用了system_init()方法,而system_init()没有方法体    { "init1", "([Ljava/lang/String;)V", (void*)       android_server_SystemServer_init1 },};static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz){    system_init();}extern "C" int system_init();

在system_init.cpp文件中找到system_init()方法

extern "C" status_t system_init(){    //这个方法里主要是开启硬件管理服务    SensorService::instantiate();    AudioFlinger::instantiate();    MediaPlayerService::instantiate();    CameraService::instantiate();    //执行SystemServer类中的init2()方法    runtime->callStatic("com/android/server/SystemServer", "init2");}

回到SystemServer类中的init2()方法

public static final void init2() {    //创建系统服务线程    Thread thr = new ServerThread();    thr.setName("android.server.ServerThread");    thr.start();}

6、在ServerThread类中的run()方法中,开启系统的其他服务

//准备消息轮询器Looper.prepare();//启动大量的系统服务并把其逐一添加至ServiceManagerServiceManager.addService(Context.WINDOW_SERVICE, wm);//调用ActivityManagerService类中的systemReady()方法,准备创建第一个activity((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {});

7、在ActivityManagerService.java中,找到systemReady()方法

public ActivityStack mMainStack;public void systemReady(final Runnable goingCallback) {    //启动laucher    mMainStack.resumeTopActivityLocked(null);}

在ActivityStack.java中找到resumeTopActivityLocked()方法

final boolean resumeTopActivityLocked(ActivityRecord prev) {    ActivityRecord next = topRunningActivityLocked(null);    //判断栈顶是否有activity,没有的话直接启动laucher    if (next == null) {    // There are no more activities!  Let's just start up the Launcher...        if (mMainStack) {            return mService.startHomeActivityLocked();        }    }}

至此,Laucher已经被启动,Android系统启动完成;

声明:本文只做学习交流,欢迎大家提出各类问题,让我们共同进步!!!

最后附上时序图一张


Android系统的启动时序图.png

更多相关文章

  1. 添加android系统通知
  2. Android设计——Activity和Task的设计思路和方法
  3. Android(安卓)WebView 的回退方法(goback) 遭遇重定向
  4. Avtivity 知识点,不断更新中
  5. Android中Application分析
  6. Android进行单元测试难在哪-part4
  7. Android中WebView方法WebViewClient和WebChromeClient的区别
  8. android jni示范 修改无法启动注意点 jni无效
  9. [转发]Android(安卓)系统稳定性 - ANR(三)

随机推荐

  1. 零基础Python入门教程第7节:流程控制
  2. 顶会「扩招」,一地鸡毛:ICLR2020近半数审稿
  3. 英特尔AI医疗实战曝光:10倍加速辅助诊断、
  4. 半年21项全新发布和升级,百度飞桨团队「码
  5. DeepMind星际争霸AI登上Nature,超越99.8%活
  6. 在图像生成领域里,GAN这一大家族是如何生
  7. 顶会抄顶会:SIGIR 2019论文被爆抄袭,部分内
  8. ECC内存与普通内存之间的区别
  9. Shell 流程控制
  10. VB.NET和Python有什么不同?前景分析!