5

IDEにビルド番号を自動的にインクリメントさせることは、長い間議論されてきた問題です-(私にとって)非常に基本的なものが非常に多くの作業であることにいつも驚いています。

このトピックの最高得点の質問と回答はここにあります: https ://stackoverflow.com/a/8156809/150016 私の問題は、解決策が.netに依存していることであり、を避けたいと思います。 Eclipseソリューションの正味の依存関係。また、VCSへの依存を避けたいと思います。

だから、私はポータブルで「Eclipseっぽい」ソリューションを探しています。最良の候補は、Antソリューション(これを投稿します)または上記のリンクされた回答のdotNetアプリに似たJavaアプリだと思います。

(回答が受け入れられ、すでに非常に長い投稿であるため、その質問に回答を追加しませんでした。モデレーターが希望する場合は、この質問を削除して、上記の質問に回答を追加します。)

私は比較的単純なものを望んでいましたが、この問題の解決策は本当に単純ではないと思います。

4

6 に答える 6

8

プロジェクトのプロパティダイアログの[ビルダー]で、apkをビルドする前に実行するスクリプトを構成できます。

プロパティダイアログで、左側のリストから[ビルダー]を選択します。[新規]をクリックして、新しいスクリプトを追加します。ポップアップ表示されるダイアログで、[プログラム]を選択します。次のダイアログで、[名前]フィールドでビルダープログラムを好きなように呼び出します。スクリプトへのパスを[場所]フィールドに入力します。[作業ディレクトリ]フィールドに作業ディレクトリを指定します。これらのフィールドで変数を指定できることに注意してください(たとえば、${build_project:/libs/update_version.sh}プロジェクトのlibディレクトリ内のスクリプトを参照するために使用します)。

これを他のビルダーの前に実行する必要があるため、[上へ]ボタンを使用してリストの一番上に移動します。

ダイアログの[ビルドオプション]タブ(上部の[名前]フィールドのすぐ下)で、このプログラムを実行するタイミングのオプションを選択できます。

ここでは、Linux、Unix、MacOSなどを想定しています。これらのシステムでは、grepまたはそのバリアントを使用して、現在のversionCodeを取得し、それをインクリメントしてから、awkなどを使用してファイルを適宜変更できます。または、Ruby、Python、Perlなどのスクリプトを記述して、AndroidManifest.xmlファイルのversionCodeを置き換えることもできます。Windowsにも同等のツ​​ールがあると思いますが、その環境にはあまり詳しくありません。

于 2012-05-25T19:32:06.937 に答える
7

Androidプロジェクトのビルドを「Maven-ise」しようとしましたか?

「maven-android-plugin」を使用する場合は、pom.xmlの「version」タグを使用してプロジェクトのビルドを追跡できます。

pom.xmlでは、「versions-maven-plugin」を使用してビルドバージョンをインクリメントできます

インクリメントされたビルド番号をAndroidManifest.xmlに反映するには、pomファイル内でバージョンの同期手法を使用できます。

このように、アプリがビルドされるたびに「versions-maven-plugin」を実行することで、Androidプロジェクトのビルド番号を自動インクリメントできます。このソリューションは、Antソリューションと同じように移植性もあります。

これがあなたが言及した問題(そして私が理解したこと)も解決できることを願っています。何か足りないものがあれば訂正してください。

于 2012-05-25T20:09:03.930 に答える
3

これがAntを使用するソリューションです。Antのセットアップを取得するのは少し面倒だったことを認めなければなりませんが、それはEclipseの広く使用されている強力な補助であるように思われるので、他の点で私にとって価値があることがわかると思います。

Antは、Eclipseを使用せずにAndroid SDKアプリを構築するための推奨ソリューションです(ここで説明します)が、ADTの一部ではないため、Eclipseを使用したばかりの場合はおそらくAntを使用できません。

したがって、最初のステップは、ここからAntをダウンロードしてインストールすることです。

次に、パスにAntを追加し、パスがJDK(JREではなく)も指していることを確認します。Windowsでは、JAVA_HOMEを作成し、それをJDKのルートにポイントする必要があることがわかりました。

自動インクリメントステップに必要なのはAntだけです(Eclipseを置き換えてビルド全体で使用することは意図されていません)が、Antが機能していることを確認するために、その方向にいくつかのステップを実行すると便利です。したがって、プロジェクトのルートに移動して、次のように入力します

> android update project --path .

これにより、プロジェクトのbuild.xmlが作成されます。私がそれをした後、私はすることができました

> ant release

そしてAntが私のプロジェクトを構築しました。あなたがその方向に進み続けたいのなら、私はこの記事が役に立つと思いました。

次に、プロジェクトの新しいbuild.xmlを編集し、次のタスクを追加しました(別のタスク/ターゲットの途中ではなく、どこにでも移動できます)

 <target name="update.buildnum">
      <buildnumber/>
      <!-- this task creates (and increments) Ant property 'build.number' which I use below -->
      <echo>Current build number:${build.number}</echo>         
      <echoxml file="res/values/buildnum.xml">
                <resources>
                    <string name="buildnum">${build.number}</string>
                </resources>                    
      </echoxml>
 </target>

上記で使用したタスクは、プロジェクトのルートにある「build.number」というファイル(作成するファイル)のビルド番号を自動インクリメントします。上記のタスクの残りの部分では、現在のビルド番号をリソース文字列に入れて、アプリケーションが次のコードで取得できるようにします。

String build = context.getString( com.your.app.R.string. buildnum );
int appBuild = ( int ) Integer.parseInt( build ); 

AndroidManifest.xmlのアプリケーションコードにビルド番号を書き込むソリューションを好む人もいます。 これを行うためのタスクを含む回答がありますが、サードパーティのAntタスク(xmltask)が必要であり、ビルドごとにサードパーティのタスクでマニフェスト(現在はかなり巨大です)を変更することを少し躊躇しています。そのタスクを使用することにした場合、ビルド番号を取得するための対応するAndroidコードは次のようになります。

String packageName = ctx.getPackageName();
PackageInfo pInfo = ctx.getPackageManager().getPackageInfo( packageName, 0);
int appVer = pInfo.versionCode;

最後に、ビルドを行うたびにEclipseにこのAntタスクを実行させる必要があります。

プロジェクトのプロパティに移動し、ビルダーを見つけて、ボタンをクリックして新しいビルダーを追加します。ここにはたくさんのオプションがありますが、指定する必要があるのはほんのわずかです。

  • Name:フィールドを設定して、ビルダーに名前を付けます。
  • ビルドファイルを選択します。「ワークスペースの参照」オプションを使用して選択した後、フィールドに「$ {workspace_loc:/appname/build.xml}」と入力しました。
  • [ターゲット]タブのリストからターゲットを選択します。私の場合、「help」タスク(上記で生成されたbuild.mxlのデフォルトタスク)を削除してから、「build.number」タスクを追加する必要がありました。手動ビルドのターゲットのみを設定することをお勧めします。

新しいビルダーを最初のビルドステップに移動しました。

このソリューションの問題の1つは、プロジェクトが変更されていなくても、Eclipseにアプリケーションをデプロイ(実行)させるたびに、新しい手動ビルドと見なされることです。したがって、アプリケーションを複数のデバイスにデプロイする場合、各デバイスには独自のビルド番号を持つ異なるビルドがあります。この問題を少し改善する1つのことは、将来のADTでは1回の操作で複数の展開が可能になるとGoogleが言っていることです。

これ(上記)は、Win732ビットでAnt1.8.4、Eclipse Indigo SR2(3.7.2)、ADT 20プレビュー2、およびSDKTools20でテストされました。

于 2012-05-25T19:40:05.803 に答える
1

私のソリューションは、Antの使用に基づいています(XMLTaskなし)

<property name="version.file" value="version.properties"/>
<property name="manifest.file" value="AndroidManifest.xml"/>
<!--build.slot: 0.1.2.3.4.5-->
<property name="build.slot" value="2"/>

<target name="all">
    <antcall target="increment.build"/>
    <antcall target="update.manifest"/>
</target>

<target name="increment.build">
    <propertyfile file="${version.file}">
        <entry key="build.no" type="int" default="0" operation="+" value="1" />
    </propertyfile>
</target>

<scriptdef name="setBuildNo" language="javascript">
    <attribute name="verName" />
    <attribute name="buildNo" />
    <attribute name="buildSlot" />
    <attribute name="property" />
    <![CDATA[
        var verNums = attributes.get("vername").split(".");
        var buildNo = attributes.get("buildno");
        var buildSlot = attributes.get("buildslot");
        if (!(buildSlot > 1 && buildSlot < 10))
            buildSlot = 2;
        var newVer = "";
        for (var i = 0; i < Math.min(verNums.length, buildSlot); i++)
            newVer += (verNums[i].trim() || "0") + ".";
        for (var i = verNums.length; i < buildSlot; i++)
            newVer += "0" + ".";
        project.setProperty(attributes.get("property"), newVer + buildNo);
    ]]>
</scriptdef>

<target name="debug">
    <setBuildNo verName="1" buildNo="999" property="a"/>
    <setBuildNo verName="2." buildNo="999" property="b"/>
    <setBuildNo verName="3.3" buildNo="999" property="c"/>
    <setBuildNo verName="4.4." buildNo="999" property="d"/>
    <setBuildNo verName="5.5.5" buildNo="999" property="e"/>
    <setBuildNo verName="6.6.6." buildNo="999" property="f"/>
    <setBuildNo verName="7.7.7.7" buildNo="999" property="g"/>

    <echo>1 =&gt; ${a}</echo>
    <echo>2. =&gt; ${b}</echo>
    <echo>3.3 =&gt; ${c}</echo>
    <echo>4.4. =&gt; ${d}</echo>
    <echo>5.5.5 =&gt; ${e}</echo>
    <echo>6.6.6. =&gt; ${f}</echo>
    <echo>7.7.7.7 =&gt; ${g}</echo>

</target>

<target name="update.manifest">

    <fail message="File not found: &quot;${manifest.file}&quot;" status="1">
        <condition>
            <not>
                <available file="${manifest.file}" />
            </not>
        </condition>
    </fail>

    <!-- Reads build version -->
    <loadproperties srcfile="${version.file}">
        <filterchain>
            <linecontains>
                <contains value="build.no="/>
            </linecontains>
        </filterchain>
    </loadproperties>

    <!-- Reads versionName from AndroidManifest -->
    <xmlproperty file="${manifest.file}" collapseAttributes="true"/>
    <fail unless="manifest.android:versionName" message="Attribute &quot;android:versionName&quot; undefined into &quot;${manifest.file}&quot;" status="1"/>
    <property name="version.name" value="${manifest.android:versionName}"/>

    <!-- Create a new version -->
    <setBuildNo verName="${version.name}" buildNo="${build.no}" buildSlot="${build.slot}" property="new.version.name"/>

    <!-- Replaces using regexp -->
    <replaceregexp
        file="${manifest.file}"
        match="android:versionName.*=.*&quot;.*${version.name}.*&quot;"
        replace="android:versionName=&quot;${new.version.name}&quot;"/>

    <!-- Replaces for check and generates a exception (if not found version) -->
    <replace
        file="${manifest.file}"
        token="android:versionName=&quot;${new.version.name}&quot;"
        value="android:versionName=&quot;${new.version.name}&quot;"
        failOnNoReplacements="true"/>

    <!--<echo>${version.file}</echo>
    <echo>${manifest.file}</echo>-->
    <echo>Auto Increment Build: ${version.name} =&gt; ${new.version.name}</echo>

</target>

使用する

ant [-Dmanifest.file = <file>] [-Dversion.file = <file>] [-Dbuild.slot = <number>]
    -Dmanifest.file-パスとファイル名AndroidManifest.xml。デフォルト:build.xmlを含むフォルダー内のAndroidManifest.xml
    -Dversion.file-番号ビルドバージョンを保存するパスとファイル名。デフォルト:build.xmlを含むversion.propertiesフォルダー
    -Dbuild.slot-バージョン配列内のビルド番号の位置。デフォルト:2、つまりXXbuild。

Eclipseでの自動インクリメントビルド

プロジェクト| プロパティ| ビルダー| 新規| Antビルド
    主要
        ビルドファイル
            <パス>/build.xml
        引数
            -Dmanifest.file = $ {workspace_loc://AndroidManifest.xml} -Dversion.file = $ {workspace_loc://version.properties}
    更新
        [x]完了時にリソースを更新する
        (*)リソースを指定する
            [リソースを指定]
                <プロジェクト>
                    [x] AndroidManifest.xml
    ビルドオプション
        [x]関連するリソースのワーキングセットを指定します
            [リソースを指定]
                <プロジェクト>
                    [x]解像度
                    [x] src
                    [x] AndroidManifest.xml
于 2014-06-23T08:37:47.337 に答える
0

私のソリューションでは、他の回答、XMLTask、Groovyにあるコードの一部を使用して、ビルド番号を自動的にインクリメントしました。また、git commitとtagを実行して、ビルド番号をバージョン管理の特定のポイントにリンクするルールも含めました。これは、バグ追跡に役立ちます。

 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>


  <path id="groovy.classpath">
    <fileset dir="/Users/deepwinter1/.gvm/groovy/current/lib/">
      <include name="*.jar"/>
    </fileset>
  </path>

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
    <classpath refid="groovy.classpath"/>
  </taskdef>

  <target name="update.build.number">
    <xmltask source="AndroidManifest.xml">
      <copy path="manifest/@android:versionCode" property="buildNum"/>
    </xmltask>
    <groovy>
      buildNum = Integer.valueOf(properties["buildNum"])
      properties["buildNum"] = buildNum + 1
    </groovy>
    <xmltask source="AndroidManifest.xml" dest="AndroidManifest.xml">
      <replace path="manifest/@android:versionCode"
        withText="${buildNum}"/>
    </xmltask>
    <antcall target="commit.and.tag.build">
      <param name="buildNum" value="${buildNum}"/>
    </antcall>
  </target>

  <target name="commit.and.tag.build">
    <exec executable="git">
      <arg value="commit"/>
      <arg value="-a"/>
      <arg value="-m"/>
      <arg value="Build Number ${buildNum}"/>
    </exec>
    <exec executable="git">
      <arg value="tag"/>
      <arg value="b${buildNum}"/>
    </exec>
  </target>
于 2013-05-17T21:56:30.467 に答える
0

あなたがここで見つけることができる「ビット」より良い回避策の答え... https://stackoverflow.com/a/8156809/304270

すべての新しいビルドの前に実行され、マニフェストファイルの適切な値を増やす小さなc#ツール。

于 2013-07-11T12:35:31.577 に答える