首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dex分包变形记

当一个项目足够大的时候,显然这个方法数的上限是不够的。(二):Dexopt 使用 LinearAlloc 来存储应用的方法信息。Dalvik LinearAlloc 是一个固定大小的缓冲区。...尽管在新版本的 Android 系统,DexOpt 修复了方法数65K的限制问题,并且扩大了 LinearAlloc 限制,但是我们仍然需要对低版本的 Android 系统做兼容。 回头说项目。...这种方法优点是配置比较简单,但是最大的缺点是不能指定哪些类必须包含在主 dex ,容易导致应用启动时某些类找不到,出现 Class Not Found Exception。...) 找不到 com.example.AppService.AstApp(Application 类)。...理论上,启动必需的代码应该放在主 dex ,这些代码包括 Application、BaseActivity 等代码以及继承自它们的代码的一个依赖集。

1.6K110

【Android 逆向】Dalvik 函数抽取加壳 ③ ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName函数 )

的 findClass 方法 , 主要调用 DexPathList pathList 成员的 findClass 函数查找类 ; 一、DexPathList.java#findClass 类加载函数源码分析...如果已找到类但尚未找到 * 已定义,则此方法将在定义定义它 * 构造此实例时使用的上下文。...- 在 DexFile.java#loadClassBinaryName 函数 , 调用了 defineClass 方法 , 在 defineClass 方法 , 调用了 native 函数 defineClassNative...它们是内存映射的 * 由VM只读。 */ public final class DexFile { /** * 加载一个类。...* * 如果类 * 找不到,因为在每个 * 在我们查看的第一个DEX文件找不到类的时间。

24420
您找到你想要的搜索结果了吗?
是的
没有找到

Androiddex文件的加载与优化流程

其余的属性,因为在加固没有用到。这里就不对它们进行过多解释。 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()函数来验证方法的指令及其数据的正确性

2.4K10

学(kao)习(bei)官方关于64k异常处理 ^_^

Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及代码方法。...默认情况下,Dalvik 限制应用的每个 APK 只能使用单个 classes.dex 字节码文件。...运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于方法的所有 DEX 文件(而不是仅在主 classes.dex 文件搜索)。...例如,如果代码使用自检机制或从原生代码调用 Java 方法,那么这些类可能不会被识别为主 DEX 文件的必需项。...因此,如果接收到 java.lang.NoClassDefFoundError,则必须使用构建类型的 multiDexKeepFile 或 multiDexKeepProguard 属性声明它们,以手动将这些其他类指定为主

93820

Android使用MultiDex发生ClassNotFoundException

(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 的应用

1.8K20

实习杂记(31):android多dex方案二

Dalvik linearAlloc是一个固定大小的缓冲区。在应用的安装过程,系统会运行一个名为dexopt的程序为该应用在当前机型运行做准备。...超过最大方法数限制的问题,是由于DEX文件格式限制,一个DEX文件method个数采用使用原生类型short来索引文件方法,也就是4个字节共计最多表达65536个method,field/class...通过指令字节码验证过程包括扫描DEX文件在每个类的每个方法,我们的目标是识别  非法的指令序列,这样我们不需要在运行时检测它们,对于“精确”垃圾回收,大量的计算也是必须的,在Dalvik Bytecode...对每一个方法调用检测访问权限是非常高昂的,  Dalvik Bytecode Verfier Notes这里有强调这个问题。...删除空的方法,简单的例子就是对象的初始化,什么都不做的构造方法,但是每当对象分配的时候又必须需要,指令被新版本替代,新的版本除了调试器无操作, Append pre-computed data.

93640

Android Study 之学(kao)习(bei)官方关于64k异常处理 ^_^

Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及代码方法。...默认情况下,Dalvik 限制应用的每个 APK 只能使用单个 classes.dex 字节码文件。...运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于方法的所有 DEX 文件(而不是仅在主 classes.dex 文件搜索)。...例如,如果代码使用自检机制或从原生代码调用 Java 方法,那么这些类可能不会被识别为主 DEX 文件的必需项。...因此,如果接收到 java.lang.NoClassDefFoundError,则必须使用构建类型的 multiDexKeepFile 或 multiDexKeepProguard 属性声明它们,以手动将这些其他类指定为主

79810

【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )

、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 成员就保存了当前应用

80600

Multidex记录一:介绍和使用

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 属性声明它们,以手动将这些其他类指定为主

1.5K10

Android入门教程AS重制-A002开发工具介绍

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文件进行优化 以上所介绍的开发工具,都需要各位去熟悉掌握,具体的使用方法,官方还有网上的一些资源已经介绍得非常详细,小巫就不在这里继续总结了。

80920

Android 使用android-support-multidex解决Dex超出方法数的限制问题

尽管在新版本的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每个包的方法数量。

1.4K80

Android动态加载入坑指南

这样来看,可以通过自定义类加载器使得相同全限定名但实现不同的类存在于同一 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 目录下

2.1K113

J 神提问:除以 2 还是右移 1 ?

类库的一些数据结构使用基于数组实现的二叉树来存储元素。在 Java 代码中有许多地方使用 移位操作 来代替二次幂的乘除法。...其中的每一步都有机会做优化,但是它们做了吗?...最终,每个方法实际上都仅仅使用了一个字节码来操作相关联的整型数运算。它们都使用了 v1 寄存器来保存第一个方法参数,另外还需要一个字面量 1 或者 2。...ART 识别到了这两个方法具有一样的方法体,并在编译成 x86 汇编代码时进行了去重操作。...然后,divide 和 shiftRight 的实现是不一样的,它们没有共同使用 sar 来进行右移一位的操作。divide 方法在调用 sar 之前额外使用了四条指令,来处理输入是负数的情况。

1.1K20

【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

文章目录 一、拷贝 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 字节码文件方法

50430

Android热修复技术原理详解(最新最全版本)

所以先从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

2.1K50

【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )

openDexFile 函数 , 最终调用了 openDexFileNative 方法 ; openDexFileNative 方法在 C++ 代码实现 , 本篇博客介绍该 C++ 实现 ; 一、查找...地址的 Full Search , 搜索 openDexFileNative 方法 , 注意选中 dalvik 模块 ; 二、dalvik_system_DexFile.cpp 源码分析 ----...* 为了优化这一点,我们可以在散列搜索现有条目 * 表并重新计算它们。需要原子操作或添加“已同步” * 指向在此调用的非本机代码。 * * TODO:应该使用“long”作为指针。...后者可能会 * 基于稍后出现的类优化字段/方法访问 * 在类路径。...* 如果失败了(或者一开始就没有尝试过),可以尝试一下 * 拉链里面有一个“classes.dex”。

38130

android apk 防止反编译技术第二篇-运行时修改字节码

这种方法是在工作在实现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 类定义类表类的个数。...过程是将apkclasses.dex解压后,用dexopt处理并保存为/data/dalvik-cache/data@app@-X.apk@classes.dex文件。

1.4K110

Dalvik,ART与ODEX简析

么(如果不是的话在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

1.5K40
领券