本文介绍了当minSdkVersion小于21并开启了MultiDex时如何使用productFlavors充分利用Instant Run在开发过程中提升构建速度。
《夜宿山寺》
危楼高百尺,手可摘星辰。
不敢高声语,恐惊天上人。
—唐,李白
前言
由于目前市面上大部分应用都会兼容Android 5.0之前的手机,所以会将minSdkVersion设置为小于21,并且为了规避65K方法数限制会启用MultiDex。Android 5.0之前的平台版本使用 Dalvik 运行时来执行应用代码。Android 5.0及更高版本使用名为 ART 的运行时,后者原生支持从 APK 文件加载多个 DEX 文件。Dalvik 可执行文件分包配置会大幅增加构建处理时间,因为构建系统必须就哪些类必须包括在主 DEX 文件中以及哪些类可以包括在辅助 DEX 文件中作出复杂的决策。这意味着使用 Dalvik 可执行文件分包的增量式构建通常耗时更长,可能会拖慢您的开发进度。
解决方案
为了缩短耗时更长的 Dalvik 可执行文件分包输出构建时间,我们可以利用 productFlavors(一个开发定制和一个发布定制,具有不同的 minSdkVersion 值)创建两个构建变型。
对于开发定制,将 minSdkVersion 设置为 21。该设置将启用一个名为 pre-dexing 的构建功能,此功能仅适用于 Android 5.0和更高版本的 ART 格式更快生成 Dalvik 可执行文件分包输出。对于发布定制,将 minSdkVersion 设置为适于您的实际最低支持级别。此设置生成的 Dalvik 可执行文件分包 APK 可兼容更多设备,但构建时间更长。
以下构建配置示例展示了如何在 Gradle 构建文件中设置这些定制:
1 | android { |
通过这样的配置后,可以为增量式构建使用应用的 devDebug 变体,后者集 dev 产品定制与 debug 构建类型的属性于一身。这将创建已启用 Dalvik 可执行文件分包且禁用 proguard 的可调试应用(因为 minifyEnabled 默认为 false)。这些设置会使适用于 Gradle 的 Android 插件执行以下操作:
- 执行 pre-dexing:将每个应用模块和每个依赖项构建为单独的 DEX 文件。
- 将每个 DEX 文件加入 APK,并且不做任何修改(不执行代码压缩)。
- 最重要的是,模块 DEX 文件不执行合并操作,因此可以避免为确定主 DEX 文件的内容而进行长时间的计算。
这些设置的好处是,可以进行快速的增量式构建,因为只有修改过的模块的 DEX 文件才会在后续构建期间重新计算并重新打包。但是,这些构建的 APK 只能用于在 Android 5.0 设备上进行测试。不过,由于是以定制形式实现配置,保留了使用与发布相适的最低 API 级别和 ProGuard 代码压缩执行正常构建的能力。
您还可以构建其他变体,包括 prodDebug 变体构建,该变体虽然构建时间更长,但可用于开发以外的测试。在所示配置内,prodRelease 变体将是最终测试和发布版本。如需了解有关使用构建变体的详细信息,请参阅配置构建变体。
提示:由于您有适用于不同 Dalvik 可执行文件分包需求的不同构建变体,因此也可以为不同变体提供不同清单文件(这样,只有适用于 API 级别 20 和更低版本的清单文件会更改
标记名称),或者为每个变体创建不同的 Application 子类(这样,只有适用于 API 级别 20 和更低版本的清单文件会扩展 MultiDexApplication 类或调用 MultiDex.install(this))。