zoukankan      html  css  js  c++  java
  • [Android] 配置安卓模拟器,使得dex文件不被优化成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.prop
    echo "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里面。

    3. 修改安卓源码

    用上面的方法运行一段时间之后发现并不能完全避免dex被优化,具体原因没有找到,所以最后修改了安卓的源码,重新编译了一个img出来。

    具体修改的是 /dalvik/vm/analysis/Optimize.c 文件,将里面的 dvmOptimizeClass 函数直接return。此方法测试有效,暂时没有发现问题。

  • 相关阅读:
    你不知道的JS
    Git学习攻略
    InteliJ Idea 编写项目常见的问题及解决方案
    上海租房攻略
    JS数组攻略
    Web开发必备的Chrome插件
    BFC和清除浮动
    Angular最新教程-第十一节 路由四 (嵌套路由)
    Angular最新教程-第十节 路由三(路由器钩子函数、路由守卫)
    Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
  • 原文地址:https://www.cnblogs.com/hiddenfox/p/3811780.html
Copyright © 2011-2022 走看看