【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )
文章目錄
- 一、 應用入口函數 ActivityThread 主函數 main
- 二、 ActivityThread 類 attach 方法 ( 應用加載 )
- 三、 ActivityThread 類 handleBindApplication 方法 ( 應用創建 )
- 四、 啟動優化項目
一、 應用入口函數 ActivityThread 主函數 main
1 . 執行應用主函數 : Launcher 應用與 Zygote 進程進行通信后 , 通知 Zygote 進程 fork 一個新的進程 , 該新進程中通過 System Server 執行 ActivityThread , 執行 ActivityThread 中的主函數 ;
2 . Android 應用主函數簡介 : 安卓應用的 main 函數定義在 ActivityThread.java 中 , 該主函數被封裝起來了 , Android 應用在編譯之后 , 是需要被打包到 apk 安裝文件中的 , 這是整個應用的入口函數 , 這個入口文件就是 ActivityThread.java 類 ;
- 安卓應用主函數 : Android 開發者開發安卓應用時 , 是不需要自己定義主函數的 , 由開發環境自動生成 ;
- 蘋果應用主函數 : iOS 開發者開發蘋果應用程序時 , 需要自己寫主函數 ;
3 . Java 棧內操作 : 在 Java 棧區域 , 會實例化 Application , 調用 Application 的 onCreate 方法 , 然后開啟主界面 Activity ; 這些操作都是在 ActivityThread 中完成的 ;
4 . 應用入口主函數部分代碼示例 : 下面代碼是 ActivityThread 部分代碼 , 省略 111 萬行代碼 , 只展示下主函數 ;
public final class ActivityThread {public static void main(String[] args) {// 主函數中先初始化 Looper MessageQueue // 將主線程轉為 Looper 線程 // 這也是在 Activity 中可以直接定義 Handler 就可以使用的原因 Looper.prepareMainLooper();// 這是主線程 ActivityThread thread = new ActivityThread();thread.attach(false);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}Looper.loop();} }該代碼路徑為 \frameworks\base\core\java\android\app\ActivityThread.java , 這是 Android 應用的入口主函數定義文件
二、 ActivityThread 類 attach 方法 ( 應用加載 )
1 . attach 方法引入 : 在上述 ActivityThread 類中的 main 函數中 , 創建 ActivityThread 對象 , 并調用了該對象的 attach 方法 , 下面開始分析該方法的源碼 ;
ActivityThread thread = new ActivityThread();thread.attach(false);在 attach 方法中 , 開啟應用 , 加載 application 應用 , 然后加載 Activity 界面 ;
2 . 加載 Application 應用過程 :
① 獲取進程引用 : 首先獲取進程引用 IActivityManager mgr , 此處涉及進程通信 , IActivityManager 是進程的引用 , 可以與其它進程進行通信 ;
// ActivityThread.java final IActivityManager mgr = ActivityManagerNative.getDefault();② 綁定 Application 應用 : 調用 IActivityManager 對象的 attachApplication 方法 , 調用該方法后 , 通過跨進程通信方式回調 ActivityThread 中的 handleBindApplication 方法 , 這個操作是由系統回調的 , 主要操作是初始化應用 Application ;
// ActivityThread.java mgr.attachApplication(mAppThread);3 . ActivityThread.java 中的 attach 方法代碼 : 展示部分代碼細節 , 詳細的類 , 去查看 ActivityThread.java 源碼 ;
// ActivityThread.javaprivate void attach(boolean system) {// mgr 是進程 , 涉及到進程間通信 , IActivityManager 是進程的引用final IActivityManager mgr = ActivityManagerNative.getDefault();try {// 綁定 Application 應用// 調用該方法后 , 通過進程方式回調 ActivityThread 中的 handleBindApplication 方法// 這個操作是由系統回調的 // 主要操作是初始化應用 Applicationmgr.attachApplication(mAppThread);} catch (RemoteException ex) {// Ignore}}該代碼路徑為 \frameworks\base\core\java\android\app\ActivityThread.java , 這是 Android 應用的入口主函數定義文件
三、 ActivityThread 類 handleBindApplication 方法 ( 應用創建 )
handleBindApplication 處理 Application 應用綁定方法 , 這是創建 Application 應用核心過程 ;
1 . 方法調用者 : 該方法是由進程回調的 , 回調時傳入的 AppBindData data 參數 , 包含了所有應用相關信息 , 如創建位置 , 包名 ;
// ActivityThread.java private void handleBindApplication(AppBindData data) { }2 . 創建應用核心代碼 : 從進程中傳入的 AppBindData data 參數的 info 信息中獲取 Application 應用 , 這是獲取應用的核心方法 ;
( 此時該 Application 是一個空的應用 , 還沒有執行 onCreate 方法 )
// ActivityThread.java Application app = data.info.makeApplication(data.restrictedBackupMode, null); mInitialApplication = app;3 . 執行應用 Application 的 onCreate 方法 : 下面的代碼會觸發執行 Application 的 onCreate 方法 ;
// ActivityThread.java mInstrumentation.callApplicationOnCreate(app);4 . Instrumentation 的 callApplicationOnCreate 方法 : 很簡單的調用方法 , 直接調用 Application 的 onCreate 方法 ;
// Instrumentation.javapublic void callApplicationOnCreate(Application app) {app.onCreate();}該代碼所在文件路徑為 \frameworks\base\core\java\android\app\Instrumentation.java
5 . ActivityThread 類 handleBindApplication 方法部分源碼參考 :
// ActivityThread.javaprivate void handleBindApplication(AppBindData data) {// ... 省略 1 萬行代碼// Allow disk access during application and provider setup. This could// block processing ordered broadcasts, but later processing would// probably end up doing the same disk access.// 允許磁盤在應用和 provider 創建時訪問 . // 該操作可能阻塞處理有序廣播 , 但是稍后處理會完畢后 , 會允許同樣的磁盤訪問 ; final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();try {// If the app is being launched for full backup or restore, bring it up in// a restricted environment with the base application class.// 進程中傳入的 AppBindData data 參數 , 包含了 Application 應用// 這是創建 Application 的過程Application app = data.info.makeApplication(data.restrictedBackupMode, null);mInitialApplication = app;try {// 執行 Application 的 onCreate 方法mInstrumentation.callApplicationOnCreate(app);} catch (Exception e) {if (!mInstrumentation.onException(app, e)) {throw new RuntimeException("Unable to create application " + app.getClass().getName()+ ": " + e.toString(), e);}}} finally {StrictMode.setThreadPolicy(savedPolicy);}}該代碼路徑為 \frameworks\base\core\java\android\app\ActivityThread.java , 這是 Android 應用的入口主函數定義文件
四、 啟動優化項目
在 Launcher 應用點擊圖標后 , 啟動應用 , 系統為應用開啟進程 , 分配內存的步驟是無法干預的 , 開發者能做啟動優化的地方只有兩個位置 , 一個是 Application 的 onCreate 方法 , 另一個是 Activity 的 onCreate 方法 ;
1 . Application 的 onCreate 方法 : 在應用的 Application 創建時 , 需要調用 Application 中的 onCreate 方法 , 這里面絕對不能有耗時操作 , 直接影響到 ActivityThread 中初始化 Application 步驟的消耗時間 ;
2 . Activity 的 onCreate 方法 : 一般在 Activity 界面中 , 需要加載 xml 布局文件 , 顯示布局文件中的畫面 ;
總結
以上是生活随笔為你收集整理的【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 性能优化】应用启动优化
- 下一篇: 【Android 应用开发】Activi