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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )

發布時間:2025/6/17 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、ActivityThread 主函數啟動
  • 二、ActivityThread 綁定 ApplicationThread
  • 三、AMS attachApplication -> attachApplicationLocked 綁定 ApplicationThread
  • 四、ApplicationThread.bindApplication 綁定 ApplicationThread
  • 五、ActivityThread.H 處理 BIND_APPLICATION 消息
  • 六、ActivityThread.handleBindApplication 處理綁定問題
  • 七、LoadedApk.makeApplication 創建 Application 對象
  • 八、Instrumentation.newApplication 創建 Application 對象
  • 九、AppComponentFactory.instantiateApplicationCompat 創建 Application 對象





一、ActivityThread 主函數啟動



ActivityThread 是應用的主線程 , 從 main 函數開始執行 ;

Looper.prepareMainLooper() 將主線程設置為 Looper 線程 , 開啟 Looper , 用于配合 H 處理消息 ;

thread.attach(false, startSeq) 綁定 ActivityThread ;

在方法最后 Looper.loop(); 開始無限循環 , 處理 Handler 消息 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {public static void main(String[] args) {// 將主線程設置為 Looper 線程 , 開啟 Looper , 用于配合 H 處理消息 Looper.prepareMainLooper();// 創建 ActivityThread 實例對象 ActivityThread thread = new ActivityThread();// 綁定thread.attach(false, startSeq);// 開始無限循環 , 處理 Handler 消息 Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");} }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





二、ActivityThread 綁定 ApplicationThread



ActivityThread 中的 void attach(boolean system, long startSeq) 方法 , 主要是通過 Binder 機制獲取 AMS , 并調用 AMS 的 attachApplication 方法 , 為 ActivityThread 綁定 ApplicationThread ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {private void attach(boolean system, long startSeq) {sCurrentActivityThread = this;mSystemThread = system;if (!system) {RuntimeInit.setApplicationObject(mAppThread.asBinder());// 通過 Binder 機制獲取 AMS final IActivityManager mgr = ActivityManager.getService();try {// 調用 AMS 的 attachApplication 方法 , 為 ActivityThread 綁定 ApplicationThread mgr.attachApplication(mAppThread, startSeq);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}}}}

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





三、AMS attachApplication -> attachApplicationLocked 綁定 ApplicationThread



在 AMS 中的 attachApplication 方法中 , 調用了 attachApplicationLocked 方法 ,

在 attachApplicationLocked 方法中 , 有調用了 ActivityThread 的 bindApplication 方法 , 為 ActivityThread 綁定了 ApplicationThread ;

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {@Overridepublic final void attachApplication(IApplicationThread thread) {synchronized (this) {int callingPid = Binder.getCallingPid();final long origId = Binder.clearCallingIdentity();attachApplicationLocked(thread, callingPid);Binder.restoreCallingIdentity(origId);}}// 為 ApplicationThread 綁定 Application 主方法private final boolean attachApplicationLocked(IApplicationThread thread,int pid) {try {checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);// 在此處為 ActivityThread 綁定 Application , 此時又回到 ActivityThreadif (app.instr != null) {thread.bindApplication(processName, appInfo, providers,app.instr.mClass,profilerInfo, app.instr.mArguments,app.instr.mWatcher,app.instr.mUiAutomationConnection, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),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.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial);}} catch (Exception e) {}return true;}}

ActivityManagerService 完整源碼參考 : frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java





四、ApplicationThread.bindApplication 綁定 ApplicationThread



再次回到 ActivityThread 內部類 ApplicationThread 中 , 調用 ApplicationThread 類的 bindApplication 方法 , 即可為 ActivityThread 綁定 ApplicationThread , 在所有數據就位后 , 發送了一個 H.BIND_APPLICATION 消息 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {private class ApplicationThread extends IApplicationThread.Stub {// 為 ActivityThread 綁定 Application public final void bindApplication(String processName, ApplicationInfo appInfo,List<ProviderInfo> providers, ComponentName instrumentationName,ProfilerInfo profilerInfo, Bundle instrumentationArgs,IInstrumentationWatcher instrumentationWatcher,IUiAutomationConnection instrumentationUiConnection, int debugMode,boolean enableBinderTracking, boolean trackAllocation,boolean isRestrictedBackupMode, boolean persistent, Configuration config,CompatibilityInfo compatInfo, Map services, Bundle coreSettings,String buildSerial, boolean autofillCompatibilityEnabled) {// 此處在所有數據就位后 , 發送了一個 H.BIND_APPLICATION 消息sendMessage(H.BIND_APPLICATION, data);}} }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





五、ActivityThread.H 處理 BIND_APPLICATION 消息



在 ActivityThread.ApplicationThread.bindApplication 中 , 發送了一條 BIND_APPLICATION 消息 , 110110110 ;

在 ActivityThread.H 中的 handleMessage 方法中 , 處理 110110110 事件的分支中, 調用了 handleBindApplication 方法 , 處理綁定 ApplicationThread 相關邏輯 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {class H extends Handler {public static final int BIND_APPLICATION = 110;public void handleMessage(Message msg) {if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));switch (msg.what) {case BIND_APPLICATION:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");AppBindData data = (AppBindData)msg.obj;// 處理綁定 Application 相關邏輯handleBindApplication(data);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;}Object obj = msg.obj;if (obj instanceof SomeArgs) {((SomeArgs) obj).recycle();}}} }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





六、ActivityThread.handleBindApplication 處理綁定問題



在 ActivityThread.handleBindApplication 方法中 , 通過調用 data.info.makeApplication(data.restrictedBackupMode, null) 方法 , 創建 Application 實例對象 ;

data.info 是 LoadedApk 類型 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {private void handleBindApplication(AppBindData data) {// 將UI線程注冊為運行時的敏感線程。VMRuntime.registerSensitiveThread();if (data.trackAllocation) {DdmVmInternal.enableRecentAllocations(true);}// 記錄進程開始時間Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());// 允許在應用程序和提供程序安裝期間訪問磁盤。// 這可能會阻止處理有序的廣播,但稍后的處理可能最終會執行相同的磁盤訪問。Application app;final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();final StrictMode.ThreadPolicy writesAllowedPolicy = StrictMode.getThreadPolicy();try {// 如果要啟動應用程序進行完全備份或恢復,請使用基本應用程序類在受限環境中啟動。app = data.info.makeApplication(data.restrictedBackupMode, null);// Propagate autofill compat stateapp.setAutofillCompatibilityEnabled(data.autofillCompatibilityEnabled);mInitialApplication = app;} } }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





七、LoadedApk.makeApplication 創建 Application 對象



調用 LoadedApk 的 makeApplication 方法 , 創建 Application 實例 , 在該方法中通過調用 Instrumentation 的 newApplication 方法 , 創建 Application 實例對象

/*** 本地狀態維護了當前加載的.apk. * Local state maintained about a currently loaded .apk.* @hide*/ public final class LoadedApk {// 創建 Application 實例對象 public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) {// 如果當前存在 Application , 直接返回 if (mApplication != null) {return mApplication;}try {ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);// 通過調用 Instrumentation 的 newApplication 方法 , 創建 Application 實例對象app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);appContext.setOuterContext(app);} catch (Exception e) {}mActivityThread.mAllApplications.add(app);mApplication = app;return app;} }

完整代碼參考 /frameworks/base/core/java/android/app/LoadedApk.java ;





八、Instrumentation.newApplication 創建 Application 對象



在 LoadedApk 的 makeApplication 方法 中 , 調用了 Instrumentation 的 newApplication 方法創建 Application 實例對象 ;

/*** 用于實現應用程序檢測代碼的基類。* 當在啟用檢測的情況下運行時,該類將在任何應用程序代碼之前為您實例化,* 從而允許您監視系統與應用程序之間的所有交互。* 通過AndroidManifest.xml的&amp;lt;儀器儀表&amp;gt;標簽。*/ public class Instrumentation {/*** 執行進程{@link Application}對象的實例化。默認實現提供正常的系統行為。** @param cl 用來實例化對象的類加載器。* @param className 實現應用程序對象的類的名稱。* @param context 用于初始化應用程序的上下文** @return 新實例化的應用程序對象。*/public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException,ClassNotFoundException {Application app = getFactory(context.getPackageName()).instantiateApplication(cl, className);app.attach(context);return app;}}

完整代碼參考 /frameworks/base/core/java/android/app/Instrumentation.java ;





九、AppComponentFactory.instantiateApplicationCompat 創建 Application 對象



在 Instrumentation 的 newApplication 方法中 , 調用了 AppComponentFactory 的 instantiateApplicationCompat 方法 , 創建 Application , (Application) cl.loadClass(className).getDeclaredConstructor().newInstance(); , 此處通過反射創建 Application 實例對象 ;

/*** 使用androidx庫的{@link android.app.AppComponentFactory}版本。** 注意:這只適用于API 28+,不支持AppComponentFactory功能。*/ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {/*** 允許應用程序重寫應用程序對象的創建。這可以用于對這些類執行依賴項注入或類裝入器更改等操作。* <p>* 此方法僅用于提供用于實例化的掛鉤。它不提供對應用程序對象的早期訪問。* 返回的對象尚未初始化為上下文,不應用于與其他android API交互。** @param cl 用于實例化的默認類加載器。* @param className 要實例化的類。*/public @NonNull Application instantiateApplicationCompat(@NonNull ClassLoader cl,@NonNull String className)throws InstantiationException, IllegalAccessException, ClassNotFoundException {try {return (Application) cl.loadClass(className).getDeclaredConstructor().newInstance();} catch (InvocationTargetException | NoSuchMethodException e) {throw new RuntimeException("Couldn't call constructor", e);}}}

完整代碼參考 /frameworks/support/compat/src/main/java/androidx/core/app/AppComponentFactory.java ;

總結

以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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