解决使用dx工具将class格式的jar包转成dex格式的二进制jar包时可能遇到的问题

前言

 由于实验室的某个项目需要,得将soot.jar转为dex格式的二进制jar包,但是在这过程中遇到了一些问题,这篇博客就是用来记录在将较大的jar包转成dex格式的jar包过程中可能遇到的问题以及对应的解决办法。

 问题 & 解决

问题1:OutOfMemoryError错误

解决使用dx工具将class格式的jar包转成dex格式的二进制jar包时可能遇到的问题_第1张图片 

在这里,产生java.lang.OutOfMemoryError这个错误的原因是因为分配给dx工具的JVM内存过小,可以通过增加jvm的heap内存大小来解决。

具体解决办法:

修改dx.bat文件,将原来的1G的heap内存改成更大的值,本文的做法是将其改成4G。

问题2: Uncaught translation error: com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

解决使用dx工具将class格式的jar包转成dex格式的二进制jar包时可能遇到的问题_第2张图片 

需要设置支持的最小sdk版本

具体解决办法:

 使用dx工具时通过--min –sdk –version参数来指定支持的最小sdk版本

解决使用dx工具将class格式的jar包转成dex格式的二进制jar包时可能遇到的问题_第3张图片

问题3:dex中的方法数超过65536

解决使用dx工具将class格式的jar包转成dex格式的二进制jar包时可能遇到的问题_第4张图片

Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、内容库方法以及自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”。

具体解决办法:

解决这个问题的关键是生成多个dex文件,可以通过dx工具中的 --multi-dex指令来实现。

你可能感兴趣的:(问题解决)