最近做一个模块,需要将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。此方法测试有效,暂时没有发现问题。

[Android] 配置安卓模拟器,使得dex文件不被优化成odex的更多相关文章

  1. 【Android 逆向】手动构造dex文件

    public class Hello { public static void main(String[] args) { System.out.println("hello android ...

  2. Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)

    Visual Studio Emulator for Android是微软官方发布的独立版本的安卓模拟器,这款软件可以让安卓应用开发者更加轻松的用Visual Studio编写Android应用,据说 ...

  3. 超简单,安卓模拟器手动root

    本文转载自:http://quantoubao.blog.163.com/blog/static/2083211702013870501987/ 安装Android SDK安卓模拟器的方法很简单,网上 ...

  4. 浅析dex文件加载机制

    我们可以利用DexClassLoader来实现动态加载dex文件,而很多资料也只是对于DexClassLoader的使用进行了介绍,没有深入讲解dex的动态加载机制,我们就借助于Android4.4的 ...

  5. 【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,而且在AVD中浏览sdcard的文件

    首先.实现这一切的大前提是.你的AVD安卓模拟器,在启动之前.有设置好sdcard的大小,例如以下图.同一时候,你的AVD安卓模拟器,要处于启动状态.否则无法运行例如以下的操作. 这里以<[An ...

  6. Android Studio 1.0.1 + Genymotion安卓模拟器打造高效安卓开发环境

    我们开发安卓大多是使用Eclipse和安卓SDK中自带的安卓模拟器.当然,Google早就推出了自己的安卓开发环境——Android studio,在不久前,Google发布了Android Stud ...

  7. Hbuilder配置识别逍遥安卓模拟器

    最近在公司,需要开发一款智能家居APP,用到MUI框架,首先就是环境搭建,写好的APP页面,怎么跑在模拟器上运行? 我的开发环境: HBuilder版本:9.0.2.201803061935 逍遥安卓 ...

  8. 【转】Android系统中的.apk文件和dex文件

    1. *.apk文件 APK是Android Package的缩写,即Android安装包.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. 使用Android打包工具 ...

  9. VS2015配置安卓Android和iOS开发环境

    http://www.cjjjs.cn/paper/gzsh/627201502818357.aspx [摘要] 本文按照步骤一步步的介绍要下载安装的东西,都提供了下载地址.最后将所有需要的程序都打包 ...

随机推荐

  1. [oracle] 两种权限:系统权限VS对象权限

    系统权限表示对表和表空间等   有无操作权  的权限.一般是SYS用户这种DBA来授权.比如: grant create session to lisi grant create table to l ...

  2. e683. 设置打印的方向

    PrinterJob pjob = PrinterJob.getPrinterJob(); PageFormat pf = pjob.defaultPage(); if (portrait) { pf ...

  3. e674. 创建并绘制加速图像

    Images in accelerated memory are much faster to draw on the screen. This example demonstrates how to ...

  4. nodejs基础 -- 函数

    Node.js 函数 在JavaScript中,一个函数可以作为另一个函数接收一个参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. Node.js中函数的使用与Javasc ...

  5. 关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)

    前面一篇文章提到,HTTP1.1中持久连接已经是默认配置,除非设置Connection为close,否则默认都会进行持久连接.但是我们知道事实标准跟教科书还是可能会有一定差距的,所以不妨自己尝试一下. ...

  6. 转载:MochiWeb一些资料的链接

    转自:http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/mochiweb_20091030.txt MochiWeb项目主 ...

  7. jdbcType 与 Java type

    JDBC Type           Java Type CHAR                String VARCHAR             String LONGVARCHAR      ...

  8. linux磁盘分区详解

    http://blog.csdn.net/aaronychen/article/details/2270048

  9. oracle的常用函数 instr() 和substr()函数

    from:http://1055592535.iteye.com/blog/1676235 在Oracle中 可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符. 在一个字符串中查找 ...

  10. cocos2d-x游戏引擎核心之十一——并发编程(消息通知中心)

    [续] cocos2d-x游戏引擎核心之八——多线程 这里介绍cocos2d-x的一种消息/数据传递方式,内置的观察者模式,也称消息通知中心,CCNotificationCenter. 虽然引擎没有为 ...