8

我正在对 Jan Berkel 的 SBT Android 插件进行一些黑客攻击,如果有一种方法可以将多个.dex文件合并到一个.dex包含所有文件的文件中,我正在徘徊。

例如,如果我有这个:

classes1.dex
classes2.dex
classes3.dex

有没有办法使用 Scala(在某个可接受的时间)将它们合并到一个classes.dex文件中,该文件将包含所有 3 个文件并具有以下结构:

classes.dex
|-- classes1/...
|-- classes2/...
\-- classes3/...
4

4 回答 4

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)

资料来源:
DexMerger
DexBuffer
CollisionPolicy

于 2012-06-29T10:15:51.123 回答
2

我找到了一种不需要从源代码编译的方法,只需使用 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 文件不能容纳这么多。

于 2018-07-27T04:24:09.897 回答
1

它正在工作。r22就是用这种方式先将android-support-v4.jar和annotations.jar预dex成dex格式的。Ant 然后使用 dx.bat 将它们与已编译的 .class 文件合并。

于 2013-09-25T05:31:37.120 回答
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 已合并。

于 2019-09-20T05:18:38.380 回答