接受的答案使用文件来控制使用哪个密钥库来对驻留在项目相同根文件夹中的APK进行签名。当我们使用诸如Git之类的vcs时,如果忘记添加属性文件以忽略列表,则可能是一件坏事。因为我们会将密码泄露给全世界。问题仍然存在。
与其将属性文件放置在项目内的同一目录中,不如将其放置在外部。我们使用gradle.properties文件将其放置在外部。
步骤如下:
1.在根项目上编辑或创建gradle.properties并添加以下代码,请记住使用自己的路径进行编辑:
AndroidProject.signing=/your/path/androidproject.properties
2.在/ your / path /中创建androidproject.properties并添加以下代码,不要忘记将/your/path/to/android.keystore更改为您的密钥库路径:
STORE_FILE=/your/path/to/android.keystore
STORE_PASSWORD=yourstorepassword
KEY_ALIAS=yourkeyalias
KEY_PASSWORD=yourkeypassword
3.在您的应用程序模块build.gradle(而不是项目根目录build.gradle)中,添加以下代码(如果不存在)或对其进行调整:
signingConfigs {
release
}
buildTypes {
debug {
debuggable true
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
4.在步骤3的代码下方添加以下代码:
if (project.hasProperty("AndroidProject.signing")
&& new File(project.property("AndroidProject.signing").toString()).exists()) {
def Properties props = new Properties()
def propFile = new File(project.property("AndroidProject.signing").toString())
if(propFile.canRead()) {
props.load(new FileInputStream(propFile))
if (props!=null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(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 'androidproject.properties found but some entries are missing'
android.buildTypes.release.signingConfig = null
}
} else {
println 'androidproject.properties file not found'
android.buildTypes.release.signingConfig = null
}
}
此代码将从步骤1开始在gradle.properties中搜索AndroidProject.signing属性。如果找到该属性,它将把属性值转换为指向我们在步骤2中创建的androidproject.properties的文件路径。然后,其中的所有属性值都将用作build.gradle的签名配置。
现在,我们无需再担心暴露密钥库密码的风险。
在不将密钥库信息放入build.gradle的Signing Android apk中阅读更多内容
build.gradle
存在,您都必须拥有其他内容build.gradle
。这是对环境变量(每个答案),属性文件(另一个答案)或其他某种方式的调整。如果您不愿意在外部放置东西build.gradle
,那么根据定义,所有签名信息都必须在内部buid.gradle
。