8

JanBerkelのSBTAndroidプラグインをハッキングしていて、複数の.dexファイルを.dexすべてを含む1つのファイルにマージする方法があるかどうか迷っていました。

たとえば、私がこれを持っている場合:

classes1.dex
classes2.dex
classes3.dex

classes.dexScalaを使用して(許容できる時間内に)それらを3つすべてを含み、次の構造を持つ 1つのファイルにマージする方法はありますか?

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

4 に答える 4

6

OK、何か見つけたようです。

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は、のようにAndroidSDKdirにありますandroid\sdk\build-tools\26.0.2\lib。dexファイルには64kのメソッド制限があるため、1つのdexファイルにそれほど多くを保持することはできません。

于 2018-07-27T04:24:09.897 に答える
1

それは働いています。r22はこの方法を使用して、最初にandroid-support-v4.jarとannotations.jarをdex形式にpre-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.zipclasses3.dex.zipがマージされました。

于 2019-09-20T05:18:38.380 に答える