Android 系统启动流程简介
2. Zygote启动流程
3. SystemServer启动流程
1. Init 进程启动流程
Android启动流程
init进程 –>
Zygote进程 –>
SystemServer进程 –>
各种应用进程
Init 进程
init是第一个进程,我们可以说它是root进程或者说有进程的父进程。init进程有两个责任,
一是挂载目录,比如/sys、/dev、/proc,
二是运行init.rc脚本。
init进程可以在/system/core/init找到。
源码位置 Init.cpp: system/core/init/init.cpp
init系统中位置:/init
init.rc文件可以在/system/core/rootdir/init.rc找到。
readme.txt可以在/system/core/init/readme.txt找到。
Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务
Options(选项) :选项是对服务的描述。它们影响init进程如何以及何时启动服务。
在这个阶段你可以在设备的屏幕上看到“Android”logo了。
Init.rc脚本解析
2. Zygote启动流程
Zygote进程启动过程
1. 解析启动Service(Zygote) init.rc->
service zygote /system/bin/app_process32 - Xzygote /system/bin
--zygote --start-system-server --socket-name=zygote
执行命令后到frameworks\/base/\cmds\/app_process/\app_main.cpp main()
2. app_main.cpp 里调用AndroidRuntime.start()启动ZygoteInit.cpp Main().
frameworks/base/core/jni/AndroidRuntime.cpp
3. AndroidRuntime.start方法调用ZygoteInit.java的Main()方法。
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
frameworks/base/core/jni/AndroidRuntime.cpp
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java-
4. ZygoteInit.java main() 方法
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
5. Register zygote Socket
ZygoteServer.registerServerSocketFromEnv(“zygote”)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
6. StartSystemServer
startSystemSerer
forkSystemServer(abilist,socketName,zygoteServer)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
7.RunSelectLoop
Caller=zygoteServer.runSelectLoop(abilist)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
3. SystemServer启动流程
1. ZygoteInit.java main() 方法,
pid=Zygote.forkSystemServer() ->
handleySystemServerProcess() ->
RuntimeInit.zygoteInit() ->
Frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/Zygote.java
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
---- (Class zygote, method forkSystemServer)
2. RuntimeInit.ZygoteInit() - >
RuntimeInit.commonInit(); ZygoteInit.nativeZygotieInit(); RuntimeInit.appicationInit(); ->
invokeStatickMain(args,startClass,args.startArgs,classLoader); ->
throw new Zygote.MethodAndArgsCaller(m,argv) 调用到SystemServer Mian方法
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
frameworks/base/services/java/com/android/server/SystemServer.java
3.1 在SystemServer.java main() 方法里调用到SystemServer().run() ->
设置一些系统属性
SystemProperties.set("persist.sys.timezone", "GMT");
SystemProperties.set("persist.sys.locale", languageTag);
SystemProperties.set("persist.sys.language", "");
SystemProperties.set("persist.sys.country", "");
SystemProperties.set("persist.sys.localevar", "");
3.2 run () 里其他初始化及设置主线程,开始服务和LOOPER:
Build.ensureFingerprintProperty();
// Increase the number of binder threads in system_server
BinderInternal.setMaxThreads(sMaxBinderThreads);
// Prepare the main looper thread (this thread). 设置主线程
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); 准备LOOPER.
// Initialize native services.
System.loadLibrary("android_servers");
// Start services. 开启服务
try {traceBeginAndSlog("StartServices");startBootstrapServices();
startCoreServices();startOtherServices(); SystemServerInitThreadPool.shutdown(); }
// Loop forever. 开启Looper.
Looper.loop();
frameworks/base/services/java/com/android/server/SystemServer.java
转载:https://blog.csdn.net/weixin_41820883/article/details/80895733
相关文章
- [Android Pro] android控件ListView顶部或者底部也显示分割线
- android Universal Image Loader for Android 说明文档 (1)
- android多屏幕分辨率适配
- Android API之android.widget.Filterable
- [整] Android Fragment 生命周期图
- Android studio 提示“android qemu-system-i386.exe停止工作”
- Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制
- Android开发学习笔记(五)帧布局FrameLayout
- Android 设置壁纸流程
- android 证书验证流程分析_Android签名机制之---签名验证过程详解
- Android 引导页
- Android 10.0 AMS跟踪Activity启动流程来显示和隐藏导航栏
- Android 测量流程详解
- 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
- 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
- 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )
- Android Studio下“Error:Could not find com.android.tools.build:gradle:2.2.1”的解决方法
- 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
- android 搭建开发环境
- Android的java的报错提示:Could not find com.android.tools.build:gradle:4.2.2.
- Android 10.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析