首先要清楚,odex只是对代码段(我将dex文件与elf文件类比,大家都将执行文件分成不同的段)作优化,而其它用于类反射信息的段都应用原来的dex,所以odex文件内部还包含了一个dex。

打开一个dex或一个odex文件,就是要将其中用于类反射的信息加载到虚拟机运行时中。对于打开一个odex文件,目的也是要将其中包含的dex部分的信息进行加载。

dalvik(libdvm.so)打开dex文件,实质就是要将dex里的反射信息加载到一个DexFile组织的结构体。这个结构有一个查找表,DexClassLookup。这个结构不直接被 libdvm.so 使用,而是由一个上层的DvmDex代替,为libdvm.so其它函数调用使用。但这个DvmDex不被JNI层,也就是libdvm.so最接近java的一层所直接使用,这里有一个DexOrJar结构体关联DvmDex,DexOrJar为最上层可寻找到的对象,并且插入到hash表中。

DexOrJar,JNI 层

DvmDex,libdvm 内部函数

DexFile,最后的执行委托处

对于dalvik.system.DexFile.openDexFile,它的native实现Dalvik_dalvik_system_DexFile_openDexFile的工作,就是调用libdvm内部相关的函数完成,从dex文件加载进DexFile,分配DvmDex关联DexFile,最后用一个DexOrJar关联DvmDex,并将DexOrJar放入hash表中。

我们c/c++则可以直接绕开java层或jni,直接去调用libdvm.so的内部函数去进行打开,以及打开后的使用。这些内部函数使用的是DvmDex。

在内部支持的打开函数里面,最上层的是dvmRawDexFileOpen,也就是Dalvik_dalvik_system_DexFile_openDexFile直接调用的内部函数。这个函数完成了比较多的事,如创建odex,优化dex进odex,然后才是实质上的打开。

实质上去打开dex的内部函数分别有dvmDexFileOpenFromFd以及dvmDexFileOpenPartial。dvmDexFileOpenFromFd的参数是odex的文件描述符,dvmDexFileOpenPartial的参数是odex或dex的映像。这两个函数都会返回DvmDex。并且最终使用dexFileParse实质地将dex的反射内容加载进DexFile。

dvmRawDexFileOpen,最上层的内部打开函数

dvmDexFileOpenPartial和dvmDexFileOpenFromFd,返回DvmDex,可用于其它内部函数调用

dexFileParse,最低端,也就是最实质的打开函数

使用dvmDefineClass就可是直接将类从Dex加载到ClassLoader,并不需要经过Java层或Jni来进行类的加载。

在libdvm.so只有少数几个函数是用extern "C"风格的链接符号导出的,dalvik却是c++项目,也就是说其它符号都使用了c++的风格,所以你并不能直接通过直观的函数名来进行函数符号的获取,而必须使用它对应的c++风格的真实链接符号。

下面是我将python移植后使用的pyjni.py,使用ctypes获取符号将名字做映射。这些符号可以通过objdump取得。

这样我就能在程序运行的同时手动去使用libdvm.so的内部函数,像命令一样使用,而不用每次都进行ndk编译。

使用 libdvm.so 内部函数dvm* 加载 dex的更多相关文章

  1. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  2. android加固系列—6.仿爱加密等第三方加固平台之动态加载dex防止apk被反编译

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5402599.html ] 此方案的目的是隐藏源码防止直接性的反编译查看源码,原理是加密编译好的 ...

  3. Android应用安全之外部动态加载DEX文件风险

    1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...

  4. Android 插件技术:动态加载dex技术初探

    1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...

  5. Android拆分与加载Dex的多种方案对比

    http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207151651&idx=1&sn=9eab282711f4eb2b ...

  6. Dex动态加载

    Dex动态加载是为了解决什么问题? 在Android系统中,一个App的所有代码都在一个Dex文件里面. Dex是一个类似Jar的存储了多个Java编译字节码的归档文件. 因为Android系统使用D ...

  7. Android系统下的动态Dex加载

    1 问题在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把使用 ...

  8. 浅析dex文件加载机制

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

  9. Android系统下的动态Dex加载与app速度优化

    1 问题 在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把 ...

随机推荐

  1. Android 开源优秀的项目

    webrtc square/picasso  Android 的一个强大的图像下载和缓存库 A powerful image downloading and caching library for A ...

  2. SSE 系列内置函数中的 shuffle 函数

    SSE 系列内置函数中的 shuffle 函数 邮箱: quarrying@qq.com 博客: http://www.cnblogs.com/quarryman/ 发布时间: 2017年04月18日 ...

  3. 【BFS + Hash】拼图——携程2017春招编程题2

    写在前面 前天参加了携程的网测--还是感觉自己太!渣!了!    _(:з」∠)_ 时光匆匆啊,已经到了开始思考人生的时候了(算了不矫情了)--总之写个博客来督促一下自己.之前太懒了,很多时候都是输在 ...

  4. PHP count() 函数

    count() 函数计算数组中的单元数目或对象中的属性个数. 对于数组,返回其元素的个数,对于其他值,返回 1.如果参数是变量而变量没有定义,则返回 0.如果 mode 被设置为 COUNT_RECU ...

  5. JS基础——循环很重要

    介绍循环之前,首先要说一下同样很重要的if-else结构,switch-case结构 ①if-else结构 if(判断条件) { 条件为true时执行 } else{ 条件为false时执行 } ②i ...

  6. [Linux] Linux 中的基本命令与目录结构

    Linux 中的基本命令与目录结构 目录 一.Linux 基本目录结构 二.基本命令 三.浏览目录 四.中间命令 五.更改密码 六.环境变量和 shell 变量 七.命令路径 八.文本编辑器 九.获取 ...

  7. poj3020二分图匹配

    The Global Aerial Research Centre has been allotted the task of building the fifth generation of mob ...

  8. 关于[JAVA] Apache FTPClient.listFiles()操作“卡死”问题的分析和解决

    项目中使用commons-net-3.0.1.jar实现FTP文件的下载,程序运行到 FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里 ...

  9. .net使用RabbitMQ

    前面的两篇博文算是把RabbitMQ的基础了解了下,今天学习.Net 中RabbitMQ的使用.原本这篇博文是应该上周写的,可在自己使用的过程中出现了一个问题bug:就是在连接服务端时,一直报下面的错 ...

  10. ElasticSearch5在Ubuntu系统下的安装和Java调用

    ElasticSearch是开源搜索平台的新成员,实时数据分析的神器.可以理解为作为搜索的数据库,可以提供搜索功能.对比关系型数据库,具有以下的相似关系: 关系型数据库 数据库 表 行 列 Elast ...