是否开启 jit 编译
开启
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
关闭:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
强制编译
全编译某个apk:
adb shell cmd package compile -m speed -f pkgName
基于配置文件编译:
adb shell cmd package compile -m speed-profile -f pkgName
编译所有apk:
adb shell cmd package compile -m speed -f -a
oat文件
包含有:
dex文件
dex文件编译出的native code
oat的header
oat的data
用途:
art虚拟机运行的文件
生成:
由dex2oat,将dex文件生成
profile文件
路径:
/data/misc/profiles/cur/0/com.***.home/primary.prof
作用:
记录运行频繁的mthod,提供给dex2oat编译。
是7.0之后出现的
查看命令:
直接pull出来,全是乱码
可以命令:
profman --profile-file=primary.prof --dump-only
结构:
使用上面命令看,可看到结构。
methods 和 classes后的数据,表示他们在dex文件中的index。
使用profile执行 dex2oat时,只会编译profile中记录的methods和classes
//profile文件内容
=== Dex files ===
=== profile ===
ProfileInfo:
xxxx.apk [index=0] [checksum=3e072d12]
hot methods: 7332[], ....
startup methods:
post startup methods:7184, 7186,.....
classes:
xxx.apk!classes2.dex [index=1] [checksum=adce87a]
hot methods: 1108[], 1110[], 1327[], 1334[], 1343[], 1344[],
startup methods:
post startup methods: 1108, 1110,...
app-image文件
路径:
/data/dalvik-cache/arm
文件:
preload@app@Jingdong@Jingdong.apk@classes.art
preload@app@Jingdong@Jingdong.apk@classes.dex
preload@app@Jingdong@Jingdong.apk@classes.vdex
用途:
art文件记录了哪些classes和methods被编译了,以及被编译出到那个oat文件
dex2oat
触发时机:
1,安装后
2,开机后,pms扫描
3,backgroundDexOptService,定时
(1条消息) Android profile-guided dex2oat_大将军王虎剩的专栏-CSDN博客
JIT和AOT共存
Android 7.0上,JIT 编译器被再次使用,采用AOT/JIT 混合编译的策略,特点是:
- 应用在安装的时候dex不会再被编译
- App运行时,dex文件先通过解析器被直接执行,热点函数会被识别并被JIT编译后存储在 jit code cache 中并生成profile文件以记录热点函数的信息。
- 手机进入 IDLE(空闲) 或者 Charging(充电) 状态的时候,系统会扫描 App 目录下的 profile 文件并执行 AOT 过程进行编译。