有没有办法使用 Scala 将两个或多个 .dex 文件合并为一个 .dex 文件



我正在对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

defaultConfigmodule/build.gradle文件中,因此它看起来像这样:

android {
    ...
    defaultConfig {
        ...
    
        // Enabling multidex support.
        multiDexEnabled true
        ...
    }
    ...
}

我希望这有所帮助

相关内容

  • 没有找到相关文章

最新更新