和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
1.Java 语言在Android 上运行流程
2.虚拟机发展过程
3.Android Dalvik 模式
4.Android N 中dex2oat 原理以及模式
5.如何判断dex2oat 采用的相关参数
6.如何查看dex2oat 的log
7.什么时候进行dex2oat
8.手机反应慢的原因
9.解决手机反应慢的方法
10.参考文献
1.Java 语言在Android 上运行流程
Java语言在android 运行流程
2.虚拟机发展过程
1.初期Dalvik
2.中期Dalvik
3.后期ART模式
为了让APK在不同的虚拟机都可以运行,Google 采取了适配器模式,在让虚拟机运行之前先执行 dexopt ,即将dex 文件优化成odex 文件,可以让虚拟机更加优化的执行。
在ART 虚拟机中,dexopt 将dex文件优化成二进制格式的问题,从而可以让ART虚拟机执行。
dexopt 会调用dex2oat 进行优化,dex2oat 的任务是将原来的dex文件进行预翻译,从而可以加快app运行的时间,但是由于某些app比较复杂,所以优化的时间就比较长。
优化是以dex 文件中的Method 方法为单位,dex2oat 在优化时候,会根据需求优化一定量的Method,即不是所有的Method 都回翻译成oat模式。
3.Android Dalvik 模式
根据优化Method量的多少分的模式
Android Dalvik
4. Android N 中dex2oat 原理以及模式
N版本当中强化了JIT模式。JIT模式是Just in time 的简称。意思是在运行的时候,根据method有使用频率来决定是否要对某一个方法进行优化。虚拟机会统计每一个方法被执行的次数。如果某一个方法执行的次数比较多,达到一定的阈值,就会将升级为hot method,并将其记录在一个profile当中。在系统空闲并且在充电的时候,只将这些方法进行优化。在运行的时候,也会对这些方法进行优化,以方便在运行的时候使用。
1.Android N dex2oat 模式图
Android N dex2oat 模式图
2.Android N dex2 oat 原理图
Android N dex2oat 原理图
5. 如何判断dex2oat 采用的相关参数
dex2oat 的参数会在代码中通过如下函数打印
1.L 版本
L版本会无条件打印
timings.StartTiming("dex2oat Setup");
1436 LOG(INFO) << CommandLine();
2 . M 和N版本
在M和N当中会有条件的打印不同的内容。
例如在会在debug版本中打印非常详细的dex2oat参数,而在非debug版本中打印部分内容。
if (kIsDebugBuild || dex2oat.IsImage() || dex2oat.IsHost() || !kIsTargetBuild) {
2144 LOG(INFO) << CommandLine();
2145 } else {
2146 LOG(INFO) << StrippedCommandLine();
2147 }
6.如何查看dex2oat 的log
搜索关键字
dex2oat
dex-file
被优化的dex 文件信息oat-fd
oat-location
oat 存放位置