自從讀過Android內核剖析這本書之後,對整個安卓的系統有了更深的認識和理解,前面寫了3篇文章(深入PMS源碼)分析了PMS的相關代碼,之後會將相關知識都整理在博客上,本篇開始將從源碼角度分析AMS的執行邏輯,AMS作爲Android的核心服務,瞭解其內部流程會讓開發者對程序的執行有更深刻的認識,主要的流程邏輯放在下一篇中分析,這裏先分析下基礎部分便於更好的理解之後的內容;
1、AMS重要數據結構
- Activity棧模型
- 每個活動Activity在AMS中都會創建對應的ActivityRecord對象;
- 這些ActivityRecord對象被管理在各自的任務棧中,每個TaskStack可以添加多了任務對象;
- 所有的TaskStack都被ActivityStack統一管理,負責TaskStack的順序、入棧和出棧;
- ActivityRecord:記錄所有Activity的信息,屬性如下:
- service:ActivityManagerService的引用
- info:Activity註冊的全部信息
- appInfo:此活動對應的應用程序信息
- launchedFromPackage:啓動此Activity程序對應的包名
- app:所在進程信息ProcessRecord對象
- launchMode:啓動模式
- task:此Activity所屬的任務棧,TaskRecord
- taskAffinity:Activity設置的歸屬棧名稱
- packageName:包含Activity的包名
- processName:程序的進程名稱
- userId:當前活動運行所在的用戶ID
- ActivityRecord resultTo:此活動需要回複數據的ActivityRecord對象
- requestCode:請求的狀態碼
- Bundle icicle:保存Activity的數據
- state:Activity的當前狀態
- icon:應用程序圖標Icon
- logo:應用程序圖標Logo
- theme:應用程序圖標theme
- labelRes:應用程序圖標labelRes
- TaskRecord:Activity所屬的任務棧
- AMS中使用任務棧記錄每個Activity的狀態和啓動順序,使每個Activity都有各自的任務棧,在執行啓動和退出時可以在棧中有序進行;
- 默認A啓動新的ActivityB,那新的B就加入A所在的任務棧中;
- TaskRecord屬性:
- taskId:任務棧的Id,唯一標誌
- affinity:任務棧的傾向性名稱
- intent:啓動這個棧的Intent意圖
- userId:此棧所屬的用戶ID
- mActivities:任務棧中所有的Activity信息
- mStack:當前的棧所屬的管理類ActivityStack對象
- mService:保存AMS引用
- ActivityStack:Activity的棧管理類,管理進程中所有的TaskRecord對象
- mService:AMS引用
- mWindowManager:WMS引用
- ArrayList mTaskHistory:所有的活動歷史記錄棧,集合中最頂的棧爲當前棧
- mLRUActivities:保存最近最少使用的活動
- mPausingActivity:保存正在暫停的Activity
- mLastPausedActivity:最近一個已經Paused狀態的活動
- mResumedActivity:當前正在運行的活動
- mLastNoHistoryActivity:最近一個NoHistory的活動
- mStackId:棧管理的id
- mHandler:ActivityStackHandler對象,執行Handler消息事件
2、AMS的啓動過程
AMS作爲系統的主要服務,也是在Android系統啓動後由系統來啓動,由Android系統啓動過程知道系統啓動服務通過SystemServer完成,在SystemServer中調用startBootstrapServices()啓動核心服務,AMS也是在此方法中完成啓動
private void startBootstrapServices() {
559 mActivityManagerService = mSystemServiceManager.startService(
560 ActivityManagerService.Lifecycle.class).getService(); //1、使用SystemServiceManager創建AMS對象
561 mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //賦值AMS中mSystemServiceManager
562 mActivityManagerService.setInstaller(installer); //賦值AMS中的installer
}
上面的代碼也是在Android系統啓動過程中出現過的,使用SystemServiceManager.startService()方法,傳入ActivityManagerService.Lifecycle.class啓動服務,由前面的學習知道startService()方法中會創建Lifecycle對象,並調用onStart()方法
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context); // 1、創建AMS對象
}
@Override
public void onStart() {
mService.start(); // 2、執行start()方法
}
public ActivityManagerService getService() { // 3、返回AMS對象
return mService;
}
}
在Lifecycle的構造函數中直接創建ActivityManagerService對象,然後調用ActivityManagerService.start()方法
- ActivityManagerService構造函數
public ActivityManagerService(Context systemContext) {
mSystemThread = ActivityThread.currentActivityThread(); // 1、獲取ActivityThread實例
mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper()); // 2、使用HandlerThread初始化一個線程和Handler對象
mProcStartHandlerThread = new ServiceThread(TAG + ":procStart”, // 3、初始化用於進程啓動的ProcStartHandle對象
THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
mProcStartHandlerThread.start();
mProcStartHandler = new Handler(mProcStartHandlerThread.getLooper());
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
sKillThread.start();
sKillHandler = new KillHandler(sKillThread.getLooper()); // 4、初始化用於殺死進程的sKillHandler對象
}
mServices = new ActiveServices(this);
mProviderMap = new ProviderMap(this); // 初始化屬性
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system”); // 創建/system/文件夾
systemDir.mkdirs();
mLifecycleManager = new ClientLifecycleManager();//初始化ClientLifecycleManager對象
mProcessCpuThread = new Thread("CpuTracker") {。。。。。。} // 創建mProcessCpuThread線程
}
在實例化ActivityManagerService對象時,主要執行以下操作:
- 調用ActivityThread.currentActivityThread()獲取ActivityThread對象,此對象在ActivityThread中創建;
- 使用HandlerThread初始化工作線程和Handler對象;
- 初始化用於進程啓動的線程和ProcStartHandle對象;
- 創建用於殺死進程的sKillHandler對象;
- 初始化屬性信息和創建文件夾;
- 創建用於生命週期管理的ClientLifecycleManager對象;
- 創建mProcessCpuThread線程;
- AMS.start()
private void start() {
mProcessCpuThread.start(); // 1、
mBatteryStatsService.publish();
mAppOpsService.publish(mContext); //
LocalServices.addService(ActivityManagerInternal.class, new LocalService()); // 2、
try {
mProcessCpuInitLatch.await(); //3、
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted wait during start");
}
}
在start()方法中,首先啓動mProcessCpuThread線程,使用LocalServices註冊ActivityManagerInternal類型的LocalService對象,關於LocalServices它功能類似於ServiceManager,在內部使用靜態變量保存註冊的Class和對象的關係,在使用時直接獲取使用,不過它只能在相同線程中使用,最後調用使用CountDownLatch同步線程,等待mProcessCpuThread線程啓動完成;
3、AMS對Activity生命週期的管理
第二個部分主要介紹AMS是如何管理生命週期,如何回調生命週期方法的,在Android內核剖析書中主要針對Android 2.3版本,從其源碼中可以看出,當時的AMS中功能是十分臃腫的,而且對生命週期的回調也是直接調用的,代碼從理解上來說會不較容易,筆者在看完Android 2.3源碼後又學習的Android P的源碼,在Android P中將對生命週期的管理單獨抽取封裝成模塊,本片文章就看下Android P中的源碼,在AndroidP中執行程序的onPause()方法的過程被封裝成
mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
使用模版模式,將所有對生命週期的回調都封裝成統一的樣式,通過創建不同的對象達到不同的效果,在介紹上述代碼執行前先介紹下主要的幾個類;
- ActivityLifecycleItem
public abstract class ActivityLifecycleItem extends ClientTransactionItem {
@IntDef(prefix = { "UNDEFINED", "PRE_", "ON_" }, value = {
UNDEFINED,
PRE_ON_CREATE,
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_RESTART
})
@Retention(RetentionPolicy.SOURCE)
public @interface LifecycleState{} // 定義了生命週期狀態的註解
public static final int UNDEFINED = -1;
public static final int PRE_ON_CREATE = 0;
public static final int ON_CREATE = 1;
public static final int ON_START = 2;
public static final int ON_RESUME = 3;
public static final int ON_PAUSE = 4;
public static final int ON_STOP = 5;
public static final int ON_DESTROY = 6;
public static final int ON_RESTART = 7;
@LifecycleState
public abstract int getTargetState(); // 返回相應的狀態
@Override
public void recycle() { // 生命空的recycle()方法
}
}
在Android系統中將每個生命週期都抽象成單獨的Item,然後創建抽象的ActivityLifecycleItem類,在其中聲明方法週期註解、抽象方法和對應的常量,另外ActivityLifecycleItem繼承了ClientTransactionItem類,如果說ActivityLifecycleItem類是統一所有生命週期Item的Base類,那ClientTransactionItem就是定義瞭如何使用每個Item 的框架類;
- ClientTransactionItem
public class ClientTransaction implements Parcelable, ObjectPoolItem {
private List<ClientTransactionItem> mActivityCallbacks;
private ActivityLifecycleItem mLifecycleStateRequest; // 要執行的lifecycle
private IApplicationThread mClient; // 發起請求的Client
private IBinder mActivityToken;
// 1、獲取ClientTransaction對象
public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
if (instance == null) {
instance = new ClientTransaction();
}
instance.mClient = client;
instance.mActivityToken = activityToken;
return instance;
}
public void setLifecycleStateRequest(ActivityLifecycleItem stateRequest) {
mLifecycleStateRequest = stateRequest; // 2、設置執行生命週期對應的 Item
}
// 3、執行ClientTransaction對象的方法
public void schedule() throws RemoteException {
mClient.scheduleTransaction(this); //
}
}
@Override
public void recycle() { //4、
if (mActivityCallbacks != null) {
int size = mActivityCallbacks.size();
for (int i = 0; i < size; i++) {
mActivityCallbacks.get(i).recycle();
}
mActivityCallbacks.clear();
}
if (mLifecycleStateRequest != null) {
mLifecycleStateRequest.recycle();
mLifecycleStateRequest = null;
}
mClient = null;
mActivityToken = null;
ObjectPool.recycle(this);
}
上述代碼爲ClientTransaction中主要的功能部分:
- 獲取ClientTransaction對象,ClientTransaction內部使用對象緩存池ObjectPool緩存對象,同時保存mClient對象;
- 使用setLifecycleStateRequest()設置內部要執行的生命週期的Item對象,這裏類似於Okhttp中的Reuqest;
- 在schedule()方法中調用mClient.scheduleTransaction()中方法並傳入this對象,執行具體的任務;
- 在recycle()方法中清除當前對象的所有狀態和信息,然後緩存ClientTransaction對象;
上面的執行過程中除了創建對象、設置請求Request、回收對象真正執行任務是在Client中,這裏的Client是ApplicaitonThread對象中方法
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this); // 1、執行preExecute()
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); //2、發送事件執行transaction,在ActivityThread中
}
在scheduleTransaction()方法中首先調用transaction.preExecute()方法,preExecute會回調每個Item.preExecute(),主要做執行前的準備工作,然後調用sendMessage()發送時間消息,處理事件是在ActivityThread中
case EXECUTE_TRANSACTION:
final ClientTransaction transaction = (ClientTransaction) msg.obj;
mTransactionExecutor.execute(transaction) ; // 調用TransactionExecutor執行transaction對象
if (isSystem()) {
transaction.recycle(); // 釋放、回收資源
}
break;
在獲取到消息事件中的ClientTransaction對象後,調用TransactionExecutor中方法執行transaction對象,在execute()方法中會調用executeLifecycleState()
private void executeLifecycleState(ClientTransaction transaction) {
final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest(); // 1、獲取傳入的LifecycleItem
final IBinder token = transaction.getActivityToken();
final ActivityClientRecord r = mTransactionHandler.getActivityClient(token); // 2、獲取要執行的ActivityRecord
if (r == null) {
return;
}
cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
lifecycleItem.execute(mTransactionHandler, token, mPendingActions); // 3、執行LifecycleItem的execute()
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions); // 4、執行postExecute()回調通知執行結果
}
在executeLifecycleState()中首先獲取要執行的Request,其實獲取的就是要執行的生命週期的Item,然後執行Item的execute()和postExecute()方法,execute主要執行任務而postExecute在執行任務結束後回到結果,下面以Activity的onPause爲例
- PauseActivityItem
public class PauseActivityItem extends ActivityLifecycleItem { //
private boolean mFinished;
private boolean mUserLeaving;
private int mConfigChanges;
private boolean mDontReport;
@Override
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
"PAUSE_ACTIVITY_ITEM”); // 1、
}
@Override
public int getTargetState() {
return ON_PAUSE;
}
@Override
public void postExecute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
if (mDontReport) {
return;
}
try {
ActivityManager.getService().activityPaused(token); // 2
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
private PauseActivityItem() {}
public static PauseActivityItem obtain(boolean finished, boolean userLeaving, int configChanges,
boolean dontReport) {
PauseActivityItem instance = ObjectPool.obtain(PauseActivityItem.class);//使用對象池複用對象
if (instance == null) {
instance = new PauseActivityItem();
}
instance.mFinished = finished;
instance.mUserLeaving = userLeaving;
instance.mConfigChanges = configChanges;
instance.mDontReport = dontReport;
return instance;
}
@Override
public void recycle() {
super.recycle();
mFinished = false;
mUserLeaving = false;
mConfigChanges = 0;
mDontReport = false;
ObjectPool.recycle(this); // 回收對象
}
}
在PauseItem中主要執行以下邏輯:
1、生命週期回調框架會調用其execute(),在execute()中調用I ApplicationThread.handlePauseActivity()方法,處理方法暫停
2、在執行完Activity的pause之後會調用postExecute(),在postExecute中回調通知AMS.activityPaused(),通知AMS方法暫停完成;
mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
現在來解釋下開始時給出的代碼,使用的執行架構就是上面分析的內容,那getLifecycleManager()獲取的是什麼呢?獲取的其實是ClientLifecycleManager對象,就是AMS在構造函數中初始化的,ClientLifecycleManager的作用封裝了ClientTransaction
對象的創建、設置請求Request、schedule()執行、recycle()回收部分;
- ClientLifecycleManager
class ClientLifecycleManager {
// 使用此方法可以實現回調生命週期中的方法
void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken,
@NonNull ActivityLifecycleItem stateRequest) throws RemoteException {
final ClientTransaction clientTransaction = transactionWithState(client, activityToken,stateRequest);
scheduleTransaction(clientTransaction);
}
//根據請求的參數,封裝ClientTransaction對象
private static ClientTransaction transactionWithState(@NonNull IApplicationThread client,
@NonNull IBinder activityToken, @NonNull ActivityLifecycleItem stateRequest) {
final ClientTransaction clientTransaction = ClientTransaction.obtain(client, activityToken);
clientTransaction.setLifecycleStateRequest(stateRequest);
return clientTransaction;
}
// 執行具體的ClientTransaction對象
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
final IApplicationThread client = transaction.getClient();
transaction.schedule(); // 調用schedule()
if (!(client instanceof Binder)) {
transaction.recycle();//調用recycle()
}
}
}
在調用scheduleTransaction()傳入參數後,首先調用transactionWithState()使用參數創建ClientTransaction對象,然後調用scheduleTransaction(),在scheduleTransaction中觸發schedule的執行,然後系統就會執行相應的Item,在執行結束後調用recycle()回收對象;
上面就是AMS中數據結構和兩個基礎模塊的分析,下一篇文章將帶着這些基礎去分析AMS如何管理和調度Activity的。