AndroidアプリにSVNのリビジョン番号をリソースに含める

みなさん、何かしらソース管理のシステムを使って管理していると思います。
僕は、SVNを使ってます。

そうすると当然アプリのバージョン表示にリビジョン番号を入れたくなります。
メジャーバージョンとかマイナーバージョンは入れてますが、リリース管理的にはコッチはおまけで気分で変更するいわゆる「かざり」というやつです。
最近はあまりやりませんが、Rewitを頻繁に更新してた頃はテストバージョンを出したりしてたので同じバージョン番号でリビジョン違いというのもありました。
あるバージョンのテストでだすのでリビジョンだけ変更されていくわけです。


で、リビジョン番号を手で入れてたら面倒なわけです。


Eclipseを使い始めるより前からSVNを使ってましたので基本は「TortoiseSVN」を使用してリポジトリの管理とかをしています。「subclipse」も入れてはいますけどね。

TortoiseSVNのコマンドライン機能を使って文字列リソースを含んだ「/res/values/version.xml」を作成します。
これをビルド時に実行するようにしておけばコミットしてクリーンすれば自動的にリビジョン番号がアプリ内に反映されます。

ではいつも僕がやっているパターンを例に紹介します。

ディレクトリ構造
以下のような構成に最終的になります。
 ┬.externalToolBuilders  今回の設定をすると出来上がってしまうフォルダ
 │└SVN_PcAutoWaker.launch  今回の設定をすると出来上がってしまう設定ファイル
 ├bin
 ├gen
 ├res
 │├drawable-hdpi
 │ <中略...>
 │└values
 │ └version.xml  これが出来上がりのxmlファイル
 ├src
  <中略...>
 └version.in  これがxmlのベースになるファイルです。

ベースになる「version.in」ファイル
まずはコレを用意します。別に拡張子は何でもいいです。
内容は以下のようなテキストファイルです。


<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="version_name">1.0.$WCREV$$WCMODS?a:$</string>
</resources>

$WCRE$ がリビジョン番号に置き換わります。
$WCMODS?a:$ は、作業コピーに変更があった場合に「1.0.123a」といったようにバージョン番号最後に文字をくっつけてテスト版的な表現をします。
2つめはお好みでいいと思います。
もちろんそれ以外にもいろいろな情報が含めれますのでリファレンスを確認してみてください。


プロジェクトの設定
1.プロジェクトの設定画面を開いて「Builders」→「New」と選んでください。
 
2.赤枠をした項目を入力してください。
「Name」は別のプロジェクトとかぶる内容にできませんので、プロジェクト固有の文字列にしてください。
「Working Directory」は「Browse Workspace」ボタンを押すと簡単に選べます。
「Arguments」には「"." ".\version.in" ".\res\values\version.xml"」と入力します。
 


追加した項目を一番上に
 


あとはビルドするだけ
こんな感じのログがコンソールに表示されるようになればOK
「/res/values/version.xml」が出来ているはずです。
 


出来上がり例
 


おまけ
さっきできた文字列リソースを下のようにマニフェストに登録しておくとさらに便利。
ただし、au oneマーケットとかamazon app storeとかに出すつもりの人は考え直したほうがいいかもしれません。
versionNameにリソースIDを指定すると弾かれて登録してくれません。改善してればいいですけど。。。
 


注意点
・設定が完了したら「.externalToolBuilders」以下のファイルもリポジトリに含めましょう。
 無くなるとちょっと悲しいです。
・「/res/values/version.xml」をバージョン管理に含めてはいけません。
 自動生成なので無意味です。
 というか、せっかくコミットして緑アイコンになってるのにビルドすると変更されるとかイミフ。
・AndroidMarket以外に登録する場合、マニフェストのversionNameにリソースを指定すると弾かれる場合があります。

以上です。
subclipseを使えばもっと簡単なのかもですが、VisualStudioでも似たようなことしているので足並み揃えてます。