我在一个文件夹中有十个Android项目。对于每个项目,我可以使用ant debug
来构建它。因此编写一个简单的脚本来编译所有这些项目是没有问题的。我每天都使用Hudson构建这些项目,并且工作正常。
但现在我们的项目需要进入发布阶段。因此编译命令变为ant release
。为了编译发布项目,我必须在编译期间每次输入证书的密码。所以我不能自动发布。
由于我有十个项目都需要与输入密码进行交互,因此编译工作会让我失望。
如何使发布版本仍然是自动的?
答案 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.store
,key.alias
,key.store.password
,key.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
元素的name
或default
属性,但我相信我选择的应该适用于所有人
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构建文件中。