问题标签 [android-d8]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
15870 浏览

android - D8和R8安卓的区别

由于android studio 推出了两个新工具D8 和R8。根据谷歌文档,D8 是一个 dex 工具,R8 是一个 progourd 工具,但正如他们的解释一样,两者都在做几乎相同的事情,如下所示:

D8是一个将java字节码转换为dex码的dexer。

R8是一个java程序收缩和缩小工具,将java字节码转换为优化的dex码。

似乎两者都从字面上将java字节码转换为dex码。那么,在转换 dex 代码的情况下,他们实际上在内部做什么?

0 投票
1 回答
2903 浏览

android - Android Studio 3.1:使用 qoppapdf 库时执行任务 transformClassesWithDexBuilderForDebug 时出现 StackOverflowError

随着Android Studio 3.1我们应用程序构建的更新开始在所有机器上随机中断。在我的机器上,构建StackOverflowError在 dexing 过程中中断。何时d8和在构建过程desugaring中被禁用。gradle.properties

该问题似乎与我们在产品应用程序中使用了几年而没有出现问题的 qoppapdf 库有关。这个问题可以通过一个新的 Android 项目重现,其中库 jar 包含在libsdir 中并multidex在 gradle 中使用。StackOverflow 错误如下:

qoppapdf 库可以从这里下载https://www.qoppa.com/android/pdfsdk/evaluate/。然后qoppapdf.jarwhich 位于qpdftoolkit.zip. qoppapdf.jar然后添加到libs项目的目录中。这是我用来重现构建的测试应用程序的非常基本的 build.gradle。与默认 build.gradle 的唯一区别是启用了 multidex:

删除应用内目录和“全局”.gradle目录、构建目录、使 Android Studio 缓存无效以及重新构建应用都不能解决问题。我发现的唯一解决方案是D8完全禁用gradle.properties

这导致警告The option 'android.enableD8' is deprecated and should not be used anymore. Use 'android.enableD8=true' to remove this warning. It will be removed in AGP version 3.3.所以显然不是一个长期的解决方案。任何帮助将不胜感激!

0 投票
0 回答
71 浏览

android - 仅针对少数用户的奇怪 Play 商店更新问题

所以我最近更新了我的应用程序。这不是一个巨大的更新,一些错误修复,从清单中删除了一些广告网络及其各自Activity的条目。Service将 Fabric 与 Firebase 相关联,其中涉及更多更改。我将在下面详细说明这些更改。我更新到 Android Studio 3.1,据我了解,这涉及到对 D8 编译器的更改。

在我的测试手机上,它安装得很好。我与我的 beta 用户进行了数周的更新,没有问题报告,我有大约 25k 的 beta 用户,但显然并非所有人都活跃或每天都在使用它。我开始分阶段推出,从 Play 商店的统计数据来看,到目前为止安装量约为 50k。

我有 3 个用户报告了问题。他们说 Play 商店说安装失败,但应用程序仍然安装。安装需要 10 到 20 分钟。如果他们回到我的旧版本,安装的速度和通常一样快。他们回到新版本,它再次说它失败并且需要 10 到 20 分钟才能安装。不过安装成功了,他们给我发了截图,显示它是新版本。

所做的更改(来自我上一个发布标签的差异):

删除了活动和服务,例如(怀疑这是一个问题):

添加:

gradle3.0.1 到 3.1.0

classpath 'com.google.gms:google-services:3.0.0''com.google.gms:google-services:3.2.0',这是链接到 Firebase 后让 Fabric 工作正常工作的唯一方法。

我尝试了一个没有 D8 编译器的版本,并且尝试过它的 3 个用户报告了这个问题,他说安装时间从 16 分钟下降到 10 分钟,但它仍然给出了失败的错误。看起来D8是罪魁祸首。我有一个不同的用户尝试它并禁用 D8 修复它。

这是错误:

在此处输入图像描述

那么问题可能是什么?我还能尝试什么?我现在暂停更新,以防它影响更多人。

谢谢。

编辑:一位积极帮助我测试的用户只是手动尝试了我的旧 apk 和我的新 apk,他在安装时没有收到任何错误,但新 apk 需要 10 分钟才能安装,而旧 apk 安装速度很快。

编辑:我认识的人对我的应用程序有问题,所以我向他们发送带有小改动的 apk,看看我是否可以隔离问题。我发给他们的最后一个是我以前版本的代码,没有问题,但使用 Android Studio 3.1.1 编译,其中涉及对 gradle 进行一些更改,但不是很多。该apk也发生了问题。

编辑:看起来 D8 是罪魁祸首。在提交错误报告之前,我正在做一些测试。

0 投票
1 回答
626 浏览

java - D8MainDexList$MainDexListException

当我生成签名的 APK 时,Android Studio3.1 D8 编译会抛出一些错误。有没有人见过?

org.gradle.api.tasks.TaskExecutionException:任务':app:transformClassesWithMultidexlistForNjfBetaRelease'的执行失败。在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) 在 org.gradle. .api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51) 在 org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62) 在 org.gradle.api.internal .tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) 在 org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter。581)在 org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) 在 org.gradle.internal .concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)在 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.RuntimeException: com.android.build .api.transform.TransformException:生成主 dex 列表时出错。在 com.android.builder.profile.Recorder$Block。internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92) ... 32 更多原因:com.android.build.api.transform.TransformException:生成主 dex 列表时出错。在 com.android.build.gradle.internal.transforms.D8MainDexListTransform.transform(D8MainDexListTransform.kt:127) 在 com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:221) 在 com。 android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:217) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) ... 48 更多原因:com. android.builder.multidex.D8MainDexList$MainDexListException:com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:87) 处的 com.android.java.lang.NullPointerException。

0 投票
3 回答
1330 浏览

android-studio - Android Studio 使用的 d8.jar 的文件路径是什么?

我知道Android Studio 默认切换到 D8 dexer。但我想知道文件路径是d8.jar什么?d8.jar我在 SDK中找不到dx.jar.

一个典型的dx.jar位于Android/Sdk/build-tools/<VERSION>/lib/

我的第一个想法是 dx.jar 意味着 d8.jar,但似乎并非如此。

dx.jar源代码

dx.jar27.0.3 或更早版本(例如 25.0.0)SDK 中的 .classes 完全相同(我解压缩):

但是新的 d8.jar具有完全不同的结构:

我在 sdk 和 Android Studio 中都使用 d8 关键字搜索文件名,但没有运气:

那么 Android Studio 中 d8.jar 的文件路径在哪里呢?我的 Android Studio 版本3.2 Canary 12已经存在,但是如果 d8.jar 不存在,Android Studio 如何默认调用 d8?或者它隐藏在某个地方?

0 投票
1 回答
184 浏览

android - 使用 Square 的 Wire 时出现 D8 异常

在 Android 项目中添加 Square 的Wire库以支持 Protobuf 后,我在编译期间收到以下 D8 异常:

D8:程序类型已经存在:com.google.protobuf.DescriptorProto$ExtensionRange$ProtoAdapter_ExtensionRange

电线依赖:implementation 'com.squareup.wire:wire-runtime:2.2.0'

GradledependencyInsight在我的项目中揭示了另一个依赖项,即传递引入com.google.protobuf.nano:protobuf-javanano:3.1.0. 所以我添加了一个排除:

但这并没有解决问题。

是什么让 D8 悲伤,我怎样才能让它再次快乐?

更新

有问题的设置是:有 3 个模块A, B, C. A取决于BCB并且C都托管在内部 maven 服务器上,它们都依赖于wire-runtime以下 POM 条目:

我试过 Wire 版本 2.2 和 2.3.0。A当只依赖B或只依赖时,一切都是桃色的,但是当同时依赖和C时,D8 会变得悲伤。ABC

那么你如何依赖于传递依赖于 Wire 的多个模块呢?

0 投票
1 回答
1614 浏览

android - 程序类型已经存在:android.support.v7.appcompat.R

我在尝试使用以下 gradle 和依赖项进行捆绑时遇到问题

项目等级:

应用等级:

和依赖

原因:com.android.tools.r8.errors.CompilationError:程序类型已存在:com.android.tools.r8.utils.ProgramClassCollection.resolveClassConflictImpl(ProgramClassCollection.java:64) 处的 android.support.v7.appcompat.R在 com.android.tools.r8.utils.ProgramClassCollection.lambda$create$0(ProgramClassCollection.java:25) 在 java.util.concurrent.ConcurrentHashMap.merge(ConcurrentHashMap.java:1990) 在 com.android.tools.r8。 com.android.tools.r8.graph.LazyLoadedDexApplication$Builder.build(LazyLoadedDexApplication.java:124) 在 com.android.tools.r8.dex.ApplicationReader.read( ApplicationReader.java:123) 在 com.android.tools.r8.dex.ApplicationReader.read(ApplicationReader.java:86) 在 com.android.tools.r8.GenerateMainDexList.run(GenerateMainDexList.java:40) 在 com.android.tools.r8.GenerateMainDexList.run(GenerateMainDexList.java:110) 在 com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:83) ... 52 更多

根据我的理解,有不同版本的相同库,但无法修复我已经尝试过exclude 和 configureAll选项

0 投票
0 回答
929 浏览

android - 如何抑制 Android D8 构建警告

我最近升级到默认启用 D8 Desugaring 的 Android Studio 3.2。在构建日志中,我看到很多与 D8 相关的警告。谁能指导我如何抑制这些警告?

D8:java.lang.instrument.ClassFileTransformer未找到接口。需要确保脱糖 org.jacoco.agent.rt.internal_8ff85ea.core.runtime.ModifiedSystemClassRuntime$1 是正确的。脱糖将假定此接口没有默认方法。

D8:java.awt.event.ActionListener未找到接口。需要确保脱糖edu.u md.cs.findbugs.gui2.MainFrameMenu$2 是正确的。脱糖将假定此接口没有默认方法。

0 投票
2 回答
15472 浏览

android - 如何解决多个 D8 警告:没有找到,它是默认或静态接口方法脱糖所必需的?

从 3.1.4 升级到 Android Gradle 插件到 3.2.x 后,我收到多个警告,例如:

项目正在使用 Java 1.8 源代码兼容性 (lambdas),看起来警告来自 Android gradle 类 dexer,它已在 AGP 3.2.0 中默认启用。

  1. 我试图proguard-rules.pro用以下几行来抑制这些警告,但似乎没有任何效果。

    /li>
  2. 我可以使警告消失的唯一方法是在文件中设置minifyEnableduseProguardfalsebuild.gradle

  3. 我试过 AGP 3.3.0-alpha13 和新的 AGP 3.2.1 但没有成功。

您可以使用来自https://github.com/mdawid/D8WarningTest的示例项目克隆存储库

0 投票
1 回答
703 浏览

delphi - 如何强制 Delphi 使用 D8.bat 而不是 dx.bat 将 Java 1.8 字节码编译成 DEX 字节码

今天我遇到了一个问题。我的项目需要使用一些使用 Java 1.8 功能的库 (*.jar)。我看到越来越多的库现在使用 Java 1.8 功能(如 webRTC、exoplayer 等)。这样,我们必须进行脱糖

脱糖允许您通过在构建过程中用旧的替换新的字节码和语言 API 来在旧设备上使用这些功能

使用d8.bat(替换dx.bat),默认情况下会打开脱糖。因此,您现在可以在针对旧设备的同时使用大多数最新的语言更改。

当我们编译一个项目时,Delphi 在后台这样做:

dx.bat --dex --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\lib\libwebrtc.jar"

对于包含 Java 1.8 功能的库,这将失败。

所以 Delphi 必须这样做:

d8.bat --lib C:\SDKs\android-sdk-windows\platforms\android-28\android.jar --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\ lib\libwebrtc.jar"

知道如何告诉 Delphi 使用d8.bat而不是dx.bat