Android Framework- 开机启动流程

343 阅读1分钟

总流程梳理

基础流程如图

img

其实对于普通的Framework人员一般都是从init相关开始

init

  • main.cpp
//system/core/init/main.cpp
int main(int argc, char** argv) {
    if (argc > 1) {
         //省略。。
​
       //完成selinux基础配置 进入 second_stage
        if (!strcmp(argv[1], "selinux_setup")) {
            return SetupSelinux(argv);
        }
         //主要完成init.rc的解析 往脚本添加action,并执行
       //system/core/init/init.cpp
        if (!strcmp(argv[1], "second_stage")) {
            return SecondStageMain(argc, argv);
        }
    }
   /**
   system/core/init/first_stage_init.cpp  中完成 
   创建挂载所需文件目录 /dev/socke 等
   完成重定向 ,启动init 并调用 启动 进入SetupSelinux 。
   */
    return FirstStageMain(argc, argv);
}
  • rc文件解析

init.rc

//system/core/rootdir/init.rc
//#当sys.boot_from_charger_mode为1时执行
on property:sys.boot_from_charger_mode=1
    class_stop charger
    //触发 late-init
    trigger late-init
   //省略。。。
  on late-init
   //触发zygote启动
   trigger zygote-start
   //省略。。。
  
  on boot
  # Start standard binderized HAL daemons
    class_start hal
​
    class_start core //启动划分到core组  这里会将sf和开机动画启动启动 
  //启动 servicemanager
  on init
   # Start essential services.
    start servicemanager
    start hwservicemanager
    start vndservicemanager

zygote.rc

//system/core/rootdir/init.zygote64.rc 
// 服务 名称  源码路径  传入参数 注意 这里可以看到 是使用app_process 启动
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main //分组
    priority -20 //级别
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks
    critical window=${zygote.critical_window.minute:-off} target=zygote-fatal
​

app_process

//frameworks/base/cmds/app_process
static const char ZYGOTE_NICE_NAME[] = "zygote";
int main(int argc, char* const argv[])
{
     //androidRunTime 构建
     AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
   //省略 
   while (i < argc) {
        const char* arg = argv[i++];
        //判断是否zygote  systemServer  和app
        if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = ZYGOTE_NICE_NAME;
        } else if (strcmp(arg, "--start-system-server") == 0) {
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == 0) {
            application = true;
        }
   }
 //省略..
    if (zygote) {
       // 进入ZygoteInit 并将参数传入 最后参数为  iceName为zygote 参数 start-system-server
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        //runTime 为AndroidRuntime
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } 
}
​

ZygoteInit

// com/android/internal/os/ZygoteInit.java
​
public static void main(String[] argv){
   //省略
   //zygote native构建
    Zygote.initNativeState(isPrimaryZygote);
    //创建 ZygoteServer 方便后来链接 构建
    zygoteServer = new ZygoteServer(isPrimaryZygote);
     // 根据传入参数进行fork 构建systemServer
     if (startSystemServer) {
              //构建systemServer 具体详情可以看下代码 nicename->
                Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
                if (r != null) {
                    //执行SystemServer.main 
                    r.run();
                    return;
                }
            }
      //接收ams 传递的参数
      caller = zygoteServer.runSelectLoop(abiList);
​
}
​
private static Runnable forkSystemServer(){
  
   String[] args = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                        + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",//启动systemServer
        };
  Zygote.forkSystemServer(); //反射构建
  //省略
}
​
​

SystemServer

 public static void main(String[] args) {
        new SystemServer().run();
    }
    
    private void run() {
       //  构建系统上下文
            createSystemContext();
        //基础服务
        startBootstrapServices(t);
       //核心服务
            startCoreServices(t);
        //其他服务 AMS PMS 等在这里构建
            startOtherServices(t);
    
    
    }
​
​
 private void startOtherServices(@NonNull TimingsTraceAndSlog t)(){
     //AMS  回调里面启动SystemUI
      mActivityManagerService.systemReady(() -> {
         try {
            //启动systemUI
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
      }
 }
​

SystemUI 启动

 //在这里启动了  SystemUIService  具体流程参考 https://juejin.cn/post/7341323705022201897
private static void startSystemUi(Context context, WindowManagerService windowManager) {
        PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
        Intent intent = new Intent();
       // core/res/res/values/config.xml
        intent.setComponent(pm.getSystemUiServiceComponent());
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        context.startServiceAsUser(intent, UserHandle.SYSTEM);
        windowManager.onSystemUiStarted();
    }
​
​
  <string name="config_systemUIServiceComponent" translatable="false"
            >com.android.systemui/com.android.systemui.SystemUIService</string>

Lanucher的启动(再准确说匹配Home的启动)

//services/core/java/com/android/server/wm/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
    //省略。。。
     if (bootingSystemUser) {
                t.traceBegin("startHomeOnAllDisplays");
                mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
                t.traceEnd();
            }
​
   //省略。。。
 }
​
​
​
-->//com.android.server.wm.RootWindowContainer
  RootWindowContainer.startHomeOnAllDisplays();
  -->startHomeOnDisplay()
     -->startHomeOnTaskDisplayArea(){
    //该方法里intent 设置了 addCategory CATEGORY_HOME action 为 ACTION_MAIN
       homeIntent = mService.getHomeIntent();
      //启动lanuch3 这里和启动其他应用一致 启动过程会涉及splash homeBack 等 主要依赖匹配去启动
      mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
                taskDisplayArea);
  }
​
​
​
​
​
//启动 
ActivityTaskManagerService.getHomeIntent(){
  // String mTopAction = Intent.ACTION_MAIN;
     Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
        intent.setComponent(mTopComponent);
        intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
        if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            
            intent.addCategory(Intent.CATEGORY_HOME);
        }
        return intent;
  
}
​
​
​
​

Launcher的xml

<activity
            android:name="com.android.launcher3.Launcher"
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:windowSoftInputMode="adjustPan"
            android:screenOrientation="unspecified"
            android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize|density"
            android:resizeableActivity="true"
            android:resumeWhilePausing="true"
            android:taskAffinity=""
            android:exported="true"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY"/>
                <category android:name="android.intent.category.LAUNCHER_APP" />
            </intent-filter>
            <meta-data
                android:name="com.android.launcher3.grid.control"
                android:value="${packageName}.grid_control" />
        </activity>

最后放一张我自己理解记忆的图

启动流程梳理.png