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方法:

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具体启动一系列的服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值