[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。此方法测试有效,暂时没有发现问题。
[Android] 配置安卓模拟器,使得dex文件不被优化成odex的更多相关文章
- 【Android 逆向】手动构造dex文件
public class Hello { public static void main(String[] args) { System.out.println("hello android ...
- Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)
Visual Studio Emulator for Android是微软官方发布的独立版本的安卓模拟器,这款软件可以让安卓应用开发者更加轻松的用Visual Studio编写Android应用,据说 ...
- 超简单,安卓模拟器手动root
本文转载自:http://quantoubao.blog.163.com/blog/static/2083211702013870501987/ 安装Android SDK安卓模拟器的方法很简单,网上 ...
- 浅析dex文件加载机制
我们可以利用DexClassLoader来实现动态加载dex文件,而很多资料也只是对于DexClassLoader的使用进行了介绍,没有深入讲解dex的动态加载机制,我们就借助于Android4.4的 ...
- 【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,而且在AVD中浏览sdcard的文件
首先.实现这一切的大前提是.你的AVD安卓模拟器,在启动之前.有设置好sdcard的大小,例如以下图.同一时候,你的AVD安卓模拟器,要处于启动状态.否则无法运行例如以下的操作. 这里以<[An ...
- Android Studio 1.0.1 + Genymotion安卓模拟器打造高效安卓开发环境
我们开发安卓大多是使用Eclipse和安卓SDK中自带的安卓模拟器.当然,Google早就推出了自己的安卓开发环境——Android studio,在不久前,Google发布了Android Stud ...
- Hbuilder配置识别逍遥安卓模拟器
最近在公司,需要开发一款智能家居APP,用到MUI框架,首先就是环境搭建,写好的APP页面,怎么跑在模拟器上运行? 我的开发环境: HBuilder版本:9.0.2.201803061935 逍遥安卓 ...
- 【转】Android系统中的.apk文件和dex文件
1. *.apk文件 APK是Android Package的缩写,即Android安装包.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. 使用Android打包工具 ...
- VS2015配置安卓Android和iOS开发环境
http://www.cjjjs.cn/paper/gzsh/627201502818357.aspx [摘要] 本文按照步骤一步步的介绍要下载安装的东西,都提供了下载地址.最后将所有需要的程序都打包 ...
随机推荐
- [oracle] 如何使用myBatis在数据库中插入数据并返回主键
在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列se ...
- 启动hadoop 2.6遇到的datanode启动不了
转自 http://blog.csdn.net/zhangt85/article/details/42078347 查看日志如下: 2014-12-22 12:08:27,264 INFO org.m ...
- php 连接数据库
连接数据库 <?php $con = mysql_connect("localhost","root","root"); if (!$ ...
- am335x uart分析
/************************************************************ * am335x uart分析 * 本文记录am335x uart驱动的注册 ...
- am335x mux配置
/**************************************************************** * am335x mux配置 * * am335x的引脚复寄存器是C ...
- VC内存溢出一例 –- 调用约定不一致
这个是网查的跟我在做图像分割realse相反的情况: 最近在写一个程序,调用了多个DLL,每个DLL代码都支持多线程,Debug的模式下基本调通了,但是在Release模式下,程序因为内存溢出而崩溃, ...
- [精]Odoo 8.0深入浅出开发教程-模块开发基础
參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...
- go语言的time.Sleep
首先:time.sleep单位为:1ns (纳秒) 转换单位: 1纳秒 =1000皮秒 1纳秒 =0.001 微秒 1纳秒 =0.000 001毫秒 1纳秒 =0.0 ...
- Python 调用外部命令
python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下: os.system():结果输出在终端上,捕获不到os.popen() : 结果返回一个对象,即标准输出 ...
- 多进程模块:multiprocessing
多进程: (1) 前面我们学习的多线程,其实算不上真正的多线程,即使你开了很多个线程,在同一时间内只能有一个CPU核数来处理一个线程(2) 在 python 中,多进程算得上是真正的多线程,假设你的C ...