Androidシステム起動プロセスまとめ

3211 ワード

1.initから(init.cpp)
Initプロセスはユーザー空間が起動した最初のプロセスであり、initは:initを解析する.rcファイル->サービスオブジェクトの作成->サービス.start()->fork()->execve()zygoteプロセスを開始する
2.zygote起動(app_main.cpp)
zygoteのmain()関数では主に以下のことをしました.
  • AppRuntime
  • の初期化
  • プロセス名「zygote」
  • AndroidRuntime.start()はZygoteInitクラスを起動し、Javaワールド(AppRuntimeはAndroidRuntimeのサブクラス)
  • に入る
    ここでは最後のステップに重点を置き、start()関数のいくつかの重要なステップは次のとおりです.
  • startVm()仮想マシンを起動し、各種仮想マシンのパラメータ
  • を構成する
  • startReg()大量native関数
  • を登録
  • JNIEven->CallStaticVoidMethod()ZygoteInitクラスのmain()関数
  • を呼び出す
    3.ZygoteInit初期化
  • ZygoteServerを作成し、Socketリスニング
  • を確立します.
  • preload()は、大量のクラスおよびリソースファイル
  • をプリロードする.
  • startSystemServer()は、1回のforkでsystem_を起動します.serverプロセス
  • ZygoteServerを通過します.runSelectLoop()クライアントによって開始されたSocket接続を処理する
  • startSystemServer()でforkアウトsystem_serverプロセスの後、handleSystemServerProcess()を呼び出し、最終的にRuntimeInitに移動します.zygoteInit()のブランチはいくつかの初期化の操作を行います
  • nativeZygoteInit() -> AndroidRuntime.com_android_internal_os_RuntimeInit_nativeZygoteInit() -> AppRuntim.onZygoteInit()binderスレッドプール
  • を起動
  • applicationInit()->invokeStaticMain()ここでのパラメータargvはZygoteInit.startSystemServer()が渡され、起動するJavaクラスはcom.android.server.SystemServer.しかし、ここではJavaクラスのmain()関数を直接呼び出すのではなく、メソッドの最後に異常Zygoteを投げ出す.MethodAndArgsCaller
  • ZygoteInit.main()メソッドZygote.MethodAndArgsCaller異常は、MethodAndArgsCallerのrun()メソッドを呼び出し、最終的に反射によりSystemServerを完了する.main()メソッドの呼び出しは、スタックフレームを空にし、スタックフレーム利用率
  • を向上させることを目的とする.
    4.SystemServer起動
    SytemServer.main() -> SystemServer.run() :
  • Looper.prepareMainLooper()
  • createSystemContext() ->ActivityThread.systemMain() ->ActivityThread.attach(true)(ここのbooleanパラメータはシステムプロセスかどうかを区別するために使用され、通常のアプリケーションプロセスが起動するとActivity Thread.main()->Activity Thread.が呼び出されます.attach(false):
  • ActivityThread.attach(true)キー部分コードは以下の通りで、主にmInstrumentationとmInitialApplicationの2つの変数
  • を初期化しています.
    mInstrumentation = new Instrumentation();
    ContextImpl context = ContextImpl.createAppContext(this, getSystemContext().mPackageInfo);
    mInitialApplication = context.mPackageInfo.makeApplication(true, null);
    mInitialApplication.onCreate();```
      * mSystemContext = activityThread.getSystemContext() -> ContextImpl.createSystemContext(),      :
    

    static ContextImpl createSystemContext(ActivityThread mainThread) { LoadedApk packageInfo = new LoadedApk(mainThread); ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY); context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetrics()); return context; }
    * startBootstrapServices() 、startCoreServices() 、startOtherServices()         ,        SystemServiceManager.startService()   ServiceManager.addService()       。          ,      SystemServiceManager.startBootPhase(int phase) -> service.onBootPhase(phase),      phase  ,        phase            。
      startOtherServices()    ,    ActivityManagerService.systemReady(),       startHomeActivityLocked()           app,    Lanuncher。
    * Looper.loop()    ,