序文
トップレベルのアプリケーション開発者の場合、多くの人はアクティビティが 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 がアクティビティを開始し、アプリケーションの起動が完了します。