Android系统的启动流程
16lz
2021-01-24
Android系统的启动流程
操作系统的引导文件去运行linux的内核程序,内核程序开始启动的时候会加载各种驱动和数据结构,开始加载android应用层的第一个进程(init进程c代码(system\core\init目录)
下面就从开始加载android第一个进程说起,注意代码中的注释,另附图一张以便理解
Init.c源代码的main方法如下:
int main(int argc, char **argv){ ... 创建目录并且挂载该目录 //初始化日志 log_init(); ... //解析配置文件 init_parse_config_file("/init.rc"); ... return 0;}
init.rc配置文件(system\core\roodir)
... //孵化器进程,它是很多其他应用进程的母进程 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 ...
孵化器进程App_main.cpp(由c进入c++代码)
int main(int argc, const char* const argv[]){ ... 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"); runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); } ...}
com.android.internal.os.ZygoteInit Java类(java层的孵化器进程)
public static void main(String argv[]) { try { //设置最小堆内存5M VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024); 。。。 //预加载类和资源 ,该方法细节看2步 preloadClasses(); //强制执行一次垃圾收集 // Do an initial gc to clean up after startup gc(); // 传入的参数满足if 等于true,不然抛异常 if (argv[1].equals("true")) { startSystemServer();//详情看第3步 } 。。。}//end main//2步 preloadClasses()private static void preloadClasses() { final VMRuntime runtime = VMRuntime.getRuntime(); InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream( PRELOADED_CLASSES);//类的配置文件 1800多个类 try { BufferedReader br = new BufferedReader(new InputStreamReader(is), 256); int count = 0; String line; while ((line = br.readLine()) != null) { Class.forName(line);//加载每一个类 。。。 }//3步 startSystemServer()方法private static boolean startSystemServer() throws MethodAndArgsCaller, RuntimeException { /* 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,3001,3002,3003", "--capabilities=130104352,130104352", "--runtime-init", "--nice-name=system_server",//进程的名字system_server "com.android.server.SystemServer",//启动的类名 }; ZygoteConnection.Arguments parsedArgs = null; int pid; try { //把参数封装到对象中 parsedArgs = new ZygoteConnection.Arguments(args); //分叉进程 pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); 。。。 return true;}
com.android.server.SystemServer 分叉出该进程,main方法主要代码如下:
public static void main(String[] args) { 。。。。 // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); //加载android_servers库 jni System.loadLibrary("android_servers"); //加载 libxxx.so文件 init1(args);//通过jni调用的目的:通过c来启动底层的硬件服务}native public static void init1(String[] args); //在c或c++中实现
com_android_server_SystemServer.cpp(code\frameworks\base\services\jni目录) 该类的主要代码如下:
//这里写代码片System_init.cpp中,详情看2步 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", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },};//2步 System_init.cpp类 中system_init()方法主要代码如下:extern "C" status_t system_init(){ LOGI("Entered system_init()"); // Start the sensor service SensorService::instantiate(); // 启动硬件服务(c代码才可以直接操作硬件) if (!proc->supportsProcesses()) { // Start the AudioFlinger AudioFlinger::instantiate(); // Start the media playback service MediaPlayerService::instantiate(); // Start the camera service CameraService::instantiate(); // Start the audio policy service AudioPolicyService::instantiate(); } LOGI("System server: starting Android runtime.\n"); AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services.\n"); //详情看3步 runtime->callStatic("com/android/server/SystemServer", "init2"); ... return NO_ERROR; //3步 SystemServer类的静态方法init2,主要代码如下: Slog.i(TAG, "Entered the Android system server!"); //启动线程 Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start();
ServerThread类的run方法,主要代码如下:
@Overridepublic void run() { //轮询器的初始化 Looper.prepare(); 。。。 //启动各种服务 // make sure the ADB_ENABLED setting value matches the secure //几种服务的ready准备 。。。 ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady(new Runnable() { public void run() { Slog.i(TAG, "Making services ready"); if (statusBarF != null) statusBarF.systemReady2(); if (batteryF != null) batteryF.systemReady(); if (connectivityF != null) connectivityF.systemReady(); if (dockF != null) dockF.systemReady(); if (usbF != null) usbF.systemReady(); if (uiModeF != null) uiModeF.systemReady(); if (recognitionF != null) recognitionF.systemReady(); Watchdog.getInstance().start(); // It is now okay to let the various system services start their // third party code... if (appWidgetF != null) appWidgetF.systemReady(safeMode); if (wallpaperF != null) wallpaperF.systemReady(); if (immF != null) immF.systemReady(); if (locationF != null) locationF.systemReady(); if (throttleF != null) throttleF.systemReady(); } }); 。。。 //轮询器已经开监听消息(轮询取消息) Looper.loop(); Slog.d(TAG, "System ServerThread is exiting!");}
ActivityManagerService类的systemReady方法,主要代码如下:
public void systemReady(final Runnable goingCallback) { r 。。。。 final ArrayList doneReceivers = new ArrayList(); 。。。 加载各种Activity组件 //任务栈 mMainStack.resumeTopActivityLocked(null); }}
ActivityStack类的resumeTopActivityLocked方法,主要代码如下:
final boolean resumeTopActivityLocked(ActivityRecord prev) { //系统刚开始启动,任务栈中还不存在Activity 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; //第一次加载,没有任何Activity存在 if (next == null) { // There are no more activities! Let's just start up the // Launcher... if (mMainStack) { //系统刚开始启动成功 ,返回的就是待机画面的Activity return mService.startHomeActivityLocked(); }}... }
系统待机画面显示,系统启动完成
上图:
更多相关文章
- 修正AppCompatSpinner弹出框位置问题
- Android内容提供者使用及创建
- Android(安卓)10个快速开发框架:Afinal、ThinkAndroid、AndBase、
- Android学习路线(二十七)键值对(SharedPreferences)存储
- Android界面刷新的方法
- 转:编写高效的Android代码
- 解决eclipse中执行程序提示“Your project contains error(s),ple
- Android(安卓)Studio中Gradle的Daemon
- Frida入门学习笔记-hook native中的函数(1)