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つの変数 を初期化しています.
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; }
Initプロセスはユーザー空間が起動した最初のプロセスであり、initは:initを解析する.rcファイル->サービスオブジェクトの作成->サービス.start()->fork()->execve()zygoteプロセスを開始する
2.zygote起動(app_main.cpp)
zygoteのmain()関数では主に以下のことをしました.
ここでは最後のステップに重点を置き、start()関数のいくつかの重要なステップは次のとおりです.
3.ZygoteInit初期化
4.SystemServer起動
SytemServer.main() -> SystemServer.run() :
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() ,