Android Native 客户端属性配置系统使用说明
- 背景和问题
现代 android 开发基本都基于 gradle
属性设置来进行定制化编译,随着项目的迭代,工程结构越发复杂,配置属性越来越多,越来越多的配置使得上手难度越来越大。
- 解决方案设计
一般而言,在 android 开发中,Gradle 属性系统可以通过三个地方指定:命令行、local.properties、gradle.properties。
很遗憾的是,gradle 官方只支持 命令行和 gradle.properties 中的读取,并不支持 local.properties
的读取加载,更不支持自定义装载优先级。个人以为,gradle 的这种设计其实存在不足之处,给不少项目的灵活构建需求带来的不方便。
因此,我们需要自行实现一套 gradle 属性装载系统,以便实现分层、按需、灵活的属性配置系统。
为了尊重传统开发习惯,依然采用 gradle 属性来进行配置。
在架构上分为三层设计,属性读取依次从上层到下层读取,上层失败之后会 fallback 到下层:
在构建系统需要读取一个属性变量的时候,会按照图中的顺序依次读取,如果变量不存在的话,最终会读取失败。
工程中会默认内置一套配置参数在 gradle.properties
文件中,工程师也可以利用这个顺序来自定义修改系统默认参数,以便达到灵活配置和构建的需求。
- 使用指南
举一个典型的例子,我们在日常开发中经常会来配置是否联合 rn 工程来进行构建。
以往这个需求都是手动修改 build.gradle 文件中的代码,注释掉一部分之后才能实现脱离 rn 工程编译。
这样做不仅麻烦,而且容易误操作把注释的临时代码提交到仓库中。
现在这个需求可以通过如下两种方式完成(注意,如果不做任何配置,根据工程内置默认配置,rn 依然是自动联合的):
- 方案一:local.properties 配置
在你的 local.properties 文件中添加如下配置:
...
# true 表示联合 rn,false 表示不联合使用内置的 bundle 来构建,这样可以加速 native 构建调试
mcd_include_rn=false
...
- 方案二:命令行配置
方案一适合短期内一直关闭 rn 联合,但是如果你只是想临时这一次关闭联合,那么你可以通过命令行参数来达到一次性指定的效果:
# 通过 -P 参数来指定 gradle 属性配置
# true 表示联合 rn,false 表示不联合
./gradlew :app:assembleDEVDebug -