我正在对Jan Berkel的SBT Android插件进行一些黑客攻击,如果有一种方法可以将多个.dex
文件合并为一个包含所有文件的.dex
文件,我正在徘徊。
例如,如果我有这个:
classes1.dex
classes2.dex
classes3.dex
有没有办法使用 Scala(在可接受的时间内)将它们合并到一个classes.dex
文件中,该文件将包含所有 3 个文件并具有以下结构:
classes.dex
|-- classes1/...
|-- classes2/...
-- classes3/...
好吧,看来我发现了什么。
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(Max(A, B), C) 相同,前提是您编写一个带有原型
的方法 DexBuffer merge(DexBuffer dexA, DexBuffer dexB)
来源:
德克思合并
DexBuffer
碰撞策略
我找到了一种不需要从源代码编译的方法,只需使用 SDK 编译的 jar 即可。
java -cp dx.jar com.android.dx.merge.DexMerger output.dex input1.dex input2.dex
dx.jar位于Android SDK dir中,就像androidsdkbuild-tools26.0.2lib
一样。 dex 文件有 64k 方法限制,因此它不能在一个 dex 文件中容纳这么多。
正在工作。 R22 使用这种方式将 dex android-support-v4.jar 和注释.jar首先预转换为 dex 格式。然后,Ant 使用 dx.bat 将它们与编译的.class文件合并。
单独压缩,如 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
就是这样。现在你在class.dex中有一个class.dex.zip与class1.dex.zip class2.dex.zip class3.dex.zip合并。
未过时的方法
以防万一有人像我一样偶然发现了这个问题,所有这些答案现在都已经过时了(我只是在谈论这个问题中这个问题之前回答的答案)
当前合并 dex 文件的方法是这样的:
d8 classes1.dex classes2.dex classes3.dex
dx
已更名为d8
现在它更简单、更干净
d8
可以在 C:\Users\$your_user\AppData\Local\Android\Sdk\build-tools\$version\d8 中找到(在 Windows 中)
您可以将任意数量的 dex 文件合并在一起,但是:
dex 文件的最大方法量为 65,536(等于 64K,A K 等于一公斤等于 1024)
如果您遇到该问题,那么此链接可能会有所帮助。链接的结论是您应该使用--multi-dex
选项。因此,该命令将如下所示:
d8 --multi-dex classes1.dex classes2.dex classes3.dex
并且您需要添加该行
multiDexEnabled true
在defaultConfig
的module/build.gradle
文件中,因此它看起来像这样:
android {
...
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
...
}
...
}
我希望这有所帮助