问题:低端机首次启动时间久,极大几率触发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到后台时,轮询不启动异步执行
借用网上一张流程图,基本说明以下:基本流程相似,启动检测时机略有区别,启动过程单独起进程检测是否安装过