• 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 035开头的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,就行了。

  • 相关阅读:
    VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :
    中国科学院图书馆分类法
    让进程在后台可靠运行的几种方法 nohup,setsid,&,disown,CTRL-z ,screen
    Exception Handling Statements (C# Reference)
    ChannelFactory.Endpoint 上的地址属性为空。ChannelFactory 的终结点必须指定一个有效的地址。
    .NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
    WCF Host中的BaseAddress 和 Endpoint中的Address的区别
    使用vs自带的wcf配置工具
    Automatic Code Generation-->Implement Interface
    Learning WCF Chapter1 Exposing Multiple Service Endpoints
  • 原文地址:https://www.cnblogs.com/genggeng/p/9810311.html
Copyright © 2020-2023  润新知