赞
踩
本篇参考老罗的《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方法:
- if (zygote) {
- runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
- } else if (className) {
- runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
- }
如果是zygote自己进程(fork zygote进程),则执行的是ZygoteInit文件
start方法可以看AndroidRuntime,内部会先启动VM。
4)进入framwworks/base/core/java/com.android.internal.os.ZygoteInit
首先是其main方法:
如果没有实行懒加载,则会先执行preload方法,下面看下preload方法:
- static void preload(BootTimingsTraceLog bootTimingsTraceLog) {
- ...
- preloadClasses();
- ...
- preloadResources();
- ...
- preloadOpenGL();
- ...
- preloadSharedLibraries();
- preloadTextResources();
- ...
- }
-
可以看到先后加载了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);
- pid = Zygote.forkSystemServer(
- parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids,
- parsedArgs.debugFlags,
- null,
- parsedArgs.permittedCapabilities,
- parsedArgs.effectiveCapabilities);
通过设定一些参数,最后.forkSystemServer,fork了一个我们Android的System进程
- if (pid == 0) {
- if (hasSecondZygote(abiList)) {
- waitForSecondaryZygote(socketName);
- }
- zygoteServer.closeServerSocket();
- handleSystemServerProcess(parsedArgs);
- }
pid为0表示新创建的子进程,通过handleSystemServerProcess() 启动System进程。
6)System启动进程等会分析,我们可以看到启动完System进程,代码重新回到main方法,ZygoteInit进入
zygoteServer.runSelectLoop(abiList);
等待有新的进程过来。
7)下面继续分析System进程启动过程:
- private static void handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs)throws Zygote.MethodAndArgsCaller {
- ...
- ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
- ...
- }
-
- public static final void zygoteInit(int targetSdkVersion, String[] argv,
- ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
- ...
- RuntimeInit.commonInit();
- ZygoteInit.nativeZygoteInit();
- RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
- }
-
可以看到启动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函数
- public static void main(String[] args) {
- new SystemServer().run();
- }
-
- private void run(){
- ...
- startBootstrapServices();
- startCoreServices();
- startOtherServices();
- ...
- }
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具体启动一系列的服务
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。