Hatena::ブログ(Diary)

明日の鍵

2010-10-20

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

アプリを作った時に無料アプリと有料アプリと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);
  }
}

動作

f:id:tomorrowkey:20101020225601p:image

アイコンとアプリ名はAndroidManifestにそれぞれ定義するので

無料アプリと有料アプリで別のものを使用することができます。

今回は無料アプリにグレーのアイコンを、有料アプリに緑色のアイコンを使いました。

f:id:tomorrowkey:20101020225602p:image

f:id:tomorrowkey:20101020225603p:image

それぞれのアプリを実行しました。

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

サンプルソース

今回検証用に作ったソースはここにあります

http://code.google.com/p/tomorrowkey/source/browse/#svn/trunk/FreeAndPaymentSourceControl

これで

かなり管理が楽に!

もう何も考えなくていいよう!

nakanaka 2010/11/23 19:10 記事を見て簡単に切り替えることが出来ました!ありがとうございます。
CoreでAdMobを使ってるlibrary projectの場合、Freeの方でパッケージ名の解決ができず困ってます。
レイアウトのxmlでxmlns:appを指定して、app:backgroundColorを参照するところでエラーになります。なにか情報お持ちでしたら教えていただけますか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close