升级SDK 31后build.gradle无法读取GitLab CI环境变量如何解决
问题根因
升级compileSdk到31时,通常需要同步升级Android Gradle Plugin(AGP)到7.0及以上版本。AGP 7.0+默认启用了构建进程环境变量隔离策略,未显式声明允许传递的系统环境变量不会被注入到Gradle运行时上下文,因此原有的System.getenv()调用无法读取到GitLab CI注入的密钥环境变量。
解决方案1:显式声明允许Gradle读取系统环境变量(推荐,无需修改CI配置)
- 打开项目根目录的
gradle.properties文件,添加如下配置,将所有需要用到的密钥环境变量显式声明允许传递:
# 按实际用到的密钥字段添加,格式为systemProp.变量名=${系统环境变量名} systemProp.store=${store} systemProp.keyAlias=${keyAlias} systemProp.keyPassword=${keyPassword} systemProp.storePassword=${storePassword}
- 调整
build.gradle中的读取逻辑,增加空校验避免构建崩溃:
Properties keyProps = new Properties() def storeVal = System.getProperty("store") ?: System.getenv("store") if (storeVal != null) { keyProps.setProperty("store", storeVal) } // 其余密钥字段按相同逻辑处理
解决方案2:CI构建命令显式传参
修改.gitlab-ci.yml中的构建脚本,在执行gradle命令时直接传递密钥参数:
assembleReleaseJob: only: - main script: - ./gradlew assembleRelease \ -Pstore="$store" \ -PkeyAlias="$keyAlias" \ -PkeyPassword="$keyPassword" \ -PstorePassword="$storePassword"
对应修改build.gradle的读取逻辑:
Properties keyProps = new Properties() if (project.hasProperty("store")) { keyProps.setProperty("store", project.property("store").toString()) } // 其余密钥字段按相同逻辑处理
注意事项
- GitLab CI中存储的密钥变量请勾选
Protected和Masked选项,避免密钥泄露 - 禁止将密钥硬编码到项目代码或配置文件中提交到代码仓库
内容的提问来源于stack exchange,提问作者Francesc
相关产品推荐
相关产品推荐

