【问题标题】:What's the file path of d8.jar used by Android Studio?Android Studio 使用的 d8.jar 的文件路径是什么?
【发布时间】:2018-04-28 20:44:33
【问题描述】:

我知道Android Studio switch to D8 dexer by default。但我想知道 d8.jar 的文件路径是什么?我在 SDK 中找不到 d8.jar,如 dx.jar

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

xb@dnxb:~/Android/Sdk/build-tools/27.0.3/lib$ ls
apksigner.jar  dx.jar  shrinkedAndroid.jar
xb@dnxb:~/Android/Sdk/build-tools/27.0.3/lib$ 

我的第一个想法是 dx.jar 意味着 d8.jar,但似乎不是这样。

dx.jar source code

xb@dnxb:~/Downloads/dalvik/dx/src/com/android$ ls 
dex  dx  multidex
xb@dnxb:~/Downloads/dalvik/dx/src/com/android$ ls -1 dex
Annotation.java
CallSiteId.java
ClassData.java
ClassDef.java
Code.java
DexException.java
DexFormat.java
DexIndexOverflowException.java
Dex.java
EncodedValueCodec.java
EncodedValue.java
EncodedValueReader.java
FieldId.java
Leb128.java
MethodHandle.java
MethodId.java
Mutf8.java
ProtoId.java
SizeOf.java
TableOfContents.java
TypeList.java
util
xb@dnxb:~/Downloads/dalvik/dx/src/com/android$ 

与27.0.3或更早版本(例如25.0.0)SDK中dx.jar的.classes完全相同(我解压了):

xb@dnxb:~/Android/Sdk/build-tools/27.0.3/lib/dx/com/android$ ls 
dex  dx  multidex
xb@dnxb:~/Android/Sdk/build-tools/27.0.3/lib/dx/com/android$ ls -1 dex | grep -v '\$'
Annotation.class
CallSiteId.class
ClassData.class
ClassDef.class
Code.class
Dex.class
DexException.class
DexFormat.class
DexIndexOverflowException.class
EncodedValue.class
EncodedValueCodec.class
EncodedValueReader.class
FieldId.class
Leb128.class
MethodHandle.class
MethodId.class
Mutf8.class
ProtoId.class
SizeOf.class
TableOfContents.class
TypeList.class
util
xb@dnxb:~/Android/Sdk/build-tools/27.0.3/lib/dx/com/android$ 

但是the new d8.jar的结构完全不同:

xb@dnxb:~/Downloads/r8/build/libs/d8/com/android/tools/r8$ ls
annotations                                           ExtractMarkerCommand.class                                                                      
ApiLevelException.class                               ExtractMarker$VdexOrigin.class                                                                  
ArchiveClassFileProvider.class                        GenerateMainDexList.class
ArchiveProgramResourceProvider.class                  GenerateMainDexListCommand$1.class
ArchiveProgramResourceProvider$ZipFileSupplier.class  GenerateMainDexListCommand$Builder.class
BaseCommand$Builder.class                             GenerateMainDexListCommand.class
BaseCommand.class                                     graph
BaseCompilerCommand$Builder.class                     InternalProgramOutputPathConsumer.class
... omit

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

xb@dnxb:~$ find /home/xiaobai/Android/ -iname '*d8*'
xb@dnxb:~$ find ~/Downloads/AS/android-studio -iname '*d8*'
xb@dnxb:~$ 

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

【问题讨论】:

    标签: android-studio android-studio-3.0 dx android-d8


    【解决方案1】:

    在 build-tools 28.0.1 之前,D8/R8 不像 dx 那样作为 Android SDK 的一部分分发。在最近的版本中有build-tools/28.0.1/d8build-tools/28.0.1/lib/d8.jar

    它也作为 Android Gradle 插件的一部分提供。从 3.1.x/3.2-alpha 开始,D8 类(及其重新打包的依赖项)被捆绑到 com.android.tools.build:builder 工件中。后者是主要 gradle 插件工件的传递依赖。所以 Gradle 插件(以及 Android Studio)使用捆绑的 d8 类来 dex 代码。

    有一个单独的工件 com.android.tools:r8 是一个单独的 R8 jar(从 1.0.25 版开始没有依赖项),但 Android Gradle 插件不依赖它。

    【讨论】:

      【解决方案2】:

      默认安装我刚刚制作的 Android Studio 后,我这里有一个 d8.jar(大小 4 MB):

      ~/Android/Sdk/build-tools/29.0.3/lib/d8.jar
      

      顺便说一句,要调用它,您需要运行

      java -cp d8.jar com.android.tools.r8.D8 ...

      【讨论】:

      • 当我发布此问题时(2018 年 4 月 27.0.3 日),此文件不存在(自 2018 年 8 月 ~28.0.2 日起出现)。
      • 当然。我刚刚为今天查找您问题的人回答了这个问题(就像我一样)
      【解决方案3】:

      D8 是新 R8 project 的一部分。 D8 与 dx 没有任何历史渊源——尽管命名可能看起来如此。 dx 不再积极开发,但 D8 由 Google 作为开源项目积极开发,地址为https://r8-review.googlesource.com

      您应该能够在您的类路径中找到r8.jar(不是d8.jar - 不存在),如果您想使用不同版本的 D8,您可以将自己的r8.jar 放在您的类路径。

      【讨论】:

      • 1. “(不是 d8.jar - 那不存在)”,那么为什么 r8.googlesource.com/r8 gradle build 指令会产生 d8.jar ? 2. 我仍然无法通过findecho $CLASSPATH 找到r8.jar。你能展示你如何找到路径的示例输出吗?谢谢。
      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多