Gradle升级后无法读取项目根目录的signing.properties如何解决?
解决多模块共享项目根目录signing.properties的问题
这个问题我之前帮不少开发者解决过——新版Android Gradle插件(AGP)和Gradle确实调整了文件路径的解析逻辑,默认会以模块目录作为相对路径的基准,所以你原来直接写'signing.properties'就找不到项目根目录的文件了。要在多模块(比如手机和穿戴模块)共享这个配置文件,有两个靠谱的方案:
方案一:直接在模块build.gradle中定位项目根目录文件
只需要修改你原来的代码,用project.rootDir明确指向项目根目录,替换掉原来的相对路径即可。这个方法改动最小,适合快速适配:
... def Properties props = new Properties() // 关键改动:用project.rootDir指定项目根目录,再拼接文件名 def propFile = new File(project.rootDir, 'signing.properties') if (propFile.canRead()) { props.load(new FileInputStream(propFile)) if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') && props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) { // 如果STORE_FILE是相对路径,也要基于项目根目录解析 android.signingConfigs.release.storeFile = file("${project.rootDir}/${props['STORE_FILE']}") android.signingConfigs.release.storePassword = props['STORE_PASSWORD'] android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] android.signingConfigs.release.keyPassword = props['KEY_PASSWORD'] } else { println 'signing.properties found but some entries are missing' android.buildTypes.release.signingConfig = null } } else { println 'signing.properties not found' android.buildTypes.release.signingConfig = null } ...
注意:如果你的
STORE_FILE是相对路径(比如keystores/my-release-key.jks),一定要基于项目根目录解析,否则会以模块目录为基准找不到文件。
方案二:统一在项目根build.gradle中配置,模块复用
如果有多个模块需要共享签名配置,更优雅的方式是把加载逻辑提到项目根目录的build.gradle中,然后在各个模块里直接引用。这样避免重复代码,也方便统一维护:
- 在项目根目录的
build.gradle中添加以下代码:
ext { // 加载签名配置 def signingPropsFile = file('signing.properties') signingProps = new Properties() hasValidSigningConfig = false if (signingPropsFile.canRead()) { signingProps.load(new FileInputStream(signingPropsFile)) // 验证必要字段是否齐全 hasValidSigningConfig = signingProps.containsKey('STORE_FILE') && signingProps.containsKey('STORE_PASSWORD') && signingProps.containsKey('KEY_ALIAS') && signingProps.containsKey('KEY_PASSWORD') } else { println 'signing.properties not found in project root' } }
- 在每个模块(比如app和wear模块)的
build.gradle中引用配置:
android { ... signingConfigs { release { if (rootProject.ext.hasValidSigningConfig) { storeFile = file("${rootProject.projectDir}/${rootProject.ext.signingProps['STORE_FILE']}") storePassword = rootProject.ext.signingProps['STORE_PASSWORD'] keyAlias = rootProject.ext.signingProps['KEY_ALIAS'] keyPassword = rootProject.ext.signingProps['KEY_PASSWORD'] } } } buildTypes { release { ... signingConfig = rootProject.ext.hasValidSigningConfig ? signingConfigs.release : null } } }
小提示
不管用哪种方案,都记得把signing.properties加入项目根目录的.gitignore文件,避免把密钥密码等敏感信息提交到版本控制:
# 签名配置文件 signing.properties
内容的提问来源于stack exchange,提问作者CodeChimp
相关产品推荐
相关产品推荐

