日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

發布時間:2025/6/17 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 插件化系列文章目錄

【Android 插件化】插件化簡介 ( 組件化與插件化 )
【Android 插件化】插件化原理 ( JVM 內存數據 | 類加載流程 )
【Android 插件化】插件化原理 ( 類加載器 )

【Android 插件化】“ 插樁式 “ 插件化框架 ( 原理與實現思路 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 類加載器創建 | 資源加載 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 獲取插件入口 Activity 組件 | 加載插件 Resources 資源 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 運行應用 | 代碼整理 )

【Android 插件化】Hook 插件化框架 ( Hook 技術 | 代理模式 | 靜態代理 | 動態代理 )
【Android 插件化】Hook 插件化框架 ( Hook 實現思路 | Hook 按鈕點擊事件 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動過程 | 靜態代理 )
【Android 插件化】Hook 插件化框架 ( 從 Hook 應用角度分析 Activity 啟動流程 一 | Activity 進程相關源碼 )
【Android 插件化】Hook 插件化框架 ( 從 Hook 應用角度分析 Activity 啟動流程 二 | AMS 進程相關源碼 | 主進程相關源碼 )


文章目錄

  • Android 插件化系列文章目錄
  • 前言
  • 一、ActivityManagerService 進程相關源碼
    • 1、ActivityManagerService 源碼分析
    • 2、ActivityStarter 源碼分析
      • a、obtainStarter 方法分析
      • b、execute 方法分析
      • c、startActivityMayWait 方法分析
      • d、startActivity 方法分析
      • e、startActivityUnchecked 方法分析
    • 3、ActivityStackSupervisor 源碼分析
    • 4、ActivityStack 源碼分析
      • a、resumeTopActivityUncheckedLocked 方法分析
      • b、resumeTopActivityInnerLocked 方法分析
      • c、startPausingLocked 方法分析
      • d、繼續回到 resumeTopActivityInnerLocked 方法分析
    • 4、后續 ActivityStackSupervisor 源碼分析
  • 二、ActivityThread 主進程相關源碼
  • 三、博客資源


前言

上一篇博客 【Android 插件化】Hook 插件化框架 ( 從 Hook 應用角度分析 Activity 啟動流程 一 | Activity 進程相關源碼 ) 分析了 Activity 啟動流程中 , Activity 進程中相關調用鏈涉及的源碼 ;

本博客中著重分析 AMS 中涉及到的源碼 和 AMS 啟動主進程 Activity 源碼 ;






一、ActivityManagerService 進程相關源碼




1、ActivityManagerService 源碼分析


在 Instrumentation 的 execStartActivity 方法中 , 最核心的代碼是

int result = ActivityTaskManager.getService().startActivity(whoThread,who.getBasePackageName(), who.getAttributionTag(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()), token,target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);

先通過 ActivityTaskManager.getService() 獲取服務 ,

public class ActivityTaskManager {/** @hide */public static IActivityTaskManager getService() {return IActivityTaskManagerSingleton.get();}@UnsupportedAppUsage(trackingBug = 129726065)private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =new Singleton<IActivityTaskManager>() {@Overrideprotected IActivityTaskManager create() {final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);return IActivityTaskManager.Stub.asInterface(b);}}; }

調用 IActivityTaskManagerSingleton.get() 方法 , 就是調用 IActivityTaskManagerSingleton 的 create 方法 , 返回如下結果

final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); return IActivityTaskManager.Stub.asInterface(b);

該 IActivityTaskManager 沒有找到對應 Java 代碼 , 是 AIDL 文件 ; 返回的結果是 Binder 的代理類 , 該類主要作用是使用了 Binder 機制 , 進行進程間通信 ;

獲取的遠程服務是 ActivityManagerService , 在 Instrumentation 中調用 ActivityTaskManager.getService().startActivity() 方法 , 就是調用 AMS ( ActivityManagerService ) 的 startActivity 方法 , 最終調用的是 AMS 的 startActivityAsUser 方法 , 在該方法中調用了 ActivityStartController mActivityStartController 成員的 obtainStarter 方法 ,

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {private final ActivityStartController mActivityStartController;@Overridepublic final int startActivity(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,resultWho, requestCode, startFlags, profilerInfo, bOptions,UserHandle.getCallingUserId());}@Overridepublic final int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,true /*validateIncomingUser*/);}public final 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("startActivity");userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");// TODO: Switch to user app stacks here.return mActivityStartController.obtainStarter(intent, "startActivityAsUser").setCaller(caller).setCallingPackage(callingPackage).setResolvedType(resolvedType).setResultTo(resultTo).setResultWho(resultWho).setRequestCode(requestCode).setStartFlags(startFlags).setProfilerInfo(profilerInfo).setActivityOptions(bOptions).setMayWait(userId).execute();} }

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


2、ActivityStarter 源碼分析


/frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java


a、obtainStarter 方法分析


調用 ActivityStartController 的 obtainStarter 方法 , 得到的是 ActivityStarter 方法 , Activity 的啟動是由該 ActivityStarter 來完成的 ;

public class ActivityStartController {/*** @return A starter to configure and execute starting an activity. It is valid until after* {@link ActivityStarter#execute} is invoked. At that point, the starter should be* considered invalid and no longer modified or used.*/ActivityStarter obtainStarter(Intent intent, String reason) {return mFactory.obtain().setIntent(intent).setReason(reason);} }

b、execute 方法分析


Activity 啟動過程很復雜 , 封裝在 ActivityStarter 類中 , 該類有 270027002700 行代碼 , 也是個重量級的類 , 因此沒有在 ActivityManagerService 中定義 , 而是拆分出來 , 進行處理 ;

class ActivityStarter {/*** Starts an activity based on the request parameters provided earlier.* @return The starter result.*/int execute() {try {// TODO(b/64750076): Look into passing request directly to these methods to allow// for transactional diffs and preprocessing.if (mRequest.mayWait) {return startActivityMayWait(mRequest.caller, mRequest.callingUid,mRequest.callingPackage, mRequest.intent, mRequest.resolvedType,mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,mRequest.inTask, mRequest.reason,mRequest.allowPendingRemoteAnimationRegistryLookup);} else {return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo,mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,mRequest.resultWho, mRequest.requestCode, mRequest.callingPid,mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid,mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions,mRequest.ignoreTargetSecurity, mRequest.componentSpecified,mRequest.outActivity, mRequest.inTask, mRequest.reason,mRequest.allowPendingRemoteAnimationRegistryLookup);}} finally {onExecutionComplete();}} }

c、startActivityMayWait 方法分析


如果需要等待 , 則調用 ActivityStarter 的 startActivityMayWait 方法 , 在該方法中需要獲取調用的 進程 ID , 用戶 ID ,

final int realCallingPid = Binder.getCallingPid();final int realCallingUid = Binder.getCallingUid();

然后 Activity 任務棧管理者 mSupervisor 解析 Intent , 將解析的信息放在 ResolveInfo rInfo 中 ;

ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,0 /* matchFlags */,computeResolveFilterUid(callingUid, realCallingUid, mRequest.filterCallingUid));

通過 Activity 任務棧管理者 mSupervisor 解析 Activity , 將獲取的 Activity 信息放在 ActivityInfo aInfo 中 ;

// Collect information about the target of the Intent.ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);

最后 , 調用 ActivityStarter 的 startActivity 方法 , 進行界面啟動 ;

int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,allowPendingRemoteAnimationRegistryLookup);

d、startActivity 方法分析


ActivityStarter 中的 startActivity 方法參數較多 , 有十幾個 ;

private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,String callingPackage, int realCallingPid, int realCallingUid, int startFlags,SafeActivityOptions options,boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) {return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,true /* doResume */, checkedOptions, inTask, outActivity); }

在該方法的最后調用了 startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask, outActivity) 方法 ,

private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) { }

在上述參數較少的 startActivity 方法中 , 調用了 startActivityUnchecked 方法 ;

// Note: This method should only be called from {@link startActivity}.private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {

e、startActivityUnchecked 方法分析


在 ActivityStarter 中的 startActivityUnchecked 方法中 , 進行啟動之前的初始化操作 , 如分析啟動模式 LaunchMod , 解析設置的 Activity 啟動標志位 Flag 等 ;

該方法中執行 Activity 啟動前的操作 ;

// Note: This method should only be called from {@link startActivity}.private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,voiceInteractor);computeLaunchingTaskFlags();computeSourceStack();mIntent.setFlags(mLaunchFlags);ActivityRecord reusedActivity = getReusableIntentActivity(); }

期間調用了 ActivityStarter 類的 private final ActivityStackSupervisor mSupervisor 成員的 resumeFocusedStackTopActivityLocked 方法 ;

mSupervisor.resumeFocusedStackTopActivityLocked();

/frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java


3、ActivityStackSupervisor 源碼分析


ActivityStackSupervisor 的 resumeFocusedStackTopActivityLocked() 方法中 ,

調用了 boolean resumeFocusedStackTopActivityLocked( ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) 方法 ,

在該方法中 , 判斷當前的狀態是否是 Resume 狀態 , 如果不是 , 則調用 ActivityStack mFocusedStack 成員的 resumeTopActivityUncheckedLocked 方法 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {/** The stack currently receiving input or launching the next activity. */ActivityStack mFocusedStack;boolean resumeFocusedStackTopActivityLocked() {return resumeFocusedStackTopActivityLocked(null, null, null);}boolean resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {if (!readyToResume()) {return false;}if (targetStack != null && isFocusedStack(targetStack)) {return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);}final ActivityRecord r = mFocusedStack.topRunningActivityLocked();if (r == null || !r.isState(RESUMED)) {mFocusedStack.resumeTopActivityUncheckedLocked(null, null);} else if (r.isState(RESUMED)) {// Kick off any lingering app transitions form the MoveTaskToFront operation.mFocusedStack.executeAppTransition(targetOptions);}return false;} }

/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java


4、ActivityStack 源碼分析



a、resumeTopActivityUncheckedLocked 方法分析


上面分析到 Activity 調用 startActivity 調用的是 ActivityStack 的 resumeTopActivityUncheckedLocked 方法 , 在該方法中調用了 resumeTopActivityInnerLocked 方法 ;

/*** Ensure that the top activity in the stack is resumed.** @param prev The previously resumed activity, for when in the process* of pausing; can be null to call from elsewhere.* @param options Activity options.** @return Returns true if something is being resumed, or false if* nothing happened.** NOTE: It is not safe to call this method directly as it can cause an activity in a* non-focused stack to be resumed.* Use {@link ActivityStackSupervisor#resumeFocusedStackTopActivityLocked} to resume the* right activity for the current system state.*/@GuardedBy("mService")boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {if (mStackSupervisor.inResumeTopActivity) {// Don't even start recursing.return false;}boolean result = false;try {// Protect against recursion.mStackSupervisor.inResumeTopActivity = true;result = resumeTopActivityInnerLocked(prev, options);// When resuming the top activity, it may be necessary to pause the top activity (for// example, returning to the lock screen. We suppress the normal pause logic in// {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the// end. We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here// to ensure any necessary pause logic occurs. In the case where the Activity will be// shown regardless of the lock screen, the call to// {@link ActivityStackSupervisor#checkReadyForSleepLocked} is skipped.final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);if (next == null || !next.canTurnScreenOn()) {checkReadyForSleep();}} finally {mStackSupervisor.inResumeTopActivity = false;}return result;}

/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java


b、resumeTopActivityInnerLocked 方法分析


在 ActivityStack 中的 resumeTopActivityInnerLocked 方法中調用了 startPausingLocked 方法 ;

class ActivityStack<T extends StackWindowController> extends ConfigurationContainerimplements StackWindowListener {/** Run all ActivityStacks through this */protected final ActivityStackSupervisor mStackSupervisor;@GuardedBy("mService")private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {if (mResumedActivity != null) {if (DEBUG_STATES) Slog.d(TAG_STATES,"resumeTopActivityLocked: Pausing " + mResumedActivity);pausing |= startPausingLocked(userLeaving, false, next, false);}} }

/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

該方法的調用鏈很長 , 有幾百行代碼 ;


c、startPausingLocked 方法分析


startPausingLocked 方法中 , 調用了 mService.getLifecycleManager().scheduleTransaction 方法 , 該方法用于控制 Activity 聲明周期的方法 , 其中涉及 PauseActivityItem 參數 , 說明要執行的是 Activity 的 onPause 生命周期方法 ;

/*** Start pausing the currently resumed activity. It is an error to call this if there* is already an activity being paused or there is no resumed activity.** @param userLeaving True if this should result in an onUserLeaving to the current activity.* @param uiSleeping True if this is happening with the user interface going to sleep (the* screen turning off).* @param resuming The activity we are currently trying to resume or null if this is not being* called as part of resuming the top activity, so we shouldn't try to instigate* a resume here if not null.* @param pauseImmediately True if the caller does not want to wait for the activity callback to* complete pausing.* @return Returns true if an activity now is in the PAUSING state, and we are waiting for* it to tell us when it is done.*/final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,ActivityRecord resuming, boolean pauseImmediately) {mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,PauseActivityItem.obtain(prev.finishing, userLeaving,prev.configChangeFlags, pauseImmediately));}

注意 PauseActivityItem 專門用于處理 Activity Pause 生命周期 ;
/frameworks/base/core/java/android/app/servertransaction/PauseActivityItem.java

PauseActivityItem 繼承了 ActivityLifecycleItem ,
/frameworks/base/core/java/android/app/servertransaction/ActivityLifecycleItem.java

ActivityLifecycleItem 繼承了 ClientTransactionItem , ClientTransactionItem 會被 TransactionExecutor 執行 ,
/frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java

執行 PauseActivityItem 后 , 會自動調用 ActivityThread 主線程的 handlePauseActivity 方法 ;
/frameworks/base/core/java/android/app/ActivityThread.java


PauseActivityItem 的 execute 方法就是上述控制 onResume 生命周期函數觸發的方法 ;

第一個參數 ClientTransactionHandler client , ActivityThread 繼承了 ClientTransactionHandler 接口 , 這里的第一個參數是 ActivityThread 主線程 ;

此處調用的 ActivityThread 的 handlePauseActivity 方法 ;

public class PauseActivityItem extends ActivityLifecycleItem {private static final String TAG = "PauseActivityItem";private boolean mFinished;private boolean mUserLeaving;private int mConfigChanges;private boolean mDontReport;@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,"PAUSE_ACTIVITY_ITEM");Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);} }

d、繼續回到 resumeTopActivityInnerLocked 方法分析


在 ActivityStack 中的 resumeTopActivityInnerLocked 方法中調用了 startPausingLocked 方法 , 其作用是觸發上一個 Activity 的 Resume 生命周期 ;

在該 resumeTopActivityInnerLocked 方法的最后 , 調用了 ActivityStackSupervisor mStackSupervisor 成員的 startSpecificActivityLocked 方法 ;

class ActivityStack<T extends StackWindowController> extends ConfigurationContainerimplements StackWindowListener {/** Run all ActivityStacks through this */protected final ActivityStackSupervisor mStackSupervisor;@GuardedBy("mService")private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {if (mResumedActivity != null) {if (DEBUG_STATES) Slog.d(TAG_STATES,"resumeTopActivityLocked: Pausing " + mResumedActivity);pausing |= startPausingLocked(userLeaving, false, next, false);}mStackSupervisor.startSpecificActivityLocked(next, true, false);} }

/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java


4、后續 ActivityStackSupervisor 源碼分析


在 ActivityStackSupervisor 中的 startSpecificActivityLocked 方法中 , 調用的 realStartActivityLocked 方法是核心方法 , 在 realStartActivityLocked 方法中 , 獲取到 LaunchActivityItem 后 , 傳遞給 clientTransaction , 去執行啟動 Activity 的邏輯 ;

LaunchActivityItem 是要啟動的目標 Activity ;

void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {realStartActivityLocked(r, app, andResume, checkConfig);}final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {// Create activity launch transaction.final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,r.appToken);clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,r.persistentState, results, newIntents, mService.isNextTransitionForward(),profilerInfo)); }

/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

LaunchActivityItem 繼承了 ClientTransactionItem , ClientTransactionItem 是 ActivityThread ;
/frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java

在 LaunchActivityItem 中的 execute 方法 , 就是調用 ClientTransactionHandler client 參數的 handleLaunchActivity 方法 ;
其中 ClientTransactionHandler client 參數就是 ActivityThread ;

public class LaunchActivityItem extends ClientTransactionItem {@Overridepublic void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,mPendingResults, mPendingNewIntents, mIsForward,mProfilerInfo, client);client.handleLaunchActivity(r, pendingActions, null /* customIntent */);Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);} }

/frameworks/base/core/java/android/app/servertransaction/LaunchActivityItem.java





二、ActivityThread 主進程相關源碼



在 ActivityThread 的 handleLaunchActivity 方法中 , 在該方法中調用了 performLaunchActivity 方法 ;

/*** Extended implementation of activity launch. Used when server requests a launch or relaunch.*/@Overridepublic Activity handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent) {// If we are getting ready to gc after going to the background, well// we are back active so skip it.unscheduleGcIdler();mSomeActivitiesChanged = true;if (r.profilerInfo != null) {mProfiler.setProfiler(r.profilerInfo);mProfiler.startProfiling();}// Make sure we are running with the most recent config.handleConfigurationChanged(null, null);if (localLOGV) Slog.v(TAG, "Handling launch of " + r);// Initialize before creating the activityif (!ThreadedRenderer.sRendererDisabled) {GraphicsEnvironment.earlyInitEGL();}WindowManagerGlobal.initialize();final Activity a = performLaunchActivity(r, customIntent);if (a != null) {r.createdConfig = new Configuration(mConfiguration);reportSizeConfigurations(r);if (!r.activity.mFinished && pendingActions != null) {pendingActions.setOldState(r.state);pendingActions.setRestoreInstanceState(true);pendingActions.setCallOnPostCreate(true);}} else {// If there was an error, for any reason, tell the activity manager to stop us.try {ActivityManager.getService().finishActivity(r.token, Activity.RESULT_CANCELED, null,Activity.DONT_FINISH_TASK_WITH_ACTIVITY);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}}return a;}

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

在 performLaunchActivity 方法中調用了 Instrumentation 的 newActivity 方法 , 創建了一個新的 Activity 實例 ;

public final class ActivityThread extends ClientTransactionHandler {/** Core implementation of activity launch. */private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo = r.activityInfo;activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);} }



三、博客資源



博客資源 :

  • GitHub : https://github.com/han1202012/Plugin_Hook

總結

以上是生活随笔為你收集整理的【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。