我正在对Jan Berkel的SBT Android插件进行一些攻击,如果有办法将多个.dex
文件合并到一个包含所有这些文件的.dex
文件中,我就会徘徊
例如,如果我有这个:
classes1.dex
classes2.dex
classes3.dex
有没有办法将Scala(在一些可接受的时间内)合并到一个classes.dex
个文件中,该文件将包含所有3个文件并具有以下结构:
classes.dex
|-- classes1/...
|-- classes2/...
\-- classes3/...
答案 0 :(得分:6)
import com.android.dx.io.DexBuffer
import com.android.dx.DexMerger
import com.android.dx.merge.CollisionPolicy
...
val dexA = DexBuffer(File(classes1DexFilePath))
val dexB = DexBuffer(File(classes2DexFilePath))
val dexMerger = DexMerger(dexA, dexB, CollisionPolicy.FAIL)
val dexM = dexMerger.merge()
dexM.writeTo(File(classesDexFilePath))
有人能证实这确实有效吗?
此外,如果这样做,那么合并超过2个dex文件应该与Max(Max(A,B),C)相同,前提是你编写一个带有原型的方法
DexBuffer merge(DexBuffer dexA, DexBuffer dexB)
答案 1 :(得分:1)
它正在运作。 r22首先使用这种方式将dex android-support-v4.jar和annotations.jar预先设置为dex格式。 Ant然后使用dx.bat将它们与已编译的.class文件合并。
答案 2 :(得分:1)
我找到了一种无需从源代码进行编译的方法,只需使用SDK编译的jar。
java -cp dx.jar com.android.dx.merge.DexMerger output.dex input1.dex input2.dex
dx.jar位于Android SDK目录中,例如android\sdk\build-tools\26.0.2\lib
。 dex文件的方法限制为64k,因此不能在一个dex文件中容纳太多文件。
答案 3 :(得分:0)
首先分别将它们压缩为classes1.dex.zip,classes2.dex.zip,classes3.dex.zip,然后按照以下顺序运行
java -jar dx.jar --dex --output=classes.dex.zip classes1.dex.zip classes2.dex.zip classes3.dex.zip
就是这样。 现在,classes.dex.zip中的classes.dex与classes1.dex.zip classes2.dex.zip classes3.dex.zip合并了。