Android版自动化版本

时间:2011-03-17 02:57:30

标签: android

我在一个文件夹中有十个Android项目。对于每个项目,我可以使用ant debug来构建它。因此编写一个简单的脚本来编译所有这些项目是没有问题的。我每天都使用Hudson构建这些项目,并且工作正常。

但现在我们的项目需要进入发布阶段。因此编译命令变为ant release。为了编译发布项目,我必须在编译期间每次输入证书的密码。所以我不能自动发布。

由于我有十个项目都需要与输入密码进行交互,因此编译工作会让我失望。

如何使发布版本仍然是自动的?

5 个答案:

答案 0 :(得分:31)

假设您使用的是最新的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>

has.keystore中搜索XML文件会显示:

<!-- properties for signing in release mode -->
<condition property="has.keystore">
    <and>
        <isset property="key.store" />
        <length string="${key.store}" when="greater" length="0" />
        <isset property="key.alias" />
    </and>
</condition>
<condition property="has.password">
    <and>
        <isset property="has.keystore" />
        <isset property="key.store.password" />
        <isset property="key.alias.password" />
    </and>
</condition>

所以我假设您必须将四个定义传递给build.xml:key.storekey.aliaskey.store.passwordkey.alias.password

请记住,出于安全原因,不要在命令行上传递这些定义。 :)

答案 1 :(得分:23)

基于Gradle的构建

1)创建一个secure.properties文件以包含您的密码:

key.store.password=<your keystore password>
key.alias.password=<your 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
        }
    }
}

就是这样。 ./gradlew assembleRelease现在可以在不提示输入密码的情况下构建和签署我的APK。

基于Ant的构建

1)创建一个secure.properties文件以包含您的密码:

key.store.password=<your keystore password>
key.alias.password=<your alias password>

您可能不希望它受版本控制,这就是为什么我们不将密码放在现有的*.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>

我不熟悉这个构建系统,所以我不确定project元素的namedefault属性,但我相信我选择的应该适用于所有人

2b)任何最新版本的Android SDK工具应该不错,但如果由于某种原因您的build.xml文件不包含以下内容,则应添加它:

<import file="custom_rules.xml" optional="true" />

那应该是它。 ant release现在可以在不提示输入密码的情况下构建和签署我的APK。

答案 2 :(得分:8)

您可以在项目文件夹的project.properties中定义密钥库配置。 就像这样

  

key.store = /路径/到/你的/密钥库

     

key.alias = yourkeyalias

     

key.store.password = yourkeystorepassword

     

key.alias.password = yourkeyaliaspassword

答案 3 :(得分:1)

只是一个注释......我不想在道具文件中设置密码,默认情况下,您的密码将在命令行上回显,这也是一个问题。向main_rules.xml添加SecureInputHandler的使用可以使您的密码不会在命令行中公开。

<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>

答案 4 :(得分:1)

查看this文章,特别是它开始提及key.store.password的文章。我没有遇到过麻烦。

基本上你应该在你的(构建)机器本地创建一些secure.properties文件,这个文件必须保持相对安全,例如每个人都无法访问或者没有为源代码管理中的每个人存储。该文件将密码存储为具有正确名称的属性,并将其导入到项目ANT构建文件中。