總流程圖
- Instrumentation
負責調用Activity和Application生命週期。 - ActivityTaskManagerService
負責Activity管理和調度等工作。android10中新增的 - ActivityManagerService
負責管理四大組件和進程,包括生命週期和狀態切換。 - ActivityTaskManagerInternal
ActivityTaskManagerService對外提供的一個抽象類,真正的實現在ActivityTaskManagerService#LocalService - ActivityThread
管理應用程序進程中主線程的執行 - ActivityStackSupervisor
負責所有Activity棧的管理 - TransactionExecutor
主要作用是執行ClientTransaction - ClientLifecycleManager
生命週期的管理調用
客戶端和服務端IPC通信
1.基於Android10的IPC
上篇文章Activity啓動流程-基於Android10(一)已經講到了 Instrumentation的execStartActivity方法。其實Android10版本和之前版本的代碼是有區別。
execStartActivity:
frameworks\base\core\java\android\app\Instrumentation.java
@UnsupportedAppUsage
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String resultWho,
Intent intent, int requestCode, Bundle options, UserHandle user) {
//...省略部分代碼
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
// 重要代碼
int result = ActivityTaskManager.getService()
.startActivityAsUser(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, resultWho,
requestCode, 0, null, options, user.getIdentifier());
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
//...省略部分代碼
代碼調用了ActivityTaskManager的getService方法,讓我們看下里面的邏輯處理
frameworks\base\core\java\android\app\ActivityTaskManager.java
/** @hide */
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
@UnsupportedAppUsage(trackingBug = 129726065)
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
};
(關於Singleton類的講解可以參考我的這篇文章Android源碼隨心看系列:Singleton)
通過代碼可以看出getService是獲取了IActivityTaskManager.aidl接口,那麼是哪個類實現了這個接口呢?答案是ActivityTaskManangerService。代碼如下:
frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.java
// ActivityTaskManagerService繼承IActivityTaskManager.Stub
// IActivityTaskManager.Stub是Android根據aidl文件生成的java代碼
public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM;
private static final String TAG_STACK = TAG + POSTFIX_STACK;
private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
//...省略部分代碼
int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
boolean validateIncomingUser) {
enforceNotIsolatedCaller("startActivityAsUser");
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId)
.execute();
}
//...省略部分代碼
最後調用的是ActivityTaskManagerService中的startActivityAsUser方法。通過分析可以知道了IActivityTaskManager.aidl就是Activity和ActivityTaskManagerService之間的橋樑。Activity的startActivity最終是調用了ActivityTaskManagerService中的startActivityAsUser方法
簡化流程示意圖:
Activity .javaActivityTaskManagerService.java
2.基於Android10以下的IPC
以上講的是基於Android10的IPC,低於Android10的版本的IPC在細節上有些不一樣,但是本質上是相同的。
還是回到execStartActivity方法:
frameworks\base\core\java\android\app\Instrumentation.java
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
...
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
// 重要代碼
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
老版本用的是ActivityManager類,但是代碼結構和Android10的ActivityTaskManager是一致。
ActivityManager:
platform\frameworks_base\core\java\android\app\ActivityManager.java
/**
* @hide
*/
@UnsupportedAppUsage
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static IActivityTaskManager getTaskService() {
return ActivityTaskManager.getService();
}
@UnsupportedAppUsage
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
// 這裏的IBinder其實是IActivityManager.aidl接口
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
老版本用的是IActivityManager.aidl做IPC通訊的。大名鼎鼎的ActivityManagerService繼承IActivityManger.aidl接口。所以老版本(Android 8.0及其以上)用IActivityManger做爲IPC接口
簡化流程示意圖:
Activity .javaActivityManagerService.java