指令中寄存器值>= v16时,需要对指令做expand,在做expandedPrefix操作(在原指令前加扩展指令)时,要检查需要兼容的寄存器bitSet值,如果需要兼容的寄存器size为0,则不做扩展。对于有目标寄存器的指令,会在检查前将目标寄存器的bitS et位置为0,这样需要兼容的寄存器size会-1,size为0就不做扩展了,在处理2addr时这里遇到了badcase,2addr指令的第一个寄存器既是目标寄存器又是源寄存器,如果>=v16,也是应该做兼容处理的,但由于是目标寄器,对应bitSet位被置0了,会出现 size为0的情况,不添加prefix指令,输出到dex后,在运行时出现verify rejected错误; 对iput-wide,iget-wide,sget-wide, sput-wide四个指令的dexregisterlist类型进行修正 getOrCreateLabel offset越界时不进行处理
指令中寄存器值>= v16时,需要对指令做expand,在做expandedPrefix操作(在原指令前加扩展指令)时,要检查需要兼容的寄存器bitSet值,如果需要兼容的寄存器size为0,则不做扩展。对于有目标寄存器的指令,会在检查前将目标寄存器的bitS et位置为0,这样需要兼容的寄存器size会-1,size为0就不做扩展了,在处理2addr时这里遇到了badcase,2addr指令的第一个寄存器既是目标寄存器又是源寄存器,如果>=v16,也是应该做兼容处理的,但由于是目标寄器,对应bitSet位被置0了,会出现 size为0的情况,不添加prefix指令,输出到dex后,在运行时出现verify rejected错误;
对iput-wide,iget-wide,sget-wide, sput-wide四个指令的dexregisterlist类型进行修正
getOrCreateLabel offset越界时不进行处理
Titan-Dex是面向Android Dalvik(ART)字节码(bytecode)格式的操纵框架,可以在二进制格式下实现修改已有的类,或者动态生成新的类。功能类似于著名的针对JVM字节码格式的ASM框架,在Android平台上从JVM Class格式到Dex格式要经过dx、d8等工具的转换, 有些情况下会造成期望结果的失真,而Titan-Dex针对Dalvik(ART)字节码格式,可以所操纵就所得的效果,在有些场景下更加适合,比如在Titan-Hotfix,还有classes.dex体积分析与优化等项目中就使用了Titan-Dex。基于Titan-Dex最基础的操纵框架能力,还包含了一系列的字节码转换、代码流图分析、multi-dex分包等工具集合。
使用上非常类似于ASM框架,如果需要修改或者新增Dalvki(ART)字节码,请同时参考Android官方文档
最新版本已经发布到jcenter上
implementation("com.baidu.titan.dex:dex-core:1.0.9") implementation("com.baidu.titan.dex:dex-io:1.0.9")
DexItemFactory dexFactory = new DexItemFactory(); MultiDexFileBytes mdfb = MultiDexFileBytes.createFromZipFile(new File("test.apk")); // dex reader MultiDexFileReader mdReader = new MultiDexFileReader(dexFactory); mdfb.forEach((dexId, dexBytes) -> { mdReader.addDexContent(dexId, dexBytes.getDexFileBytes()); }); mdReader.accept(new MultiDexFileVisitor() { @Override public DexFileVisitor visitDexFile(int dexId) { return new DexFileVisitor() { @Override public DexClassVisitor visitClass(DexClassVisitorInfo classInfo) { return new DexClassVisitor() { @Override public void visitBegin() { } @Override public void visitSourceFile(DexString sourceFile) { } @Override public DexAnnotationVisitor visitAnnotation(DexAnnotationVisitorInfo annotationInfo) { return super.visitAnnotation(annotationInfo); } @Override public DexFieldVisitor visitField(DexFieldVisitorInfo fieldInfo) { return super.visitField(fieldInfo); } @Override public DexMethodVisitor visitMethod(DexMethodVisitorInfo methodInfo) { return super.visitMethod(methodInfo); } @Override public void visitEnd() { } }; } }; } }); // dex node MultiDexFileNode mdfn = new MultiDexFileNode(); mdReader.accept(mdfn.asVisitor()); Map<Integer, DexFileNode> dexFiles = mdfn.getDexNodes(); dexFiles.forEach((dexId, dexFileNode) -> { List<DexClassNode> classes = dexFileNode.getClassesList(); // ... });
在dex-test/src/test目录下编写了多个测试用例,可以通过命令行,或者在android studio中执行测试
欢迎一起参与改进Titan-Dex!提交的代码需通过code style检查,完成自测,有相应的单元测试用例。
This project is licensed under the Apache-2.0 license - see the LICENSE file for details
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
Titan-Dex字节码操作框架
描述
Titan-Dex是面向Android Dalvik(ART)字节码(bytecode)格式的操纵框架,可以在二进制格式下实现修改已有的类,或者动态生成新的类。
功能类似于著名的针对JVM字节码格式的ASM框架,在Android平台上从JVM Class格式到Dex格式要经过dx、d8等工具的转换, 有些情况下会造成期望结果的失真,而Titan-Dex针对Dalvik(ART)字节码格式,可以所操纵就所得的效果,在有些场景下更加适合,比如在Titan-Hotfix,还有classes.dex体积分析与优化等项目中就使用了Titan-Dex。
基于Titan-Dex最基础的操纵框架能力,还包含了一系列的字节码转换、代码流图分析、multi-dex分包等工具集合。
特性
快速开始
使用上非常类似于ASM框架,如果需要修改或者新增Dalvki(ART)字节码,请同时参考Android官方文档
最新版本已经发布到jcenter上
使用示例
测试
在dex-test/src/test目录下编写了多个测试用例,可以通过命令行,或者在android studio中执行测试
如何贡献
欢迎一起参与改进Titan-Dex!
提交的代码需通过code style检查,完成自测,有相应的单元测试用例。
License
This project is licensed under the Apache-2.0 license - see the LICENSE file for details