当前位置:   article > 正文

Android系统启动源码分析_android 32 android启动源码分析

android 32 android启动源码分析

前言

本篇参考老罗的《Android系统源代码情景分析》,有想了解深入的朋友可以去看原书籍,比较详细和权威。

不记录没收获,这里记录下结合Android-8.0.0_r17源码走过的流程。

                                                                          高焕堂老师的教学文件截图

分析

1)内核加载完毕,启动init进程,通过init.rc脚本启动Zygote。Zygote加载应用程序文件frameworks/base/cmds/app_process/app_main.cpp

2)从app_main.cpp的main方法可以看到,其先创建了AppRuntime。

3)main方法的后面调用了runtime的start方法:

  1. if (zygote) {
  2. runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
  3. } else if (className) {
  4. runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
  5. }

如果是zygote自己进程(fork zygote进程),则执行的是ZygoteInit文件

start方法可以看AndroidRuntime,内部会先启动VM。

4)进入framwworks/base/core/java/com.android.internal.os.ZygoteInit

首先是其main方法:

如果没有实行懒加载,则会先执行preload方法,下面看下preload方法:

  1. static void preload(BootTimingsTraceLog bootTimingsTraceLog) {
  2. ...
  3. preloadClasses();
  4. ...
  5. preloadResources();
  6. ...
  7. preloadOpenGL();
  8. ...
  9. preloadSharedLibraries();
  10. preloadTextResources();
  11. ...
  12. }

可以看到先后加载了preloadClasses(); preloadResources(); preloadOpenGL();preloadSharedLibraries();preloadTextResources();

需要说下的是preloadClasses(),这里是按照

private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes";

这里加载了一系列需要使用到的class

5)启动System进程

依然是ZygoteInit这个类,在preload()之后,main方法执行的是 startSystemServer(abiList, socketName, zygoteServer);

  1. pid = Zygote.forkSystemServer(
  2. parsedArgs.uid, parsedArgs.gid,
  3. parsedArgs.gids,
  4. parsedArgs.debugFlags,
  5. null,
  6. parsedArgs.permittedCapabilities,
  7. parsedArgs.effectiveCapabilities);

通过设定一些参数,最后.forkSystemServer,fork了一个我们Android的System进程

  1. if (pid == 0) {
  2. if (hasSecondZygote(abiList)) {
  3. waitForSecondaryZygote(socketName);
  4. }
  5. zygoteServer.closeServerSocket();
  6. handleSystemServerProcess(parsedArgs);
  7. }

pid为0表示新创建的子进程,通过handleSystemServerProcess() 启动System进程。

6)System启动进程等会分析,我们可以看到启动完System进程,代码重新回到main方法,ZygoteInit进入

zygoteServer.runSelectLoop(abiList);

等待有新的进程过来。

7)下面继续分析System进程启动过程:

  1. private static void handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs)throws Zygote.MethodAndArgsCaller {
  2. ...
  3. ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
  4. ...
  5. }
  6. public static final void zygoteInit(int targetSdkVersion, String[] argv,
  7. ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
  8. ...
  9. RuntimeInit.commonInit();
  10. ZygoteInit.nativeZygoteInit();
  11. RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
  12. }

可以看到启动System进程的过程进入到了zygoteInit方法:

RuntimeInit.commonInit();设置System进程的时区和键盘布局等通用信息;

ZygoteInit.nativeZygoteInit();在System进程中启动一个Binder线程池;

8)执行RuntimeInit.applicationInit();

applicationInit()里面执行了invokeStaticMain(args.startClass, args.startArgs, classLoader);

这里通过之前的参数,启动了frameworks/base/services/java/com/android/server/SystemServer.java

开始新建进程,同时ZygoteInit自己则回到main方法,执行runSelectLoop,等待新的进程加入。

9)进入SystemServer的main函数

  1. public static void main(String[] args) {
  2. new SystemServer().run();
  3. }
  4. private void run(){
  5. ...
  6. startBootstrapServices();
  7. startCoreServices();
  8. startOtherServices();
  9. ...
  10. }

startBootstrapServices();启动引导服务

大致如下:Installer,DeviceIdentifiersPolicyService,ActivityManagerService,PowerManagerService,RecoverySystemService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService,OverlayManagerService

startCoreServices();启动核心服务

大致有如下服务:DropBoxManagerService,BatteryService,UsageStatsService,UsageStatsManagerInternal,WebViewUpdateService

startOtherServices();启动其它服务

大致有如下服务:KeyChainSystemService,SchedulingPolicyService,TelecomLoaderService,AccountManagerService,ContentService,InstallSystemProviders,VibratorService,ConsumerIrService,AlarmManagerService,InitWatchdog,InputManagerService,WindowManagerService,VrManagerService,UiModeManagerService,PersistentDataBlockService,OemLockService,DeviceIdleController,DevicePolicyManagerService,ClipboardService,TextServicesManagerService,NotificationManagerService,DeviceStorageMonitorService,AudioService,DockObserver,TwilightService,NightDisplayService,JobSchedulerService,SoundTriggerService,TrustManagerService,GestureLauncherService,SensorNotificationService,ContextHubSystemService,EmergencyAffordanceService,DreamManagerService,MediaSessionService,HdmiControlService,TvInputManagerService,MediaResourceMonitorService,TvRemoteService,FingerprintService,LauncherAppsService,ShortcutService,MmsServiceBroker,RetailDemoModeService。

这其中有些非现在就启动的服务,但大多数都是开启就要启动的服务,看到这里也就一点都不怪Android开机速度慢了。。

综上:可以看出我们手机启动过程,大致为:启动内核 --> init.rc脚本 --> 启动ServiceManager和app_process -->  创建AppRuntime --> start时创建VM --> 启动ZygoteInit --> 启动System进程 --> SystemServer具体启动一系列的服务

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/654415
推荐阅读
相关标签
  

闽ICP备14008679号