2017-05-28 6 views
2

私は既存のマルチデックスアプリをインスタントアプリに移行し、私のアプリを推奨project structureに変換しました。Androidインスタントアプリ:既存のmultidexアプリをベース/フィーチャーモジュールに移行しますか?

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

私の今のbaseFeatureモジュール(以前のマルチデックスアプリケーション)がインスタントアプリケーションアーキテクチャと互換性がないため、これが疑わしいです。

これを処理する最も良い方法は何ですか?そう、

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. 
+0

これは、multi-dexよりもJava 8の依存関係またはretrolambdaの問題によく似ています。 [関連する質問](https://stackoverflow.com/questions/40080002/invokedynamic-not-supported-when-building-for-android)を参照してください。 – pbaumann

+0

私はjava8メソッドを使用しますが、retrolambdaは持っていません。私は依存関係の1つがそれを使用していると思いますか? – prerak

答えて

1

機能モジュールは現時点でmultidexをサポートしていません:新しいインスタントアプリアーキテクチャへの既存のmultidexアプリポートは、それは:)

スタックトレース素晴らしいことだだろうか誰でも指すことができた場合各フィーチャモジュールは単一のデックスを使用する必要があります。

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

  1. 基本機能モジュールから別の機能モジュールにUIコードを移動してみます。 Androidサポートライブラリはメソッド数に最も大きな影響を与えます。そのため、サポートライブラリをベースフィーチャからui-featureモジュールに移動すると役立ちます。
  2. Playサービスは、メソッドカウントに影響する他の主要なライブラリです。可能であれば、プレイサービスsdk全体を追加するのではなく、その部分集合を使用してください。
  3. Apk AnalyzerまたはDexCountを使用して、最も多くのメソッドを使用するライブラリを特定し、それらを別々のフィーチャモジュールに移動しようとします。
  4. Proguard。ミニネーションは、未使用のメソッドを削除し、ベースモジュールを単一のdexに収めることができるようにする必要があります。しかし、Proguardは現時点ではinstantappsでかなり問題があります。モジュールごとに追加のプロガード規則を作成する必要があります。
関連する問題