DEX、ODEX、OAT文件&Dalvik和ART虚拟机
https://www.jianshu.com/p/389911e2cdfb
https://www.jianshu.com/p/a468e714aca7
ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程将其优化生成一个·odex文件单独存放,原APK中的classes.dex文件会保留。
优化是依据当前ROM的特性进行的,会减少很多冗余信息,和当前ROM强相关,优化后,文件减小很多。加载快,运行快。优化发生在手机从出产状态到第一次启动的过程。
这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。(只有dex,也是只有在第一次程序运行时,启动会慢些;因为要解压得到dex文件,解压出来的dex文件会存储下来,系统应用和普通应用存储位置不同。而后再加载到内存。后面再启动时,会直接将存储的dex文件加载到内存中)。
odex , vdex ,art 文件区别
1.vdex(Android O开始加入的)
package 直接转化的 可执行二进制码 文件:
1.第一次开机就会生成在/system/app/<packagename>/oat/ 下;
2.在系统运行过程中,虚拟机将其 从 “/system/app” 下 copy 到 “/data/davilk-cache/” 下
2.odex
odex 是从vdex 这个文件中 提取了部分模块生成的一个新的 可执行二进制码 文件 , odex 从vdex 中提取后,vdex 的大小就减少了。
1.第一次开机就会生成在/system/app/<packagename>/oat/ 下
2.在系统运行过程中,虚拟机将其 从 “/system/app” 下 copy 到 “/data/davilk-cache/” 下
3.odex + vdex = apk 的全部源码 (vdex 并不是独立于odex 的文件 odex + vdex 才代表一个apk )
3.art
odex 进行优化 生成的 可执行二进制码 文件,主要是apk 启动的热点函数相关地址的记录,方便寻址相关;
1.第一次开机不会生成在/system/app/<packagename>/oat/ 下,以后也不会;
2.odex 文件在运行时,虚拟机会计算函数调用频率,进行函数地址的修改;
3.最后在/data/davilk-cache/ 由虚拟机生成;
4.生成art 文件后,/system/app 下的odex 和 vdex 会无效,即使你删除,apk也会正常运行
5.push 一个新的apk file 覆盖之前/system/app 下apk file ,会触发PKMS 扫描时下发force_dex flag ,强行生成新的vdex 文件 ,覆盖之前的vdex 文件,由于某种机制,这个新vdex 文件会copy到/data/dalvik-cache/下,于是art 文件也变化了。
反编译vdex文件
华为mate10使用了最新的android o,并进行了预编译,然后baksmali现在还不支持androido,导致反编译困难,于是自己动手diy
1、adb pull /system/framework,把整个框架的代码pull 出来,特别是arm64目录下的vdex文件
2、从vdex文件扣出dex文件,并构成jar文件,这一步可以使用16进制编辑器,找到dex\n035开头的magic,并把往后的内容导出成一个classes.dex文件,然后并压缩到jary谁的中,注意,boot-framework.vdex里,包括两个dex文件
3、adb pull /system/app/iaware/oat/arm64/base.vdex,pull出预编译后的vdex代码,并扣出dex文件
4、下载baksmali源码,编译并调试执行baksmali d –x base.vdex –d <2中生成的framework的.jar目录>
5、哪里错了改哪里,还要把华为的bootclasspath替换掉原本的bootclasspath,或者直接使用https://github.com/lcweik/smali
6、再执行一下baksmali d –x base.vdex –d<2中生成的framework的.jar目录>,全部都反编译出来了,保存在out目录,再 smali a out –o base.dex,就行了。
DEX、ODEX、OAT文件&Dalvik和ART虚拟机的更多相关文章
- Android odex,oat文件的反编译,回编译
现在,许多Android手机的ROM包在生成过程中都启用优化,把jar文件抽空,生成odex/oat和vdex文件,以在运行时省掉编译时间.如果想对这些jar进行修改,就要修改它们所对应的odex或者 ...
- Android内存优化(一)Dalvik虚拟机和ART虚拟机对比
1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.D ...
- Android执行时ART载入OAT文件的过程分析
在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...
- DexHunter在ART虚拟机模式下的脱壳原理分析
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...
- Dalvik虚拟机和Art虚拟机
Dalvik虚拟机 DVM是Dalvik Virtual Machine的缩写,是Android4.4及以前使用的虚拟机,所有android程序都运行在android系统进程里,每个进程对应着一个Da ...
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对照
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编 ...
- Android里的Dalvik、ART、JIT、AOT有什么关系?
JIT,Just-in-time,即时编译,边运行边编译: AOT,Ahead Of Time,提前编译,指运行前编译. 区别 这两种编译方式的主要区别在于是否在“运行时”进行编译 优劣JIT优点: ...
- art虚拟机介绍
Android 4.4提供了一种与Dalvik截然不同的运行环境ART(Android runtime)支持,ART源于google收购的Flexycore的公司.ART模式与Dalvik模式最大的不 ...
随机推荐
- C++基础知识--DAY2
昨天我们主要是讲的C++相对于C语言的变化,结尾讲述了一点引用的基础知识,要明白,引用就是对一个变量取别名,在C++中需要用指针的都可以思考是否可以用引用来代替. 1. 常引用 常引用(const s ...
- node基础(二)_模块以及处理乱码问题
一.前言 本次内容主要包括: 1.node.js中的模块系统 2.解决上篇中服务器响应的汉字乱码问题 二.知识 1.node中的模块 分为三种: 核心模块(node定义的如前面用到的fs,http ...
- 递归思维判断数组a[N]是否为一个递增数组
递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ...
- HDU4560 二分最大流
http://acm.hdu.edu.cn/showproblem.php?pid=4560 网络流好像经常搭配上二分和拆点. n个歌手,m种歌曲流派(n<=m<=75) 我们想要安排尽可 ...
- python django基础二URL路由系统
URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...
- Git(工作区和暂存区概念)
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...
- HDU 6375(双端队列 ~)
题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...
- mongoDB与mongoose
mongodb是一个基于分布式文件存储的文档型数据库 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引 官方 ...
- Android弹出窗口
protected void PopUp() { final PopupWindow popup = new PopupWindow(TestActivity.this); View popView ...
- build script和all projects作用和区别
buildscript中的声明是gradle脚本自身需要使用的资源.可以声明的资源包括依赖项.第三方插件.maven仓库地址等.而在build.gradle文件中直接声明的依赖项.仓库地址等信息是项目 ...