所接受的答案使用文件来控制位于项目相同根目录下的APK签名时要使用哪个密钥库。当我们使用vcs像Git这样的工具时,如果忘记将属性文件添加到忽略列表中,可能会导致泄露密码。问题仍然存在。
相反,我们应该在项目外部创建属性文件,通过使用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
}
}
这段代码将在第一步中的gradle.properties文件中搜索AndroidProject.signing属性。如果找到该属性,它将把属性值翻译为androidproject.properties的文件路径,该文件是我们在第二步中创建的。然后,其中的所有属性值都将用作我们的build.gradle的签名配置。
现在我们不再需要担心暴露密钥库密码的风险了。
阅读更多:
在build.gradle中签署Android apk而无需放置密钥库信息
build.gradle
中,则必须有其他东西来代替build.gradle
,无论是环境变量的调整(根据一个答案),属性文件(根据另一个答案)还是其他一些手段。如果您不愿意在build.gradle
之外拥有任何东西,那么根据定义,所有签名信息都必须在buid.gradle
内部。 - CommonsWare