2015/02/21

[Android]有料版と無料版の切り替え

[2015/06/01追記]Android Studioでは下記手順のほとんどを無視して簡単にパッケージの切り替えができることがわかりました。また、やり方についてもベターな方法を編み出しました。Eclipseユーザー向けにこのページを残しておきますが、Android Studioユーザーは新しい方法を推奨します。

Google Playにアプリを公開するとき、有料版と無料版は別のアプリとして登録しなければなりません。
広告が入るくらいしか違いがないのだから簡単に切り替えたいですが、パッケージ名を変えるといろいろ祟りがあってイヤですよね。
Android開発し始めたばかりでまだツールの使い方や、AndroidManufestのいじり方もわからなかったころは本当に恐怖でした。

いくつかアプリを作ってみて、なんとなくコツが掴めてきたのでまとめておきます。

まず最初に、Eclipseはパッケージの切り替えについて効率の良いツールを提供してはいない、というのが私の結論です。上品プログラマーとしては、用意されたツールを使わない手はないとおもってあれこれ調べたのですが、あきらめざるを得ませんでした。
考えてみれば、パッケージはアプリの名前みたいなものですから、さくさく切り替えられてはたまらない、というのは理解できます。

AndroidManufest.xmlにかかれてるpackageを書き換えるとソースコード上に一気にコンパイルエラーが発生しますが、これはリソースIDを管理しているgen以下のパッケージ名がpackageに依存しているからです。
リソースIDを管理している<パッケージ名>+".R"というファイルのファイル名が変わるので、コード内のimport文をすべて書き換えるのは必須作業です。
逆に言うと、手間がかかる作業はこれだけで、あとは合理的に扱うことができます。

余談ですが、AndroidManufest.xmlに記述されるパッケージ名とアプリで使われているパッケージ名が同じである必要はないようです。わざわざ変える必要もないのですが、二つの間に関連性がないと気が付かないで嵌ったことがあるので、念のために。

以下は私がやっている手順です。

  1. 無料版用のパッケージを作ります。起動Activity、EclipseのウイザードがMainActivity.javaという名前で作るあれの格納されたパッケージと同列に”XXX_free”という名前で作っています。
  2. 新しく作ったパッケージに無料版に必要なクラスを移動します。上品プログラマーなら無料版と有料版のクラスを切り分けるためのデザインはできているはずです。最低限、起動Activty、例ではMainActivity.javaだけは複製する必要があります。起動時に有料版と無料版を切り替えるからです。単純に広告が入っているだけの違いなら起動Activityの複製だけで済むはずです。
  3. AndroidManufest.xmlの内容を書き換えます。
    - ?xmlタグのpackageをfree版のパッケージ名に切り替えます。例だとXXX_hureeです
    - 起動Activityをフリー版に切り替えます。intent-filterでが指定されているActivityです。これで無料版の起動Activityが呼ばれるようになります。
    - 無料版で必要なPermisionを追加します。広告を入れるなら、ネットワークなどの権限を足さなければなりません。逆に不要なPermissionは削除します。不要なPermissionが残っているアプリはセキュアではありませんし、マルウェアと思われかねません。PermissionはProguardも落としてくれません。
    - バージョン番号の更新が必要なら更新しておきましょう。上品プログラマーはバージョン番号を大事にします。
  4. String.xmlのapp_nameを無料版に書き換えます。多言語対応している場合はすべての言語で更新するのを忘れずに。
  5. Cleanしてからフルビルドします。このときアプリによっては大量のエラーが出ます。エラーの原因は自動生成されたクラスのパッケージ名が変わったからだけですから、あわてずにimport文の.Rで終わる一文を新しいパッケージ名に書き換えます。
  6. proguardをかけます。不要なクラスやライブラリはproguardが落としてくれるので、気にする必要はありません。proguardの設定は有料版と無料版の共用で構いません。
以上が私のやっている方法です。
一気に書き換えるツールを作ったら需要ありますかね。5分もかからないので手作業でやっていますが。


0 件のコメント:

コメントを投稿