APK是一个程序压缩包,里面有个执行程序,ODEX优化就是把包里面的执行程序提取出来,就变成ODEX文件,因为你提取出来了,系统第一次启动的时候就不用去解压程序压缩包的程序,少了一个解压的过程。这样的话系统启动就加快了。
最近做一个模块,需要将apk里面加载的dex文件dump出来,所以需要配置让dalvik不要把dex文件优化成odex。
1. 配置build.prop
主要是通过修改文件/system/build.prop里面的配置。
(1) dalvik.vm.dexopt-flags
本参数控制Dalvik虚拟机的程序代码校验和优化。可填写的值有m、v和o。
m为标准选项,可以是m=y或m=n。若m=y则启用不安全代码的校验和托管代码的优化。兼容性和安全性最高。
v为校验选项,可与o并存。可以是v=a或v=n。若v=a则表示校验所有代码,v=n则关闭代码的校验。
o为优化选项,可与v并存。可以是o=v或o=a。若o=v则表示优化以校验过的代码,o=a则表示优化所有代码。
这里我们配置成:dalvik.vm.dexopt-flags=v=n,o=v,表示关闭代码校验,并只优化校验过的代码,也就是所有代码都不会被优化。
(2) dalvik.vm.checkjni
这里我们配置成:dalvik.vm.checkjni=false,这个会把checkjni设置成false
2. 把配置持久化到模拟器
(1) 首先重新挂载系统分区,使系统分区可写。如果不执行这个,会发现没法修改build.prop文件。
adb remount
(2) 接下来,进入模拟器的命令行:
adb shell
(3) 将配置写到build.prop:
echo "dalvik.vm.dexopt-flags=v=n,o=v" >> /system/build.propecho "dalvik.vm.checkjni=false" >> /system/build.prop
这样,配制就改到模拟器里面了,验证之后发现dex果然没有被转化成odex。
可是在重启模拟器之后,发现build.prop里面的改动都没有了。
在网上搜了一下,参考了这个stackoverflow的提问:http://stackoverflow.com/questions/15417105/forcing-the-android-emulator-to-store-changes-to-system
具体步骤如下:
(1) 将system.img复制到一个地方,
(2) 用下面的命令启动模拟器:
emulator -avd [你的模拟器名字] -qemu -nand system,size=[模拟器需要的空间,16进制],file=[刚才复制的目录]/system.img
例如: emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.android/avd/Galaxy_Nexus/system.img
(3) 按照之前的步骤修改build.prop
(4) 用这个命令关闭模拟器:
adb -e emu kill
这样,下次正常启动模拟器的时候(不必再用上面步骤2里面的命令),发现修改的内容已经被持久化到build.prop里面。