Androidリリースビルドの自動化




android バージョン (4)

私は1つのフォルダに10個のAndroidプロジェクトを持っています。 プロジェクトごとに、私はant debugを使ってビルドすることができます。 したがって、これらのプロジェクトをすべてコンパイルするための簡単なスクリプトを書くことは問題ありません。 私は毎日これらのプロジェクトをビルドするためにHudsonを使用し、うまく動作します。

しかし今、私たちのプロジェクトは段階をリリースする必要があります。 したがって、コンパイルコマンドはant releaseます。 リリースプロジェクトをコンパイルするには、コンパイル時に毎回証明書のパスワードを入力する必要があります。 だから私はリリースのための自動化を行うことはできません。

このコンパイルジョブは私がパスワードを入力することと相互作用する必要がある10のプロジェクトがあるので私を殺します。

リリースビルドを自動化する方法を教えてください。


あなたが最近の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に4つの定義を渡さなければならないと思います: key.storekey.aliaskey.store.passwordkey.alias.password

セキュリティ上の理由から、これらの定義をコマンドラインに渡さないようにしてください。 :)


プロジェクトフォルダ内のproject.propertiesでキーストア設定を定義することができます。 ちょうどこのような

key.store = / path / to / your / keystore

key.alias = yourkeyalias

key.store.password = yourkeystorepassword

key.alias.password = yourkeyaliaspassword


ちょっとメモ...私は小道具ファイルにパスワードを設定したくないのですが、デフォルトではあなたのパスワードはコマンドラインにも表示され、これも懸念しています。 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>

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行をant.propertiesば完了です。

2) custom_rules.xmlファイルを作成して、ビルドシステムにcustom_rules.xmlファイルを伝えます。

<?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をビルドしてサインするようになりました。





android