2011-03-17 53 views
24

我在一個文件夾中有十個Android項目。對於每個項目,我可以使用ant debug來構建它。因此編寫一個簡單的腳本來編譯所有這些項目是沒有問題的。我使用哈德森每天建立這些項目,並且它工作正常。Android自動化發佈版本

但是現在我們的項目需要進入發佈階段。所以編譯命令變成ant release。爲編譯發佈項目,我必須在編譯期間每次輸入證書的密碼。所以我不能做發佈的自動化。

這個編譯工作殺了我,因爲我有10個項目都需要與輸入密碼進行交互。

如何讓發佈版本仍然是自動的?

+0

這是一個自動輸入密碼的教程:http://helpmeco.de/2012/2/compiling-and-signing-android-release-apk-from-the-command-line。 – browep 2012-02-29 23:00:23

回答

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> 

搜索在XML文件中has.keystore顯示:

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

只是一個說明......我不想在道具文件中設置密碼,默認情況下,您的密碼將在命令行上回顯,這也是一個問題。將SecureInputHandler的使用添加到您的main_rules.xml中,以便在命令行上不公開您的密碼。

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

看看this的文章,特別是當它開始提key.store.password。我用它沒有麻煩。

基本上你應該在你的(構建)機器上創建一些本地的secure.properties文件,它必須保持相對安全,例如,每個人都無法訪問或者沒有存儲在源代碼管理中的每個人。該文件將密碼存儲爲具有正確名稱的屬性,並將其導入項目ANT構建文件中。

8

您可以在項目文件夾的project.properties中定義您的密鑰庫配置。 就這樣

key.store = /路徑/到/你/密鑰庫

key.alias = yourkeyalias

key.store.password = yourkeystorepassword

key.alias。密碼= yourkeyaliaspassword

+0

我可以問你一些關於你的答案的東西,只有當我有密鑰時,它才適用於我,但是我怎樣才能自動生成它。 – Reham 2013-03-19 06:49:10

+0

您可以使用'$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000'來生成密鑰庫。細節是[here](http://developer.android.com/tools/publishing/app-signing.html) – lishali 2013-03-22 05:29:20

22

爲基礎的搖籃建立

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,而不會提示輸入我的密碼。

+0

你在哪裏創建custom_rules.xml?這是否被檢入您的版本控制? – brianestey 2013-05-14 03:15:52

+1

@brianestey'custom_rules.xml'位於項目的根目錄下,與'build.xml'一起。我將它檢入版本控制。 – 2013-05-14 03:28:27

+0

感謝您的快速回復!我得到了它的工作。 =) – brianestey 2013-05-14 03:41:07