【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )
文章目錄
- 一、 應(yīng)用入口函數(shù) ActivityThread 主函數(shù) main
- 二、 ActivityThread 類 attach 方法 ( 應(yīng)用加載 )
- 三、 ActivityThread 類 handleBindApplication 方法 ( 應(yīng)用創(chuàng)建 )
- 四、 啟動(dòng)優(yōu)化項(xiàng)目
一、 應(yīng)用入口函數(shù) ActivityThread 主函數(shù) main
1 . 執(zhí)行應(yīng)用主函數(shù) : Launcher 應(yīng)用與 Zygote 進(jìn)程進(jìn)行通信后 , 通知 Zygote 進(jìn)程 fork 一個(gè)新的進(jìn)程 , 該新進(jìn)程中通過 System Server 執(zhí)行 ActivityThread , 執(zhí)行 ActivityThread 中的主函數(shù) ;
2 . Android 應(yīng)用主函數(shù)簡(jiǎn)介 : 安卓應(yīng)用的 main 函數(shù)定義在 ActivityThread.java 中 , 該主函數(shù)被封裝起來了 , Android 應(yīng)用在編譯之后 , 是需要被打包到 apk 安裝文件中的 , 這是整個(gè)應(yīng)用的入口函數(shù) , 這個(gè)入口文件就是 ActivityThread.java 類 ;
- 安卓應(yīng)用主函數(shù) : Android 開發(fā)者開發(fā)安卓應(yīng)用時(shí) , 是不需要自己定義主函數(shù)的 , 由開發(fā)環(huán)境自動(dòng)生成 ;
- 蘋果應(yīng)用主函數(shù) : iOS 開發(fā)者開發(fā)蘋果應(yīng)用程序時(shí) , 需要自己寫主函數(shù) ;
3 . Java 棧內(nèi)操作 : 在 Java 棧區(qū)域 , 會(huì)實(shí)例化 Application , 調(diào)用 Application 的 onCreate 方法 , 然后開啟主界面 Activity ; 這些操作都是在 ActivityThread 中完成的 ;
4 . 應(yīng)用入口主函數(shù)部分代碼示例 : 下面代碼是 ActivityThread 部分代碼 , 省略 111 萬行代碼 , 只展示下主函數(shù) ;
public final class ActivityThread {public static void main(String[] args) {// 主函數(shù)中先初始化 Looper MessageQueue // 將主線程轉(zhuǎn)為 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 應(yīng)用的入口主函數(shù)定義文件
二、 ActivityThread 類 attach 方法 ( 應(yīng)用加載 )
1 . attach 方法引入 : 在上述 ActivityThread 類中的 main 函數(shù)中 , 創(chuàng)建 ActivityThread 對(duì)象 , 并調(diào)用了該對(duì)象的 attach 方法 , 下面開始分析該方法的源碼 ;
ActivityThread thread = new ActivityThread();thread.attach(false);在 attach 方法中 , 開啟應(yīng)用 , 加載 application 應(yīng)用 , 然后加載 Activity 界面 ;
2 . 加載 Application 應(yīng)用過程 :
① 獲取進(jìn)程引用 : 首先獲取進(jìn)程引用 IActivityManager mgr , 此處涉及進(jìn)程通信 , IActivityManager 是進(jìn)程的引用 , 可以與其它進(jìn)程進(jìn)行通信 ;
// ActivityThread.java final IActivityManager mgr = ActivityManagerNative.getDefault();② 綁定 Application 應(yīng)用 : 調(diào)用 IActivityManager 對(duì)象的 attachApplication 方法 , 調(diào)用該方法后 , 通過跨進(jìn)程通信方式回調(diào) ActivityThread 中的 handleBindApplication 方法 , 這個(gè)操作是由系統(tǒng)回調(diào)的 , 主要操作是初始化應(yīng)用 Application ;
// ActivityThread.java mgr.attachApplication(mAppThread);3 . ActivityThread.java 中的 attach 方法代碼 : 展示部分代碼細(xì)節(jié) , 詳細(xì)的類 , 去查看 ActivityThread.java 源碼 ;
// ActivityThread.javaprivate void attach(boolean system) {// mgr 是進(jìn)程 , 涉及到進(jìn)程間通信 , IActivityManager 是進(jìn)程的引用final IActivityManager mgr = ActivityManagerNative.getDefault();try {// 綁定 Application 應(yīng)用// 調(diào)用該方法后 , 通過進(jìn)程方式回調(diào) ActivityThread 中的 handleBindApplication 方法// 這個(gè)操作是由系統(tǒng)回調(diào)的 // 主要操作是初始化應(yīng)用 Applicationmgr.attachApplication(mAppThread);} catch (RemoteException ex) {// Ignore}}該代碼路徑為 \frameworks\base\core\java\android\app\ActivityThread.java , 這是 Android 應(yīng)用的入口主函數(shù)定義文件
三、 ActivityThread 類 handleBindApplication 方法 ( 應(yīng)用創(chuàng)建 )
handleBindApplication 處理 Application 應(yīng)用綁定方法 , 這是創(chuàng)建 Application 應(yīng)用核心過程 ;
1 . 方法調(diào)用者 : 該方法是由進(jìn)程回調(diào)的 , 回調(diào)時(shí)傳入的 AppBindData data 參數(shù) , 包含了所有應(yīng)用相關(guān)信息 , 如創(chuàng)建位置 , 包名 ;
// ActivityThread.java private void handleBindApplication(AppBindData data) { }2 . 創(chuàng)建應(yīng)用核心代碼 : 從進(jìn)程中傳入的 AppBindData data 參數(shù)的 info 信息中獲取 Application 應(yīng)用 , 這是獲取應(yīng)用的核心方法 ;
( 此時(shí)該 Application 是一個(gè)空的應(yīng)用 , 還沒有執(zhí)行 onCreate 方法 )
// ActivityThread.java Application app = data.info.makeApplication(data.restrictedBackupMode, null); mInitialApplication = app;3 . 執(zhí)行應(yīng)用 Application 的 onCreate 方法 : 下面的代碼會(huì)觸發(fā)執(zhí)行 Application 的 onCreate 方法 ;
// ActivityThread.java mInstrumentation.callApplicationOnCreate(app);4 . Instrumentation 的 callApplicationOnCreate 方法 : 很簡(jiǎn)單的調(diào)用方法 , 直接調(diào)用 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.// 允許磁盤在應(yīng)用和 provider 創(chuàng)建時(shí)訪問 . // 該操作可能阻塞處理有序廣播 , 但是稍后處理會(huì)完畢后 , 會(huì)允許同樣的磁盤訪問 ; 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.// 進(jìn)程中傳入的 AppBindData data 參數(shù) , 包含了 Application 應(yīng)用// 這是創(chuàng)建 Application 的過程Application app = data.info.makeApplication(data.restrictedBackupMode, null);mInitialApplication = app;try {// 執(zhí)行 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 應(yīng)用的入口主函數(shù)定義文件
四、 啟動(dòng)優(yōu)化項(xiàng)目
在 Launcher 應(yīng)用點(diǎn)擊圖標(biāo)后 , 啟動(dòng)應(yīng)用 , 系統(tǒng)為應(yīng)用開啟進(jìn)程 , 分配內(nèi)存的步驟是無法干預(yù)的 , 開發(fā)者能做啟動(dòng)優(yōu)化的地方只有兩個(gè)位置 , 一個(gè)是 Application 的 onCreate 方法 , 另一個(gè)是 Activity 的 onCreate 方法 ;
1 . Application 的 onCreate 方法 : 在應(yīng)用的 Application 創(chuàng)建時(shí) , 需要調(diào)用 Application 中的 onCreate 方法 , 這里面絕對(duì)不能有耗時(shí)操作 , 直接影響到 ActivityThread 中初始化 Application 步驟的消耗時(shí)間 ;
2 . Activity 的 onCreate 方法 : 一般在 Activity 界面中 , 需要加載 xml 布局文件 , 顯示布局文件中的畫面 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 性能优化】应用启动优化
- 下一篇: 【Android 应用开发】Activi