Android システム起動プロセス-----アクティビティ起動プロセス

序文

トップレベルのアプリケーション開発者の場合、多くの人はアクティビティが ActivityThread から始まることだけを知っており、フレームワークの具体的な呼び出しプロセスを知りません。今回はランチャーアイコンをクリックするところから詳しく解説していきます。
ここに画像の説明を挿入します
アクティビティ:
startActivity –> startActivityForResult –> mParent.startActivityFromChild –>
(Instrumentation に来る) mInstrumentation.execStartActivity –>ActivityManager.getService().startActivity –> (windowmanagerService に来る)
windowmanagerService.startActivity –>

1.frameworks/base/core/java/android/app/Activity.java

luancher からアプリケーション アイコンをクリックすると、最終的にアクティビティの startActivity に移動します。一連のメソッド呼び出しの後: startActivity –> startActivityForResult –> mParent.startActivityFromChild –> mInstrumentation.execStartActivity

2.frameworks/base/core/java/android/app/Instrumentation.java


Instrumentation.execStartActivity は、ServiceManager からバインダー プロキシ クラス ServiceManagerProxy を取得します。このプロキシ クラスは 、最終的に ActivityManagerService でstartActivityを呼び出します。この時点で、ランチャー プロセスから system_Server プロセスに渡されます。 who); int result = ActivityManager.getService() .startActivity(whoThread, who.getBasePackageName(),tent, tent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0、null、オプション); checkStartActivityResult(結果、意図); } catch (RemoteException e) { throw new RuntimeException(“システムからの障害”, e); }










3.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

ActivityManagerService は最初にユーザーの権限を確認し、アクティビティが存在するプロセスが作成されているかどうかを確認します。作成されていない場合は、プロセスをフォークするように zygote プロセスに通知するソケット メッセージが作成されます。
フォークが成功したら、新しいプロセスの activityThread–>main メソッドを起動して開始します。

4.frameworks/base/core/java/android/app/ActivityThread.java

activityThread のメインメソッド で、attachApplication を介して ApplicationThread を ActivityManagerService にバインド
ます




5.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public Final voidattachApplication(IApplicationThread thread) { synchronized (this) { int callPid = Binder.getCallingPid(); Final long origId = Binder.clearCallingIdentity(); attachApplicationLocked(スレッド、callingPid); Binder.restoreCallingIdentity(origId); ActivityManagerService 会调用attachApplicationLocked,変更方法会通过thread.bindApplication初期化应用if (app.instr != null) { thread.bindApplication ( processName, appInfo, provideds, app.instr.mClass, profilerInfo, app.instr.mArguments, app.instr.mWatcher、app.instr.mUiAutomationConnection、testMode、mBinderTransactionTrackingEnabled、enableTrackAllocation、















|| 制限付きバックアップモード || !normalMode、app.persistent、
new Configuration(getGlobalConfiguration())、app.compat、
getCommonServicesLocked(app.isoulated)、
mCoreSettingsObserver.getCoreSettingsLocked()、
buildSerial);
} else { thread.bindApplication(processName, appInfo, Providers, null, profilerInfo, null, null, null, testMode, mBinderTransactionTrackingEnabled,enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent, new Configuration(getGlobalConfiguration()), app.compat 、getCommonServicesLocked(app.isoulated)、mCoreSettingsObserver.getCoreSettingsLocked()、buildSerial); if (normalMode) { try {











if (mStackSupervisor.attachApplicationLocked(app)) { DidSomething = true; } } catch (Exception e) { Slog.wtf(TAG, "例外がスローされた起動アクティビティ in " + app, e); badApp = true; } }そして、 mStackSupervisor.attachApplicationLocked–> realStartActivityLocked–>app.thread.scheduleLaunchActivityを呼び出す一連のメソッドによって、scheduleLaunchActivity がアクティビティを開始し、アプリケーションの起動が完了します。









おすすめ

転載: blog.csdn.net/L779442863/article/details/124884739