Android版本构建的自动化

Android版本构建的自动化,android,Android,我在一个文件夹中有十个Android项目。对于每个项目,我都可以使用antdebug来构建它。因此,编写一个简单的脚本来编译所有这些项目是没有问题的。我每天都用哈德逊建立这些项目,效果很好 但是现在我们的项目需要进入发布阶段。因此compile命令变成antrelease。对于编译发布项目,我必须在编译期间每次输入证书的密码。所以我不能自动发布 由于我有十个项目都需要与输入密码进行交互,所以这个编译工作让我非常痛苦 如何使发布版本仍然是自动的?假设您使用的是最新的Android工具,比如v9或v

我在一个文件夹中有十个Android项目。对于每个项目,我都可以使用
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?这是签入您的版本控制的内容吗?@brianestey
custom_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" />