我想有我的Gradle构建创建一个发布签名apk文件使用Gradle。
我不确定代码是否正确,或者我在做gradle构建时是否缺少一个参数?
这是build.gradle/build.gradle中的一些代码。节文件:
android {
...
signingConfigs {
release {
storeFile(file("release.keystore"))
storePassword("******")
keyAlias("******")
keyPassword("******")
}
}
}
Gradle构建成功完成,在我的build/apk文件夹中,我只看到…-release-unsigned.apk和…-debug-unaligned.apk文件。
对如何解决这个问题有什么建议吗?
你也可以使用gradle的-P命令行选项来帮助签名。在你的构建中。gradle,像这样添加singingConfigs:
signingConfigs {
release {
storeFile file("path/to/your/keystore")
storePassword RELEASE_STORE_PASSWORD
keyAlias "your.key.alias"
keyPassword RELEASE_KEY_PASSWORD
}
}
然后像这样调用gradle build:
gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build
如果您愿意,可以使用-P来设置storeFile和keyAlias。
这基本上是Destil的解决方案,但带有命令行选项。
有关gradle属性的更多细节,请查看gradle用户指南。
如果您想避免在构建中硬编码您的密钥库和密码。gradle,你可以使用属性文件解释这里:处理签名配置与gradle
基本上:
1)创建一个myproject。属性文件在/home/[username]/。签名内容如下:
keystore=[path to]\release.keystore
keystore.password=*********
keyAlias=***********
keyPassword=********
2)创建gradle。属性文件(可能在你的项目目录的根目录)的内容:
MyProject.properties=/home/[username]/.signing/myproject.properties
3)在你的构建中参考它。这样Gradle:
if(project.hasProperty("MyProject.properties")
&& new File(project.property("MyProject.properties")).exists()) {
Properties props = new Properties()
props.load(new FileInputStream(file(project.property("MyProject.properties"))))
signingConfigs {
release {
storeFile file(props['keystore'])
storePassword props['keystore.password']
keyAlias props['keyAlias']
keyPassword props['keyPassword']
}
}
}
这是Kotlin构建脚本(build.gradle.kts)的另一个答案,与Willi Mentzel的答案不同。
它尝试从本地读取。属性文件,返回到OS环境变量。它在像GitHub Actions这样的ci中特别有用(你可以在存储库设置中创建环境秘密)。
注意,我使用的是Kotlin 1.6.10和Gradle 7.4.2和Android Gradle Plugin (AGP) 7.0.4。
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
// ...
val environment = System.getenv()
fun getLocalProperty(key: String) = gradleLocalProperties(rootDir).getProperty(key)
fun String.toFile() = File(this)
android {
signingConfigs {
create("MySigningConfig") {
keyAlias = getLocalProperty("signing.keyAlias") ?: environment["SIGNING_KEY_ALIAS"] ?: error("Error!")
storeFile = (getLocalProperty("signing.storeFile") ?: environment["SIGNING_STORE_FILE"] ?: error("Error!")).toFile()
keyPassword = getLocalProperty("signing.keyPassword") ?: environment["SIGNING_KEY_PASSWORD"] ?: error("Error!")
storePassword = getLocalProperty("signing.storePassword") ?: environment["SIGNING_STORE_PASSWORD"] ?: error("Error!")
enableV1Signing = true
enableV2Signing = true
}
}
buildTypes {
release {
signingConfig = signingConfigs["MySigningConfig"]
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
如前所述,你可以有一个本地。属性文件在你的项目的根属性值:
signing.keyAlias=My key
signing.keyPassword=zyxwvuts
signing.storePassword=abcdefgh
signing.storeFile=C\:\\Users\\Mahozad\\keystore.jks
... 或者你可以在你的操作系统上设置/创建环境变量;例如,创建一个名为SIGNING_KEY_ALIAS的环境变量:
Windows命令提示符:setx SIGNING_KEY_ALIAS“我的密钥”
Linux终端:export SIGNING_KEY_ALIAS="My key"
注意:正如其他答案所提到的,不要添加您的本地。属性文件到你的版本控制系统(如Git),因为它将你的秘密信息,如密码等暴露给公众(如果它是一个公共存储库)。
用上面提到的3种方法中的任意一种生成APK。
现在几乎所有的平台都提供了某种密匙环,所以没有理由留下明文密码。
我提出了一个简单的解决方案,使用Python密匙环模块(主要是配套的控制台脚本密匙环)和Groovy ['do', 'something'].execute()特性的最小包装:
def execOutput= { args ->
def proc = args.execute()
proc.waitFor()
def stdout = proc.in.text
return stdout.trim()
}
使用这个函数,signingConfigs部分变成:
signingConfigs {
release {
storeFile file("android.keystore")
storePassword execOutput(["keyring", "get", "google-play", storeFile.name])
keyAlias "com.example.app"
keyPassword execOutput(["keyring", "get", "google-play", keyAlias])
}
}
在运行gradle assemblerrelease之前,你必须在你的keyring中设置密码,只有一次:
$ keyring set google-play android.keystore # will be prompted for the passwords
$ keyring set google-play com.example.app
释放快乐!