【前言】

d8 是一种命令行工具,Android Studio 和 Android Gradle 插件使用该工具来将项目的 Java 字节码编译为在
Android 设备上运行的 DEX 字节码,该工具支持您在应用的代码中使用 Java 8 语言功能。 d8 还作为独立工具纳入了
Android 构建工具 28.0.1 及更高版本中:android_sdk/build-tools/version/

1、d8基本用法

 d8 [options] <input-files>

其中,可以是 *.class 文件或容器(例如 JAR、APK 或 ZIP 文件)的任意组合。您还可以添加 DEX 文件作为 d8 的输入,以将这些文件合并到 DEX 输出中,这在包含增量构建的输出时很有用。
1)你可以将一个目录下的所有.class文件编译为dex

d8 --output C:\Users\Administrator\Desktop\dex C:\Users\Administrator\Desktop\y\com\sswl\channel\*.class

上面就是将C:\Users\Administrator\Desktop\y\com\sswl\channel目录下的所有.class文件编译为dex文件并输出到C:\Users\Administrator\Desktop\dex目录下
2)假如你想把多个目录下的.class文件编译为dex,那么可以把多个路径空格分隔就可以了

d8 --output C:\Users\Administrator\Desktop\dex C:\Users\Administrator\Desktop\y\com\sswl\channel\*.class C:\Users\Administrator\Desktop\y\com\sswl\h5\*.class

上面是将C:\Users\Administrator\Desktop\y\com\sswl\channel目录与C:\Users\Administrator\Desktop\y\com\sswl\h5目录下的所有.class文件编译为dex输出到C:\Users\Administrator\Desktop\dex目录
3)类似dx,你也可以直接把jar或者zip压缩包里面的所有.class文件编译为dex

d8 --output C:\Users\Administrator\Desktop\dex C:\Users\Administrator\Desktop\y.jar

上面是将C:\Users\Administrator\Desktop\y.jar编译为dex输出到C:\Users\Administrator\Desktop\dex目录下,当然也可以输出为jar或者zip,实际就是把dex放进压缩包里面,比如:

d8 --output C:\Users\Administrator\Desktop\out.jar C:\Users\Administrator\Desktop\y.jar

Java 字节码编译为Dex,d8比dx更好用!_第1张图片

2、option可选标记

默认情况下,d8 会将 Java 字节码编译为优化的 DEX文件,并在其中包含相关的调试信息,以供您在运行时用于调试代码。然而,您也可以添加可选标记来执行各种操作,例如执行增量构建、指定应编译到主DEX 文件中的类,以及指定使用 Java 8 语言功能所需的其他资源对应的路径。

下表介绍了可与 d8 一起使用的可选标记。

选项 说明
–debug 编译 DEX 字节码以在其中包含调试信息,例如调试符号表。此选项默认处于启用状态。要在 DEX 字节码中包含调试信息,d8 要求输入 Java 字节码中包含此信息。例如,如果您使用 javac 编译代码,则需要传递 -g 标记,以在输出的 Java 字节码中包含调试信息。当为应用或库的发布版本编译 DEX 文件时,请改用下述 --release 标记。
–release 编译 DEX 字节码,而不包含调试信息。不过,d8 包含在生成堆栈轨迹和记录异常时使用的一些信息。在为公开发布版本编译字节码时,应该传递此标记。
–output path 为 DEX 输出指定所需的路径。默认情况下,d8 会输出当前工作目录中的 DEX 文件。如果您指定 ZIP 或 JAR 文件的路径和名称,则 d8 会创建指定的文件并将 DEX 输出文件包含在其中。如果指定现有目录的路径,则 d8 会将 DEX 文件输出到该目录中。
–lib android_sdk/platforms/api-level/android.jar 指定指向 Android SDK 的 android.jar 的路径。编译使用 Java 8 语言功能的字节码时需要使用此标记。
–classpath path 指定 d8 在编译项目的 DEX 文件时可能需要使用的类路径资源。特别是在编译使用 Java 8 语言功能的字节码时,d8 会要求您指定特定的资源。
–min-api number 指定您希望 DEX 输出文件支持的最低 API 级别。
–intermediate 传递此标记,可告知 d8 您并非要编译项目的全部 Java 字节码集。此标记在执行增量构建(而不是编译您想在设备上运行的优化 DEX 文件)时非常有用,d8 会创建中间 DEX 文件,并将其存储在指定的输出或默认路径中。如果要编译要在设备上运行的 DEX 文件,请不要使用此标记,并指定中间 DEX 类的路径作为输入。
–file-per-class 将每个类编译到单独的 DEX 文件中。启用此标记后,您只需重新编译已更改的类,从而执行更多增量构建。使用 Android Gradle 插件执行增量构建时,此优化默认处于启用状态。如果您还指定了 --main-dex-list,则无法使用此标记。
–no-desugaring 停用 Java 8 语言功能。仅当您不想编译使用 Java 8 语言功能的 Java 字节码时,才可使用此标记。
–main-dex-list path 指定列出 d8 应包含在主 DEX 文件中的类的文本文件,该文件的名称通常为 classes.dex。也就是说,如果您不使用此标记指定类列表,d8 将无法保证主 DEX 文件中会包含哪些类。由于 Android 系统在启您应用时会先加载主 DEX 文件,因此您可以利用此标记将特定的类编译到主 DEX 文件中,从而使它们在应用启动时得到优先加载。这在支持旧版 multidex 时特别有用,因为在加载旧版 multidex 库之前,只有主 DEX 文件中的类在运行时可用。请记住,该主 DEX 文件仍须满足 64K 引用限制。因此,请确保不要为主 DEX 文件指定太多类,否则会出现编译错误。默认情况下,在使用 --main-dex-list 指定类时,d8 只会包含主 DEX 文件中的类,这是为了便于调试与主 DEX 文件中缺少的类相关的问题。如果您指定的是 --release 模式,则 d8 会尝试在主 DEX 文件中包含尽可能多的其他类(直到达到 64K 限制为止),从而减少打包到应用发布版本中的 DEX 文件的数量。如果您还指定了 --file-per-class,则无法使用此标记
–version 输出您当前使用的 d8 版本。
–help 输出与使用 d8 有关的帮助文本。

看完上述各个option的描述之后,我们来展示一下各种实用的场景:
1、假如我们只是更改某个class文件,那么我们使用增量构建标识--intermediate与单独类编译标识--file-per-class来将单独的class文件编译成dex文件

d8 C:\Users\Administrator\Desktop\classes\com\sswl\gameprotect\activity\PopupActivity.class --intermediate --file-per-class --output C:\Users\Administrator\Desktop\dex

上面就是将C:\Users\Administrator\Desktop\classes\com\sswl\gameprotect\activity\PopupActivity.class单独变成dex,输出到C:\Users\Administrator\Desktop\dex目录下
在这里插入图片描述
2、如果您已在多次增量构建中将项目的所有字节码编译到 DEX 文件中,则可以通过将中间 DEX 文件的目录传递给 d8 来执行完整构建,如下所示。此外,您也可以使用 --main-dex-list 指定想让 d8 编译到主 DEX 文件中的类。由于输入是已编译为 DEX 字节码的一组文件,因此,完成此构建的速度应该比完成干净构建更快。

d8 C:\Users\Administrator\Desktop\dex\com\sswl\plugindemo\*.dex --release --output C:\Users\Administrator\Desktop\all-dex

上面是将C:\Users\Administrator\Desktop\dex\com\sswl\plugindemo目录下的所有dex文件合并输出到C:\Users\Administrator\Desktop\all-dex目录下

更多相关文章

  1. Android Uri获取资源文件(多种方式)
  2. 编译android 之后生成的 img 文件介绍
  3. android操作sdcard中的多媒体文件(一)——音乐列表的制作
  4. android 操作sdcard中的多媒体文件(一)——音乐列表的制作
  5. Android Zip文件解压缩代码
  6. Android中多媒体文件、文档以及各类文件的获取
  7. Android 超简单的录制屏幕视频及生成GIF文件的方法
  8. 导入color文件中的颜色值 android
  9. Android中音频文件的使用

随机推荐

  1. android studio导包找不到类
  2. Android(安卓)Studio如何导入android源码
  3. Android(安卓)豆瓣
  4. 干货集中营 API 文档
  5. XML的解析中的三种方法
  6. Android技术--android屏幕适配详解
  7. Android(安卓)Canvas绘图详解
  8. Android简单通讯录的开发
  9. Android布局管理器-使用LinearLayout实现
  10. [Android--Tool]提示adb is down问题与