Android build.gradle读取gradle.properties中$符号属性如何转义
问题原因
Gradle 解析 gradle.properties 时默认会将 $ 识别为变量插值的占位符,你配置的 Pa$$word! 会被自动处理为 Pa$word!,和实际密码不匹配,就会出现Cannot recover key报错。而硬编码时用单引号包裹字符串,Groovy 不会执行插值处理,密码可以正常匹配。
解决方案
方案1:转义 gradle.properties 中的 $ 符号
每个 $ 前添加反斜杠 \ 做转义即可,修改后的配置如下:
com_example_storePassword=Pa\$\$word! com_example_keyPassword=Pa\$\$word! com_example_keyAlias=alias com_example_storeFile=/Users/example/Documents/keystores/example/keystore
修改后直接在 build.gradle 中正常引用属性即可拿到正确的密码。
方案2:手动加载 properties 文件跳过自动插值
如果不想修改原 properties 文件的内容,可以在 build.gradle 中用 Java 原生的 Properties 类加载文件,原生加载逻辑不会处理 $ 插值,会直接读取原始字符串:
// 手动加载gradle.properties def rawProps = new Properties() file("${rootProject.rootDir}/gradle.properties").withInputStream { inputStream -> rawProps.load(inputStream) } android { signingConfigs { release { storePassword rawProps.getProperty("com_example_storePassword") keyPassword rawProps.getProperty("com_example_keyPassword") keyAlias rawProps.getProperty("com_example_keyAlias") storeFile file(rawProps.getProperty("com_example_storeFile")) } } }
验证方法
可以添加一个测试任务打印实际读取到的属性值,确认密码是否匹配:
task printSigningPassword { doLast { println "实际读取的storePassword:${com_example_storePassword}" println "实际读取的keyPassword:${com_example_keyPassword}" } }
执行 ./gradlew printSigningPassword 即可查看输出,确认输出内容为 Pa$$word! 就说明配置正确。
内容的提问来源于stack exchange,提问作者Sam Liddle
相关产品推荐
相关产品推荐

