我想有我的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文件。
对如何解决这个问题有什么建议吗?
对于Groovy (build.gradle)
您不应该将签名凭据直接放入构建中。gradle文件。相反,凭证应该来自不受版本控制的文件。
放置一个文件签名。特定于模块构建的属性。Gradle被找到了。别忘了把它添加到你的。gitignore文件!
signing.properties
storeFilePath=/home/willi/example.keystore
storePassword=secret
keyPassword=secret
keyAlias=myReleaseSigningKey
build.gradle
android {
// ...
signingConfigs{
release {
def props = new Properties()
def fileInputStream = new FileInputStream(file('../signing.properties'))
props.load(fileInputStream)
fileInputStream.close()
storeFile = file(props['storeFilePath'])
storePassword = props['storePassword']
keyAlias = props['keyAlias']
keyPassword = props['keyPassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
// ...
}
}
}
比之前的答案更简单的方法:
把它放到~/.gradle/gradle.properties中
RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****
修改你的应用/构建。Gradle,并将其添加到android{代码块:
...
signingConfigs {
release {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
// Optional, specify signing versions used
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
....
然后你可以运行gradle assemblerrelease
另请参阅signingConfigs Gradle DSL的参考
如果您想避免在构建中硬编码您的密钥库和密码。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']
}
}
}
您可以从命令行请求密码:
...
signingConfigs {
if (gradle.startParameter.taskNames.any {it.contains('Release') }) {
release {
storeFile file("your.keystore")
storePassword new String(System.console().readPassword("\n\$ Enter keystore password: "))
keyAlias "key-alias"
keyPassword new String(System.console().readPassword("\n\$ Enter keys password: "))
}
} else {
//Here be dragons: unreachable else-branch forces Gradle to create
//install...Release tasks.
release {
keyAlias 'dummy'
keyPassword 'dummy'
storeFile file('dummy')
storePassword 'dummy'
}
}
}
...
buildTypes {
release {
...
signingConfig signingConfigs.release
}
...
}
...
if-then-else块防止在构建版本时请求密码。虽然else分支是不可达的,它欺骗Gradle创建一个安装…发布的任务。
基本信息。正如https://stackoverflow.com/a/19130098/3664487所指出的,“Gradle脚本可以使用System.console()提示用户输入。readLine方法。”不幸的是,Gradle总是会要求密码,即使你在构建一个调试版本(参见如何使用Gradle创建一个发布签名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用户指南。