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

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

我知道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的.class完全相同(我解压缩):

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
2个回答
2
投票

在构建工具28.0.1之前,D8 / R8并未作为Android SDK的一部分发布,如dx。在最近的版本中有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插件不依赖它。


0
投票

D8是新的R8 project的一部分。 D8不与dx共享任何历史记录 - 即使命名可能使它看起来像这样。 dx不再被积极开发,但谷歌积极开发D8作为https://r8-review.googlesource.com的开源项目。

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

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