[Android] 無料版と有料版のソースを統一

2014年5月20日火曜日

Android

t f B! P L

長らく、同じアプリの無料版と有料版を別々のプロジェクトとして管理し続けていて、無料版で更新した内容を有料版に反映したつもりがもれていたりして、大変だったんです。 で、http://d.hatena.ne.jp/tomorrowkey/20101020/1287584710 の記事を参考に1本化したんですけど、阿呆な私にはその道のりも大変険しく、はまりまくったのでメモを残しておきます。

  1. 無料版と有料版の2つのプロジェクトがある状態からのスタートだと、まずはどちらかをまるごとコピーして新しいプロジェクトを作り、そこで両方の機能を内包した1つのアプリにします。 パッケージ名は勿論無料版とも有料版とも違うものに変えてください。機能の違いは、上記URLに書いてある、パッケージ名で無料版か有料版かを判別するクラスを利用して if で分岐させます。 ソースもリソースもライブラリも、有料版にしか必要ないものも無料版にしか必要ないものも全て入れます。 必然的に差異が多ければ多いほど、パッケージのサイズが無駄に大きくなってしまいますが仕方ありません。 string.xml の app_name など、名前が同じで値が異なるものは、名前を分ける必要があります。 app_name_free と app_name_pro とかそんな感じで。 この共有プロジェクトの AndroidManifest.xml とかProGuardの設定ファイルとかは使わないのでマージするにあたって更新していく必要はありません。 放置でいいです。このプロジェクトのことは以下の説明ではCoreと呼びます。
  2. Coreプロジェクトを右クリックしてプロパティを開き、[Android]で下にスクロールして[Is library] にチェックを入れます。
  3. 既存の無料版と有料版のバックアップをとっておきます。SVN使ってるならコミットしてタグでも付けとけばいいでしょう。 使ってなければワークスペースの中のプロジェクトフォルダごとごっそりどこかにコピーしておけばいいかと。
  4. 無料版と有料版のプロジェクトから、ソースやライブラリやリソースを削除します。 このとき、src フォルダや res フォルダなどのプロジェクト直下にあるフォルダは残しておきます。 その下の階層(例えば values とか)はフォルダごと削除してしまってOKです。
  5. 無料版と有料版のプロジェクトを右クリックしてプロパティを開き、[Android]で下にスクロールして、[Add]ボタンでCoreプロジェクトを選択します。 Core以外のこれまで参照していたライブラリは外してしまっていいです。
  6. 無料版と有料版の AndroidManifest.xml を更新します。Activity 名の前に、Core のパッケージ名を付けます。 例えば今まで "MainActivity" だったものを、"com.example.hoge.core.MainActivity" にする感じ。 このとき、有料版でしか使わないアクティビティを無料版の AndroidManifest.xml に足したり、その逆をしたりする必要はありません。 使うアクティビティだけでいいです。パーミッションについてもそうです。 ソースが統一されたからといって、無料版でしか必要ないパーミッションを有料版につけたり、その逆をしたりする必要はありません。 また、アプリ名やランチャーアイコンをリソース参照すると思いますが、このとき、@packagename:string/app_name とか @packagename:drawable/ic_launcher としてはいけません。 別のパッケージにあることは気にせずにそのまんま @string/app_name と @drawable/ic_launcher でいいです。_free とかに名前変えた場合は当然 app_name_free にはしてくださいね。
  7. Eclipseのメニューの[Project]の[Build Automatically]はオフにしておき、ビルドの前にはCoreとビルドしようとしているほうのプロジェクトをメニューの[Project]の[Clean]してからビルドしましょう。 Cleanするときに、すぐにビルドする、みたいなオプションがありますがそれは外しておいてください。 この項目は、私の環境だとそうしないとエラーが出てしまうんですけど、皆がそうってわけでもないかもしれないのでCleanしなくても問題ないなら問題ないです。多分。

QooQ