Androidアプリを製品版とテスト版でパッケージ名を分けようとしたんですが
なかなか面倒かった、というだけの記録。
事の経緯
先日、軽微な修正をお願いされた既存のAndroidアプリがあって、それは製品版とは別に、事前のコンテンツチェック用の検証版というものが存在していました。
単純に参照先のサーバーが違う程度なのですが、パッケージが同一なので、その2つを端末に同居させることができません。
そのため検証版を使う人は、必要に応じて製品版をアンインストールして検証版を入れて、検証が終わったら製品版を入れなおすということをやっていたそうな。(基本は製品版を使っている)
それは面倒だということで、ちょっと手直しをするついでに、パッケージ名を分けて製品版と検証版の2種類を用意して、端末に同居できるようにしようかと思い立ったのですが…
Androidで別パッケージの同一アプリを作る(パッケージを変更する)
Android(というかJavaですかね)はソースを配置する構造としてパッケージ名が利用されるので、AndroidManifest.xmlのパッケージを変更するだけではダメなんですね。
Eclipseを使っている場合は、リファクタリング機能を使えばできるみたいですが、ボタン一発!というわけではないので、やっぱり面倒。
パッケージ名の変更(Eclipse) - Androidアプリ開発のための基礎知識
さらに、パッケージ名が変わるとソース内のimport文もディレクトリ構造も変わるから、ソース管理的にもちょっと面倒なことになりそう。
同一アプリで目的別にパッケージをわけるには
何か方法はあるのでは、と先人の知恵を拝借しようとしたところ、このような構成を作ればできるみたい。
無料アプリと有料アプリのプロジェクトを管理する - 明日の鍵
とは言え、プロジェクト作成時に意識していれば良いですが、途中から構造を変えるのはコストが高いですね…
ちなみにiOSだと
iOSで同じようなことをしたい場合は、特にソース内に依存する情報もないので、プロジェクトの設定で変更すればOK。
- Xcodeのプロジェクト名、Bundle Identifier、アプリ名の関係 - Debian GNU/Linux 3.1 on PowerMac G4
- iPhoneアプリ開発でBundle IDを書き分けてビルドする方法
ちなみにTitaniumだと
私がアプリ開発時によく使うTitaniumで、同じように製品版と別にテスト用に別パッケージでアプリを用意したケースがありましたが、特に苦労しませんでした。
(そのせいもあって、今回も簡単にできるものと思い込んでしまったのですが…)
アプリの基本情報を設定するtiapp.xml内の <id>
の1箇所を記述するだけで、iOSではバンドルID、AndroidではパッケージIDとして扱われ、その情報を元に必要なソースを生成してくれるからです。
(正確には都度Javaのソースコードを生成しているわけではないので、結果的にパッケージ名が影響する範囲が少ない)
tiapp.xml内の <id>
を変更しても、その情報を元に再生成されるので、直接パッケージ名を扱うようなケースがない限り、今回のような問題を気にすることはないでしょう。
Titaniumを使うと気にしなくても良くなる利点の一つかな、と思いました。
まあ、そんなに頻繁にあることではないのと、わかっていれば対処はできるという点で、メリットとしては非常に薄いですが…。
dev.tiappプラグイン
そういえば、 Ti Weekly Clips で知った yomybaby/dev.tiapp というTitanium CLIのプラグインを使うと、tiapp.xmlに製品向けのIDと開発向けのID、という風に事前に書いておくこともできるので、この辺りをうまく使うと捗りそうです。
さらに余談ですが、GitHubの最新版はnpmでインストールできるものより少し新しくなっていて、カスタムPrefixという機能がついているので、そうすると製品版・開発版・AdHoc版などバリエーションが作れるようになるので、さらに便利になります。
で、結局どうしたかというと…
今回はTitaniumじゃないしー、ピンチヒッターだしー、というわけで、ブランチ切って別物にしてしまいました…
大きな修正がなければ、マージはそんなに大変じゃないだろうということで…