1

我了解在最新版本的 Android 上,Dex 文件会在设备上编译成 OAT 文件。OAT 文件是否包含 Dex 文件中所有方法的编译版本,还是某些方法保留为 Dex 字节码并在运行时解释?

4

1 回答 1

0

如果应用程序编译选项的级别不高,或者方法运行一段时间后不认为是热的,则 Dex2oat 不会编译所有方法。
众所周知,dex2oat 有很多编译过滤器选项:Verify、Quicken、space-profile、space、speed-profile、speed,一切。从验证到一切,编译时间越来越长,越来越多的类和方法被编译成字节码。
您可以使用 oatdump 命令检查特定包中方法的编译状态(检查 OatClassAllCompiled oatclasssomecomcompiled 关键字)。
例如 Lcom/android/listviewtest/MainActivity$1; (offset=0x000015c8) (type_idx=98) (已验证) ( OatClassAllCompiled )

另外,Android dex2oat 配置了不同场景下的属性:

[pm.dexopt.ab-ota]: [speed-profile]
[pm.dexopt.bg-dexopt]: [speed-profile]
[pm.dexopt.boot]: [verify]
[pm.dexopt.first-boot]: [quicken]
[pm.dexopt.inactive]: [verify]
[pm.dexopt.install]: [speed-profile]
[pm.dexopt.shared]: [speed]

参考:https ://source.android.com/devices/tech/dalvik/configure

于 2021-12-28T08:45:04.723 回答