Android版本构建的自动化
我在一个文件夹中有十个Android项目。对于每个项目,我都可以使用Android版本构建的自动化,android,Android,我在一个文件夹中有十个Android项目。对于每个项目,我都可以使用antdebug来构建它。因此,编写一个简单的脚本来编译所有这些项目是没有问题的。我每天都用哈德逊建立这些项目,效果很好 但是现在我们的项目需要进入发布阶段。因此compile命令变成antrelease。对于编译发布项目,我必须在编译期间每次输入证书的密码。所以我不能自动发布 由于我有十个项目都需要与输入密码进行交互,所以这个编译工作让我非常痛苦 如何使发布版本仍然是自动的?假设您使用的是最新的Android工具,比如v9或v
antdebug
来构建它。因此,编写一个简单的脚本来编译所有这些项目是没有问题的。我每天都用哈德逊建立这些项目,效果很好
但是现在我们的项目需要进入发布阶段。因此compile命令变成antrelease
。对于编译发布项目,我必须在编译期间每次输入证书的密码。所以我不能自动发布
由于我有十个项目都需要与输入密码进行交互,所以这个编译工作让我非常痛苦
如何使发布版本仍然是自动的?假设您使用的是最新的Android工具,比如v9或v10 如果您查看Android SDK目录中的
tools/ant/main_rules.xml
:
<!-- called through target 'release'. Only executed if the keystore and
key alias are known but not their password. -->
<target name="-release-prompt-for-password" if="has.keystore" unless="has.password">
<!-- Gets passwords -->
<input
message="Please enter keystore password (store:${key.store}):"
addproperty="key.store.password" />
<input
message="Please enter password for alias '${key.alias}':"
addproperty="key.alias.password" />
</target>
<!-- called through target 'release'. Only executed if there's no
keystore/key alias set -->
<target name="-release-nosign" unless="has.keystore">
<echo>No key.store and key.alias properties found in build.properties.</echo>
<echo>Please sign ${out.unsigned.file} manually</echo>
<echo>and run zipalign from the Android SDK tools.</echo>
</target>
因此,我假设您必须向build.xml传递四个定义:key.store
,key.alias
,key.store.password
,key.alias.password
并且记住,出于安全原因,不要在命令行上传递这些定义。:) 只是一张便条。。。我不想在props文件中设置密码,默认情况下,您的密码将在命令行中回显,这也是一个问题。在main_rules.xml中添加SecureInPurthandler的使用,这样您的密码就不会暴露在命令行中
<target name="-release-prompt-for-password" if="has.keystore" unless="has.password">
<!-- Gets passwords -->
<input
message="Please enter keystore password (store:${key.store}):"
addproperty="key.store.password" >
<handler classname="org.apache.tools.ant.input.SecureInputHandler" />
</input>
<input
message="Please enter password for alias '${key.alias}':"
addproperty="key.alias.password" >
<handler classname="org.apache.tools.ant.input.SecureInputHandler" />
</input>
</target>
看看这篇文章,特别是它开始提到key.store.password
。我使用它没有任何问题
基本上,您应该在(生成)计算机本地创建一些
secure.properties
文件,这些文件必须保持相对安全,例如,每个人都无法访问或在源代码管理中不为每个人存储。该文件将密码存储为具有正确名称的属性,并将其导入到project ANT生成文件中。您可以在project文件夹的project.properties中定义密钥库配置。
就这样
key.store=/path/to/your/keystore
key.alias=yourkeyalias
key.store.password=yourkeystorepassword
key.alias.password=您的KeyAlias密码
基于梯度的构建 1)创建一个
secure.properties
文件以包含密码:
key.store.password=
key.alias.password=
您可能不希望它处于版本控制之下,这就是为什么我们将密码放在一个单独的*.properties
文件中的原因。如果您不介意将密码置于版本控制之下,您可以直接在build.gradle
中输入密码,但不建议这样做,因此我不会直接说明这一点
2)设置您的build.gradle
如下:
Properties secureProperties = new Properties()
secureProperties.load(new FileInputStream("secure.properties"))
android {
signingConfigs {
release {
storeFile file("<path to your keystore>")
storePassword secureProperties['key.store.password']
keyAlias "<alias name>"
keyPassword secureProperties['key.alias.password']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
您可能不希望它处于版本控制之下,这就是为什么我们不将密码放在现有的*.properties
文件中的原因。如果您不介意将密码置于版本控制之下,请将这两行代码放到ant.properties
中,就完成了
2)创建一个custom_rules.xml
文件,告诉生成系统您的secure.properties
文件
<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" default="help">
<property file="secure.properties" />
</project>
应该是这样
ant release
现在可以在不提示输入密码的情况下生成并签署我的APK。这里有一个自动输入密码的教程:。我可以问一下你的答案吗,只有在我之前有密钥的情况下,它才对我有效。但是如何自动生成它。您可以使用$keytool-genkey-v-keystore my-release-key.keystore-alias alias_name-keyalg RSA-keysize 2048-validity 10000
生成密钥库。详细信息是在何处创建自定义_rules.xml?这是签入您的版本控制的内容吗?@brianesteycustom_rules.xml
位于项目根目录中,与build.xml
一起。我将其签入版本控制。+1用于secure.properties
文件,并建议将其置于版本控制之外。这是解决这个问题的方便性和安全性的理想平衡。@iMDroid有趣的时机——今天下午我刚刚迁移了BatteryBot以使用基于Gradle的构建!谢谢你提醒我,我应该用我刚刚整理好的Gradle设置更新这个答案。@iMDroid我在向你发表评论之前更新了答案——“基于Gradle的构建”顶部的部分是新的!
<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" default="help">
<property file="secure.properties" />
</project>
<import file="custom_rules.xml" optional="true" />