Не удалось скомпилировать apk с Android Studio 3.2 + Windows - PullRequest
0 голосов
/ 29 мая 2018

Недавно мне пришлось переключиться на Android Studio 3.2 Canary, чтобы использовать новые компоненты AndroidX.

Моя основная среда разработки - Mac / OSX, и все работает отлично.Однако на этой неделе мне пришлось переключиться на Windows, и при компиляции apk я получаю следующее исключение.

Поскольку я использую AndroidX, мне пришлось включить в файле gradle.properties:

  • android.enableJetifier = true
  • android.useAndroidX = true

Вот исключение.

Caused by: com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\rafael.chagas\.gradle\caches\transforms-1\files-1.1\jetified-play-services-basement-15.0.1.aar\a98f8e9d46ed106e8653ab19e7672193\jars\classes.jar
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.launchProcessing(DexArchiveBuilderTransform.java:877)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.lambda$convertToDexArchive$7(DexArchiveBuilderTransform.java:802)
    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.builder.dexing.DexArchiveBuilderException: Error while dexing.
    at com.android.builder.dexing.D8DexArchiveBuilder.getExceptionToRethrow(D8DexArchiveBuilder.java:124)
    at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:101)
    at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.launchProcessing(DexArchiveBuilderTransform.java:872)
    ... 6 more
Caused by: java.lang.NullPointerException: entry
    at java.util.zip.ZipFile.getInputStream(ZipFile.java:346)
    at com.android.tools.r8.ArchiveClassFileProvider.getProgramResource(ArchiveClassFileProvider.java:91)
    at com.android.builder.dexing.r8.CachingArchiveClassFileProvider.lambda$getProgramResource$0(CachingArchiveClassFileProvider.java:38)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
    at com.android.builder.dexing.r8.CachingArchiveClassFileProvider.getProgramResource(CachingArchiveClassFileProvider.java:38)
    at com.android.builder.dexing.r8.ClassFileProviderFactory$OrderedClassFileResourceProvider.getProgramResource(ClassFileProviderFactory.java:78)
    at com.android.tools.r8.utils.ClassProvider$ClassFileResourceReader.collectClass(ClassProvider.java:97)
    at com.android.tools.r8.utils.ClassMap$ConcurrentClassLoader.get(ClassMap.java:241)
    at com.android.tools.r8.utils.ClassMap$ConcurrentClassLoader.get(ClassMap.java:217)
    at com.android.tools.r8.utils.ClassMap.get(ClassMap.java:115)
    at com.android.tools.r8.graph.LazyLoadedDexApplication.definitionFor(LazyLoadedDexApplication.java:47)
    at com.android.tools.r8.graph.AppInfo.definitionFor(AppInfo.java:62)
    at com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.findDefinitionFor(InterfaceMethodRewriter.java:255)
    at com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.rewriteMethodReferences(InterfaceMethodRewriter.java:140)
    at com.android.tools.r8.ir.conversion.IRConverter.rewriteCode(IRConverter.java:675)
    at com.android.tools.r8.ir.conversion.IRConverter.convertMethodToDex(IRConverter.java:346)
    at com.android.tools.r8.graph.DexClass.forEachMethodThrowing(DexClass.java:132)
    at com.android.tools.r8.ir.conversion.IRConverter.lambda$convertClassesToDex$2(IRConverter.java:332)
    at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:117)
    at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:38)
    at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:77)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:260)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
    at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:66)
    at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:36)
    at com.android.tools.r8.ir.conversion.IRConverter.convertClassesToDex(IRConverter.java:330)
    at com.android.tools.r8.ir.conversion.IRConverter.convertToDex(IRConverter.java:245)
    at com.android.tools.r8.D8.optimize(D8.java:202)
    at com.android.tools.r8.D8.run(D8.java:162)
    at com.android.tools.r8.D8.lambda$run$1(D8.java:92)
    at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:56)
    at com.android.tools.r8.utils.ExceptionUtils.withD8CompilationHandler(ExceptionUtils.java:41)
    at com.android.tools.r8.D8.run(D8.java:89)
    at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:99)

Целевой файл .jar выше является случайным,Может произойти сбой с любой из библиотек проекта.

Я знаю, что это версия Android Studio от Canary, но меня интригует то, что это происходит только с ОС Windows.Протестировано в Linux, OSX и не было никаких проблем.

Спасибо!

1 Ответ

0 голосов
/ 15 июня 2018

Наконец я нашел основную причину и исправил эту проблему.

Изучив сообщения об ошибках, класс Android R8, вызвавший исключение, был: src / main / java / com / android / tools/r8/ArchiveClassFileProvider.java

Копая в источник R8, я нашел последние журналы и совершенно новый коммит, который изменяет кодировку при чтении файлов .zip:

https://r8.googlesource.com/r8/+/a26659a1d07b4dc4ad0c3f8dbafd47d49efbc438

Этот коммит меняет способ, которым R8 читает zip-архивы, используя кодировку UTF-8, и избегает использования кодировки платформы.Вот почему произошел сбой только Windows.

Я протестировал последний релиз R8 с этим коммитом, и он работал!Просто нужно добавить эти (+) строки в ваш проект build.gradle file.

 repositories {
     google()
     jcenter()
+    maven {
+        url "http://storage.googleapis.com/r8-releases/raw"
+    }
 }
dependencies {
+    classpath 'com.android.tools:r8:1.2.28'
     classpath 'com.android.tools.build:gradle:3.2.0-alpha18'
     classpath 'com.google.gms:google-services:4.0.0'
 }

"com.android.tools:r8:1.2.28" must будет первым в зависимостях.

Согласно BUG 109992855 , новая версия R8 будет отправлена ​​в Android Studio 3.2 примерно через две недели.Тем временем вы должны использовать вышеуказанное исправление.

Надеюсь, что это поможет любому, кто наткнулся на эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...