在没有 Gradle 的情况下编译基本 Android 应用程序 - d8 错误

问题描述 投票:0回答:1

我希望将我在 Windows 上原型设计的一个小实用程序移植为一个简单的应用程序。我使用一台已有 10 年历史的计算机,因此从我收集的信息来看,Gradle 和 Android Studio 等工具运行速度太慢,以至于我无法进行有意义的快速迭代。我对 Android 应用程序结构也一无所知,因此通过命令行编译来了解编译的不同阶段无论如何都是有启发性的。

我将列出我经历过的阶段,然后列出我当前的错误,因为我不知道我的设置或某些早期阶段是否可能导致问题。我在尝试编译示例应用程序时遇到错误。

我正在关注本教程:https://hereket.com/posts/android_from_command_line/ (我安装了构建/平台工具和 v28.0.3 的映像并拥有 JDK 22)。

我遇到的差异是: 1-如果没有事先明确创建 gen 文件夹,aapt 将不会运行 2- d8 拒绝了 *.class 参数,所以我手动生成了文件列表(其他一些用户在这里遇到了这个问题:d8:从命令行使用它时出现奇怪的异常

我解决了这里提到的问题:以同样的方式运行适用于 Android 的 dx 或 d8 工具时出错。

d8 目前给我以下错误:

java.lang.IllegalArgumentException at com.android.tools.r8.org.objectweb.asm.ClassReader.<init>(ClassReader.java:160) at com.android.tools.r8.org.objectweb.asm.ClassReader.<init>(ClassReader.java:143) at com.android.tools.r8.org.objectweb.asm.ClassReader.<init>(ClassReader.java:418) at com.android.tools.r8.graph.JarClassFileReader.read(JarClassFileReader.java:66) at com.android.tools.r8.dex.ApplicationReader$ClassReader.lambda$readClassSources$1(ApplicationReader.java:231) at java.base/java.util.concurrent.ForkJoinTask$AdaptedInterruptibleCallable.compute(ForkJoinTask.java:1689) at java.base/java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1641) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1491) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2073) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2035) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
输入命令是这样的:

d8 --debug --output __build\apk\my_classes.jar --no-desugaring __build\obj\ com\user\android_build_test\MainActivity.class \obj\com\user\android_ build_test\R$attr.class __build\obj\com\user\android_build_test\R$id.class __build\obj\com\user\android_build_test\R$layout.class __build\obj\com\user\ android_build_test\R$style.class __build\obj\com\user\android_build_test\R.cl ass
唯一的区别是我给它一个绝对路径。
如果我删除除路径已删除的文件之外的所有文件,我会得到:

Error in R.class: Error with input file: R.class Compilation failed (etc. - same call stack)
知道是什么原因造成的吗?如果是这样,你知道我如何在没有大量隐性知识的情况下解决这个问题吗?

java android build compilation android-d8
1个回答
0
投票
我发现了问题。这是一个愚蠢的错误,但话又说回来,错误 d8 争吵对于 Java 菜鸟来说并不明显。我将为后代发表评论,因为我可能不是最后一个使用旧系统和工具链的人。

我使用最新版本的 Java 进行编译。如果我理解正确的话,较旧版本的 Android(包括我所针对的版本)使用 Java 8,较新版本则使用 Java 11+。它可能比这更微妙,但无论如何强制 javac 使用 Java 8 解决了这个问题。

使用 dx(较旧的构建系统,尚未在我使用的工具链中删除)而不是 d8 给了我提示,它的错误(对于我来说,我已经 10 多年没有使用过 Java)更容易解释,或者网上查找。

© www.soinside.com 2019 - 2024. All rights reserved.