無料アプリと有料アプリのプロジェクトを管理する

アプリを作った時に無料アプリと有料アプリと2バージョン作る事ってよくあると思います。
無料アプリと有料アプリに分けたい場合、パッケージ名を変えないといけないのでプロジェクトを2つ立てる必要があります。
その場合、ソースが2重管理になってしまい、リリース後の改修が非常にめんどくださいです。
これはデコ美のバージョンアップでだいぶ苦しめられました…。
これを楽にしようと考えて方法を考えました。

プロジェクト作る

Androidライブラリを使うとソースが1つになり、管理が楽になります。
プロジェクトは合計3つ作ります。

  • AndroidPayApp(Androidアプリ)
    • 有料アプリ
    • package:jp.tomorrowkey.android.androidpayapp
  • AndroidFreeApp(Androidアプリ)
    • 無料アプリ
    • package:jp.tomorrowkey.android.androidfreeapp
  • AndroidAppCore(Androidライブラリ)
    • 実装コード
    • package:jp.tomorrowkey.android.androidcoreapp

方針

AndroidAppCodeにすべてのコードを書きます。
AndroidPayAppとAndroidFreeAppの2つのアプリはAndroidAppCoreを参照します。
AndroidPayAppとAndroidFreeAppの2つのプロジェクトには一切ソースは置きません。

AndroidManifest.xml

AndroidPayAppとAndroidFreeAppのAndroidManifestにはAndroidAppCoreのActivityの定義を書きます。
今回は1つのActivityのみなので以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.tomorrowkey.android.androidpayapp"
  android:versionCode="1"
  android:versionName="1.0">
  <application
    android:icon="@drawable/icon"
    android:label="@string/app_name">
    <activity android:name="jp.tomorrowkey.android.androidlib.MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="4" />
</manifest> 

掲載したのはAndroidPayAppのAndroidManifestです。
AndroidFreeAppのAndroidManifestはほぼ一緒なので載せません。

これでアプリからライブラリに定義されているActivityが呼び出せます。

無料アプリと有料アプリの判断

無料アプリは機能に制限をもたせないといけないので、無料アプリと有料アプリの判断をするコードが必要です。
Context#getPackageName()で有料アプリ、無料アプリそれぞれのパッケージ名が返ってくるのでそれで判断します。
Utilクラスでも作っておきましょう。

import android.content.Context;

public class Util {
  private static final String PAY_APP_PACKAGE_NAME = "jp.tomorrowkey.android.androidpayapp";
  public static boolean isPaymentApp(Context context) {
    String packageName = context.getPackageName();
    return PAY_APP_PACKAGE_NAME.equals(packageName);
  }
}

動作


アイコンとアプリ名はAndroidManifestにそれぞれ定義するので
無料アプリと有料アプリで別のものを使用することができます。
今回は無料アプリにグレーのアイコンを、有料アプリに緑色のアイコンを使いました。


それぞれのアプリを実行しました。
パッケージ名から無料版・有料版の判断をしてそれぞれの文字列を出力しています。

サンプルソース

今回検証用に作ったソースはここにあります
http://code.google.com/p/tomorrowkey/source/browse/#svn/trunk/FreeAndPaymentSourceControl

これで

かなり管理が楽に!
もう何も考えなくていいよう!