3

既存の multi-dex アプリを Instant アプリに移行し、アプリを推奨プロジェクト構造に変換しました。

正常に解決された関連するコンパイルの問題が多数ありましたが、インストール可能な「アプリケーション」モジュールを実行しようとすると、スタック トレースで以下に示すように次のエラーが発生します。

これは、現在のbaseFeatureモジュール (以前の multi-dex アプリ) がインスタント アプリ アーキテクチャと互換性がないためだと思われます。

これを処理する最善の方法についての手がかりはありますか? 誰かが既存のマルチデックス アプリを新しいインスタント アプリ アーキテクチャに移植する方法を指摘できれば、それは素晴らしいことです :)

スタックトレース:

Error converting bytecode to dex:
Cause: InvokeDynamic not supported
com.android.dx.cf.iface.ParseException: InvokeDynamic not supported
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:593)
    at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677)
    at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:720)
    at com.android.ide.common.internal.WaitableExecutor.waitForTasksWithQuickFail(WaitableExecutor.java:146)
    at com.android.builder.dexing.DexArchiveBuilder.processOutputs(DexArchiveBuilder.java:110)
    at com.android.builder.dexing.DexArchiveBuilder.convert(DexArchiveBuilder.java:91)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransformCallable.lambda$cacheMissAction$0(DexArchiveBuilderTransformCallable.java:236)
    at com.android.builder.utils.FileCache.lambda$createFile$1(FileCache.java:260)
    at com.android.builder.utils.FileCache.lambda$null$5(FileCache.java:443)
    at com.android.builder.utils.SynchronizedFile.doActionWithSingleProcessLocking(SynchronizedFile.java:291)
    at com.android.builder.utils.SynchronizedFile.write(SynchronizedFile.java:234)
    at com.android.builder.utils.FileCache.lambda$queryCacheEntry$6(FileCache.java:415)
    at com.android.builder.utils.SynchronizedFile.doActionWithSingleProcessLocking(SynchronizedFile.java:291)
    at com.android.builder.utils.SynchronizedFile.read(SynchronizedFile.java:217)
    at com.android.builder.utils.FileCache.queryCacheEntry(FileCache.java:391)
    at com.android.builder.utils.FileCache.createFile(FileCache.java:273)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransformCallable.getFromCacheAndCreateIfMissing(DexArchiveBuilderTransformCallable.java:185)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransformCallable.call(DexArchiveBuilderTransformCallable.java:147)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransformCallable.call(DexArchiveBuilderTransformCallable.java:53)
    at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: com.android.dx.cf.iface.ParseException: InvokeDynamic not supported
    at com.android.dx.cf.cst.ConstantPoolParser.determineOffsets(ConstantPoolParser.java:226)
    at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:132)
    at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
    at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:491)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
    at com.android.builder.dexing.DexArchiveBuilderCallable.parseClass(DexArchiveBuilderCallable.java:86)
    at com.android.builder.dexing.DexArchiveBuilderCallable.call(DexArchiveBuilderCallable.java:70)
    at com.android.builder.dexing.DexArchiveBuilderCallable.call(DexArchiveBuilderCallable.java:43)
    ... 5 more
...while preparsing cst 0032 at offset 000000f1
...while parsing RangeDialogFragment.class

Execution failed for task ':installapp:transformClassesWithDexBuilderForDebug'.
    com.android.build.api.transform.TransformException:  java.lang.RuntimeException: java.lang.RuntimeException:  java.util.concurrent.ExecutionException:  java.util.concurrent.ExecutionException:  com.android.builder.utils.FileCache$FileCreatorException:  
    com.android.builder.dexing.DexArchiveBuilder$DexBuilderException: Unable to convert input to dex archive.
4

1 に答える 1

2

機能モジュールは現時点で multidex をサポートしていないため、各機能モジュールは単一の dex を使用する必要があります。

この問題に対する一般的な解決策はありませんが、いくつかの提案をすることができます。

  1. UI コードを基本機能モジュールから別の機能モジュールに移動してみてください。Android サポート ライブラリはメソッド数に最も大きな影響を与えるため、サポート ライブラリを base-feature モジュールから ui-feature モジュールに移動すると効果的です。
  2. Play Services は、メソッド数に影響を与えるもう 1 つの主要なライブラリです。可能であれば、Play Services SDK 全体を追加せずに、そのサブセットを使用してください。
  3. Apk Analyzer またはDexCountを使用して、最も多くのメソッドを使用するライブラリを特定し、それらを別の機能モジュールに移動しようとします。
  4. プロガード。縮小化により、未使用のメソッドを削除し、ベース モジュールを 1 つの dex に収めるのに役立ちます。ただし、Proguard は現時点で InstantApps ではかなり問題があります。モジュールごとに追加のプロガード ルールを作成する必要があります。
于 2017-11-16T01:55:24.030 に答える