当一个项目足够大的时候,显然这个方法数的上限是不够的。(二):Dexopt 使用 LinearAlloc 来存储应用的方法信息。Dalvik LinearAlloc 是一个固定大小的缓冲区。...尽管在新版本的 Android 系统中,DexOpt 修复了方法数65K的限制问题,并且扩大了 LinearAlloc 限制,但是我们仍然需要对低版本的 Android 系统做兼容。 回头说项目。...这种方法优点是配置比较简单,但是最大的缺点是不能指定哪些类必须包含在主 dex 中,容易导致应用启动时某些类找不到,出现 Class Not Found Exception。...) 中找不到 com.example.AppService.AstApp(Application 类)。...理论上,启动必需的代码应该放在主 dex 中,这些代码包括 Application、BaseActivity 等代码以及继承自它们的代码的一个依赖集。
中的 findClass 方法中 , 主要调用 DexPathList pathList 成员的 findClass 函数查找类 ; 一、DexPathList.java#findClass 类加载函数源码分析...如果已找到类但尚未找到 * 已定义,则此方法将在定义中定义它 * 构造此实例时使用的上下文。...- 在 DexFile.java#loadClassBinaryName 函数中 , 调用了 defineClass 方法 , 在 defineClass 方法中 , 调用了 native 函数 defineClassNative...它们是内存映射的 * 由VM只读。 */ public final class DexFile { /** * 加载一个类。...* * 如果类 * 找不到,因为在每个 * 在我们查看的第一个DEX文件中找不到类的时间。
其余的属性,因为在加固中没有用到。这里就不对它们进行过多解释。 2、odex文件 odex是OptimizedDEX的缩写,表示经过优化的dex文件。存放在/data/dalvik-cache目录下。...由于Android程序的apk文件为zip压缩包格式,Dalvik虚拟机每次加载它们时需要从apk中读取classes.dex文件,这样会耗费很多cpu时间,而采用odex方式优化的dex文件,已经包含了加载...Dalvik虚拟机将dex文件映射到内存中后是Dalvik格式,在Android系统源码的dalvik/libdex/DexFile.h文件中它的定义如下。...dexopt的主程序为OptMain.cpp,其中处理apk/jar/zip文件中的classes.dex的函数为extractAndProcessZip(),extractAndProcessZip(...这个函数调用verifyMethod()函数对类的所有直接方法与虚方法进行验证,verifyMethod()函数具体的工作是先调用verifyInstructions()函数来验证方法中的指令及其数据的正确性
Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及代码中的方法。...默认情况下,Dalvik 限制应用的每个 APK 只能使用单个 classes.dex 字节码文件。...运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于方法的所有 DEX 文件(而不是仅在主 classes.dex 文件中搜索)。...例如,如果代码使用自检机制或从原生代码调用 Java 方法,那么这些类可能不会被识别为主 DEX 文件中的必需项。...因此,如果接收到 java.lang.NoClassDefFoundError,则必须使用构建类型中的 multiDexKeepFile 或 multiDexKeepProguard 属性声明它们,以手动将这些其他类指定为主
(Native Method) 原因 由于Project的Application继承关系,父类与子类不在同一个Dex中,导致在加载的时候会Crash。...因为5.0以下的手机使用的是Dalvik虚拟机,在Dex加载的时候,通过JIT即时编译生成字节码然后运行,而Art虚拟机则是在安装的时候,已经将Dex转换成aot文件,而aot文件已经是可以执行的二进制文件...所以,在5.0以下的手机中,Dalvik会优先加载第一个Dex,然后反射到Application然后进行初始化,如果子类不在第一个Dex中,那么就会出现ClassNotFoundException的异常...举例 例如,一个Project的Application为MainApplication,该类存在于A工程中。而该类继承自SubApplication,该类存在于B工程中。...而A工程,在classes.dex,B工程在classes2.dex中。而在打完包出来后,在4.x的手机中会出现该异常。 参考资料 配置方法数超过 64K 的应用
Dalvik linearAlloc是一个固定大小的缓冲区。在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备。...超过最大方法数限制的问题,是由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法,也就是4个字节共计最多表达65536个method,field/class...通过指令字节码验证过程包括扫描DEX文件在每个类的每个方法,我们的目标是识别 非法的指令序列,这样我们不需要在运行时检测它们,对于“精确”垃圾回收,大量的计算也是必须的,在Dalvik Bytecode...对每一个方法调用检测访问权限是非常高昂的, Dalvik Bytecode Verfier Notes这里有强调这个问题。...删除空的方法,简单的例子就是对象的初始化,什么都不做的构造方法,但是每当对象分配的时候又必须需要,指令被新版本替代,新的版本中除了调试器无操作, Append pre-computed data.
下面的代码中 , 列出了 loadDexFile 方法 ; 传入的参数分别是 Dex 文件的路径 , 优化后的 Dex 文件路径 , 标志位 , 一般是 0 ; /** * 操纵DEX文件。...它们是内存映射的 * 由VM只读。...src/main/java/dalvik/system/DexFile.java 二、DexFile 构造函数分析 ---- 在 loadDexFile 方法 , 调用到 DexFile 构造方法 ;...在 DexFile 构造方法中 , 调用了 mCookie = openDexFile(sourceName, outputName, flags); 方法打开 Dex 文件 ; /** * 操纵DEX...它们是内存映射的 * 由VM只读。
前言 Android 的 Dalvik 虚拟机和 Java 虚拟机的运行原理相同都是将对应的 java 类加载在内存中运行。...dex 在 Android 中的加载和 class 在 jvm 中的相同都是基于双亲委派模型,都是调用ClassLoader 的 loadClass 方法加载类。...Android系统中类加载的双亲委派机制 Android5.1 源码中 ClassLoader 的 loadClass 方法 protected Class<?...这通常是一个ZIP/JAR 文件,其中包含“classes.dex”。 * VM将在/data/dalvik-cache中生成相应文件的名称,然后打开它,如果允许系统权限,可能会首先创建或更新它。...不要在/data/dalvik-cache中传递文件名,因为预期该命名文件为原始状态(pre-dexopt)。
、DexPathList 相关载源码分析 六、多 DEX 存放位置 一、65535 方法数限制和 MultiDex 配置 ---- 在 Android 开发中 , 尤其是项目比较大时 , 或引入的依赖库过多...官方给出了解决方案 : https://developer.android.google.cn/studio/build/multidex.html 5.0 之前的版本 , 应用中只能使用单个 classes.dex...> findClass(String name) 方法查找类的 , 给定一个全类名字符串 , 返回字节码 , 查找类通过调用 pathList 的 findClass 方法 , 获取字节码文件 , pathList...方法 , 主要是遍历 Element[] dexElements 成员 , Element[] dexElements 数组中保存的就是内存中的 DEX 文件 , 如果 APP 中有 3 个 DEX.../src/main/java/dalvik/system/DexPathList.java 六、多 DEX 存放位置 上述 DexPathList 中的 Element[] dexElements 成员就保存了当前应用中的
0xffff]: 65536 超过最大方法数限制的问题,是由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法,也就是2个字节共计最多表达65536个method...默认情况下,Dalvik 限制应用的每个 APK 只能使用单个 classes.dex 字节码文件。...运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件(而不是仅在主 classes.dex 文件中搜索)。...例如,如果代码使用自检机制或从原生代码调用 Java 方法,那么这些类可能不会被识别为主 DEX 文件中的必需项。...因此,如果您收到 java.lang.NoClassDefFoundError,则必须使用构建类型中的 multiDexKeepFile 或 multiDexKeepProguard 属性声明它们,以手动将这些其他类指定为主
IDE Eclipse & Android Studio(Google官方) Google已经明确说明不再支持Eclipse,我们在官网也找不到ADT Bundle的更新,所以建议童鞋们尽早脱离...Eclipse的束缚,投入到AS的怀抱中吧。...基于如何下载和安装AS,大家尽管百度,建议购买V**,因为AS的更新会比较频繁,有时候各种需要访问外国网站的工作,没有V**基本上想死。...Platform Tools- Build Tools这些都可以在我们下载的SDK中找到 SDK Tools android – 用于创建更新项目、虚拟机、sdk ddms – Dalvik...文件 zipalign – 对apk文件进行优化 以上所介绍的开发工具,都需要各位去熟悉掌握,具体的使用方法,官方还有网上的一些资源已经介绍得非常详细,小巫就不在这里继续总结了。
尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容. ...类加载器只会寻找classes.dex,所以需要将它们进行合并才能使得被识别 当然,现在有了android.support.multidex.jar的支持,一切都会变得非常简单,首先我们看一下相关源码的目录...Application类中逻辑的注意事项: Application 中的静态全局变量会比MutiDex的 instal()方法优先加载,所以建议避免在Application类中使用main classes.dex...在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备。dexopt使用LinearAlloc来存储应用的方法信息。...避免应用过大、方法过多仍然是Android开发者要注意的问题。Mihai Parparita的开源项目dex-method-counts可以用于统计APK中每个包的方法数量。
这样来看,可以通过自定义类加载器使得相同全限定名但实现不同的类存在于同一 JVM 中,也就是说,类加载器相当于给类在包名之上又加了个命名空间。...安卓应用和普通的 java 应用不同,它们运行于 Dalvik 虚拟机。JVM 是基于栈的虚拟机,而 Dalvik 是基于寄存器的虚拟机。Android采用 dex 作为储存类字节码信息的文件。...在构造方法中 DexFile 就完成了 dex 文件的加载过程。...,这个方法调用本地法 defineClassNative() 从 dex 中查找目标类,如果找到了,就把这个代表这个类的 Class 对象返回。...dex 进行了优化,并且会输出到 /data/dalvik-cache 目录下(android M 在这目录下找不到,应该是改成了 /data/app/com.example.app-x/oat 目录下
类库中的一些数据结构使用基于数组实现的二叉树来存储元素。在 Java 代码中有许多地方使用 移位操作 来代替二次幂的乘除法。...其中的每一步都有机会做优化,但是它们做了吗?...最终,每个方法实际上都仅仅使用了一个字节码来操作相关联的整型数运算。它们都使用了 v1 寄存器来保存第一个方法参数,另外还需要一个字面量 1 或者 2。...ART 识别到了这两个方法具有一样的方法体,并在编译成 x86 汇编代码时进行了去重操作。...然后,divide 和 shiftRight 的实现是不一样的,它们没有共同使用 sar 来进行右移一位的操作。divide 方法在调用 sar 之前额外使用了四条指令,来处理输入是负数的情况。
文章目录 一、拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二、加载 DEX 文件并执行其中的方法 三、MainActivity 及执行结果 四、博客资源 一、拷贝 Assets...DEX 字节码文件 ) 博客中 , 准备了 classes.dex 字节码文件 , 将字节码文件拷贝到了 将 app\src\main\assets\classes.dex 目录中 ; 解析字节码文件时..., 加载的类时 Class 对象 , 通过反射调用其方法即可 ; 代码示例 : /** * 测试调用 Dex 字节码文件中的方法 * @param context...classloaderLog(); // 拷贝 dex 文件 mDexPath = copyFile(); // 测试 DEX 文件中的方法...Log.i("HSL", "文件拷贝完毕"); } return dexPath; } /** * 测试调用 Dex 字节码文件中的方法
所以先从Java层跳到native层,改变指定方法的nativeFunc值,然后在改变之后的函数中调用Java层的回调即可。...与Dexposed框架相比AndFix框架更加轻便好用,在进行热修复的过程中更加方便了 缺点: 面临稳定性与兼容性问题 AndFix不支持新增方法,新增类,新增field等 AndFix(Dexpsed...Sophix对dex的解决方案 Dalvik下采用阿里自研的全量dex方案:不是考虑把补丁包的dex插到所有dex前面(dex插桩),而是想办法在原理的dex中删除(只是删除了类的定义)补丁dex中存在的类...,这样让系统查找类的时候在原来的dex中找不到,那么只有补丁中的dex加载到系统中,系统自然就会从补丁包中找到对应的类。...Art下本质上虚拟机以及支持多dex的加载,Sophix的做法仅仅是把补丁dex作为主dex(classes.dex)而已,相当于重新组织了所有的dex文件:把补丁包的dex改名为classes.dex
openDexFile 函数 , 最终调用了 openDexFileNative 方法 ; openDexFileNative 方法在 C++ 代码中实现 , 本篇博客介绍该 C++ 实现 ; 一、查找...地址的 Full Search 中 , 搜索 openDexFileNative 方法 , 注意选中 dalvik 模块 ; 二、dalvik_system_DexFile.cpp 源码分析 ----...* 为了优化这一点,我们可以在散列中搜索现有条目 * 表并重新计算它们。需要原子操作或添加“已同步” * 指向在此调用的非本机代码。 * * TODO:应该使用“long”作为指针。...后者可能会 * 基于稍后出现的类优化字段/方法访问 * 在类路径中。...* 如果失败了(或者一开始就没有尝试过),可以尝试一下 * 拉链里面有一个“classes.dex”。
这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创。下面我们来介绍一下这种方法。...我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时dalvik虚拟机加载classes.dex文件并且用dexopt命令进行进一步的优化成...我们的方法就是在这个过程中修改dalvik指令来达到我们的目的。 一、dex文件格式 dex的文件格式通常有7个主要部分和数据區组成,格式如下: ?...method_ids_size 0x58 4 方法列表里方法个数。 method_ids_off 0x5C 4 方法列表基地址。 class_defs_size 0x60 4 类定义类表中类的个数。...过程是将apk中的classes.dex解压后,用dexopt处理并保存为/data/dalvik-cache/data@app@-X.apk@classes.dex文件。
么(如果不是的话在application中写入multidex.install会对apk启动造成影响么) 如果你比较“懒”,,懒得看老罗的源码分析,,,长篇大论 请“简要”看完以下“简要”内容 一:Dalvik.../commands.c中 函数dexopt首先是读取系统属性persist.sys.dalvik.vm.lib的值,接着在/data/dalvik-cache目录中创建一个odex文件。...OAT文件包含有两个特殊的段oatdata和oatexec,前者包含有用来生成本地机器指令的dex文件内容,后者包含有生成的本地机器指令,它们之间的关系通过储存在oatdata段前面的oat头部描述。...APK安装过程中生成的OAT文件的输入只有一个DEX文件,也就是来自于打包在要安装的APK文件里面的classes.dex文件。实际上,一个OAT文件是可以由若干个DEX生成的。..., …, classesN.dex,依次写入到/data/data/pkgName/code_cache/secondary-dexes/apkName.apk.classes2.zip等zip文件的classes.dex
领取专属 10元无门槛券
手把手带您无忧上云