問題:低端機首次啓動時間久,極大機率觸發ANRjava
分析:android
http://gityuan.com/2017/01/01/input-anr/ git
2. 啓動過程作了什麼?web
該圖是進入項目代碼層面後,執行代碼的順序。app
attachBaseContext: 可控制第一個步驟, 執行MultiDex.install()異步
首次啓動:Dalvik虛擬機對classes.dex執行dexopt操做,生成odex文件【超時】spa
非首次啓動:直接從cache讀取線程
https://juejin.im/entry/5705b2712e958a0057a5f735 3d
3. 爲何只有低端機會中招?code
Android 5.0及以上版本:ART模式,預先編譯,app安裝以後進行預編譯(pre-compilation) ,若是這時候發現了classes(..N).dex文件的存在就會將他們最終合成爲一個.oat的文件
Android 5.0如下版本:安裝時僅處理主dex,首次啓動時執行dexopt操做,處理附屬dex文件
4. MultiDex ?
Android官網:Davlik中限制了單個dex中可引用方法總數不能超過64K,超過就必需要拆分爲多個dex。
拋出異常的出處,打包過程某方法:
延展:爲何是64K?
如方法引用索引,16位,64K=2^16。
https://source.android.com/devices/tech/dalvik/dalvik-bytecode
解決:
高端機型(java.vm.version>」2.0.0」代表虛擬機運行環境爲ART):直接執行MultiDex.install();
低端機型:增長初始化界面,LoadResActivity中異步執行加載
特別注意的是:當activity到後臺時,輪詢不啓動異步執行
借用網上一張流程圖,基本說明以下:基本流程相似,啓動檢測時機略有區別,啓動過程單獨起進程檢測是否安裝過