2012年7月23日月曜日

Androidアプリ、有料版と無料版のソース共有化(だいたいまとめ)

以前からのエントリ(これとかこれとか)でも検証していた、有料版のアプリと無料版のアプリでソースを共有する手法について、手順などをあらかたまとめてみた。

使用しているEclipseはバージョン3.7.2。

まず前提として、有料版のソースがあるものとする(仮の名前としてプロジェクト名をMyApp、パッケージ名をcom.blogspot.uc1991.myappとする)。
そして、これを参照して無料版を作成するものとする(こちらはプロジェクト名をMyAppFree、パッケージ名をcom.blogspot.uc1991.myappfreeとする)。

利便性のため、有料版には無料版の処理やリソースも入れておく(プログラム上で処理を切り分けるにはgetPackageName()でパッケージ名を判定することで行う)。




第1の注意点として、こういった残念なことをしてソースを失わないよう、まず有料版のソースのバックアップをしっかりとっておくこと。



初めに、無料版のベースとなるプロジェクトを作成する。

  1. Eclipseの[ファイル]メニューから[新規作成]-[Androidアプリケーションプロジェクト]を選択する。
  2. 表示されるダイアログのアプリケーション名に無料版のアプリケーション名、プロジェクト名に"MyAppFree"、パッケージ名に" com.blogspot.uc1991.myappfree "を入れる。Build SDKやMinimum Required SDKにはMyAppと同じAPIレベルを指定する。「Create custom launcher icon」のチェックボックスは外す。
  3. 「次へ」のボタンを押す。
  4. アクティビティを作成するか聞いてくるので、「Create Activity」のチェックボックスを外して「完了」のボタンを押す。これで無料版のベースとなるプロジェクトが作成される。

次に、AdMobとか外部のライブラリを使用しているなら、無料版の方にも追加する(追加するライブラリが無いのならスキップしてリソースファイルの設定へ)。

  1. プロジェクトのフォルダworkspace\MyAppFreeの直下にlibsフォルダがなければ、libsフォルダを作成する。
  2. libsフォルダにライブラリの.jarファイルをコピーする(エクスプローラでコピーすればOK)。
  3. EclipseのパッケージエクスプローラでMyAppFreeのプロジェクトを右クリックし、メニューから「リフレッシュ」を選択する。これでパッケージエクスプローラ上でも、MyAppFree以下のlibsにコピーした.jarファイルが現れるはず。
  4. 次いで再びパッケージエクスプローラでMyAppFreeを右クリックし、今度はメニューから「プロパティ」を選択する。
  5. プロパティのダイアログで左のペインから「Javaのビルドパス」を選択。
  6. 「ライブラリ」のタブを選択し、「Jar追加」のボタンを押す。
  7. libsフォルダに追加した.jarファイルを選択し、「OK」ボタンを押す。
  8. 「OK」ボタンを押し、プロパティのダイアログを閉じる。これで、パッケージエクスプローラのMyAppFreeプロジェクトの下に「参照ライブラリー」の項目が追加され、その中にプロパティでビルドパスを追加した.jarファイルが表示されるはず。


ライブラリの追加が完了したら、次にresフォルダのリソースファイルの参照の設定を行う(resフォルダの他にassetsフォルダにアプリで使用するファイルを入れている場合は、assetsフォルダに対しても同様の操作を行う)。


  1. Eclipseのパッケージエクスプローラから、MyAppFreeプロジェクト配下のresフォルダを右クリック。
  2. 右クリックメニューから「削除」を選択。削除の確認のダイアログが表示されるので、「OK」ボタンを押す。これでMyAppFreeのプロジェクト作成時に自動で作成されたリソースファイルが削除される。(エクスプローラでworkspace\MyAppFreeを参照すると、resフォルダが削除されているはず)
  3. 今度はパッケージエクスプローラでMyAppFreeプロジェクトを右クリックし、右クリックメニューから「新規」-「フォルダー」を選択する。
  4. 「新規フォルダー」のダイアログが表示されるので、「拡張>>」のボタンを押す。
  5. ラジオボタンが表示されるので「Link to alternate location(リンクされたフォルダー)」のラジオボタンを選択し、「参照」ボタンを押す。
  6. 「フォルダの参照」のダイアログが表示されるので、リソースの参照元となるworkspace\MyApp\resフォルダを選択して「OK」ボタンを押す。
  7. 「新規フォルダー」のダイアログに戻るので「完了」のボタンを押す。これで、パッケージエクスプローラのMyAppFreeの下に、アイコンの右下に(参照を示す)小さな矢印のついたresフォルダが表示される。resフォルダを開くと参照元のMyAppのリソースと同じ内容が表示されるはず。


リソースファイルの参照の設定(及びassetsの参照)が完了したら、ソースファイルであるsrcの参照の設定を行う。ここは慎重に。
(ソースの参照元であるフォルダworkspace\MyApp\srcの下には、パッケージ名に従ってcom\blogspot\uc1991\myappのフォルダがあり、ソースファイルはこのmyappフォルダに置かれている)

  1. Eclipseのパッケージエクスプローラから、MyAppFreeプロジェクト配下のsrcフォルダを右クリックし、右クリックメニューから「新規」-「フォルダー」を選択する。
  2. 「新規フォルダー」のダイアログが表示されるので、「拡張>>」のボタンを押す。
  3. ラジオボタンが表示されるので「Link to alternate location(リンクされたフォルダー)」のラジオボタンを選択し、「参照」ボタンを押す。
  4. 「フォルダの参照」のダイアログが表示されるので、ソースの参照元としてworkspace\MyApp\src\comフォルダ(=元パッケージのルートフォルダ)を選択して「OK」ボタンを押す。(workspace\MyApp\srcでないことに注意)
  5. 「新規フォルダー」のダイアログに戻るので「完了」のボタンを押す。これで、パッケージエクスプローラのMyAppFreeプロジェクト配下のsrcの下に、com.blogspot.uc1991.myappのパッケージのみが表示されているはず。


ソースファイルの設定が完了したらあとひと息。次にビルド時の小細工を入れる。

  1. EclipseのパッケージエクスプローラからMyAppFreeを右クリックし、メニューから「プロパティ」を選択する。
  2. プロパティのダイアログで左のペインから「Javaのビルドパス」を選択。「プロジェクト」のタブを選択し、「追加」のボタンを押す。
  3. プロジェクト選択のダイアログが出るので有料版プロジェクトのMyAppを選択して「OK」ボタンを押す。
  4. プロパティのダイアログに戻るので「OK」を押して完了する。これで、MyAppFreeのビルドを行うと、先立ってMyAppのビルドが行われ最新の状態になってからMyAppFreeのビルドが行われるようになる。事前のビルドでありこの設定自体は必須ではないと思う。
  5. 有料版のgenフォルダからR.javaをコピーするバッチファイルrcopy.batを作成し、workspace\MyAppFreeフォルダに入れる。(バッチファイルの内容はこちらのサイトのページを参考に、"app-free"の部分を"MyAppFree"に、"app-paid"の部分を"MyApp"に置き換える)(バッチファイルをおくフォルダに注意)
  6. ビルド時にrcopy.batが実行されるようにするため、 パッケージエクスプローラからMyAppFreeを右クリックし、メニューから「プロパティ」を選択する。
  7. プロパティのダイアログで左のペインから「ビルダー」を選択し、「新規」のボタンを押す。
  8. 「構成タイプ」のダイアログが表示されるので、そのまま「OK」ボタンを押す。
  9. 「構成の編集」のダイアログが表示去るので、「名前」の欄に「Rクラスコピー」、「ロケーション」の欄に「${build_project}\rcopy.bat」、「作業ディレクトリ」の欄に「${build_project」と入れて「OK」ボタンを押す。(但し、「名前」欄には個別の名前を入れなければならないようで、別のプロジェクトで既に「Rクラスコピー」を使っていると「この構成の名前はすでに存在します」と表示されるので、その場合はユニークな名前を入れる。)
  10. プロパティのダイアログに戻るので「OK」を押して完了する。 これで、MyAppFreeのビルドを行うと、先立ってMyAppからgenフォルダの内容がコピーされるようになる。初回のビルドではこちらで書いたようにプロジェクトのクリーンを実行しておくこと。


有料版からAndroidManifest.xmlをコピーして内容を修正する。

  1. パッケージエクスプローラでMyAppのAndroidManifest.xmlをMyAppFreeにCtrl+ドラッグ&ドロップして上書きコピーする。
  2. コピーしたAndroidManifest.xmlを開く。
  3. パッケージ名を無料版のパッケージ名"com.blogspot.uc1991.myappfree"に修正する。
  4. パーミッションの設定を無料版に合わせて修正する。
  5. アイコンのリソース名、アプリの文字列リソース名を無料版に合わせて修正する。
  6. アクティビティの名前は"MyAppAvtivity"や".MyAppActivity"といった省略形ではなく、パッケージ名も含めた"com.blogspot.uc1991.myapp.MyAppActivity"といったフルパスに修正する。


ここまでが一通りの手順。
(もっといい方法もあるかもしれないけど)

・・・・・・なのだが、ソースファイルやらに×マークがついて「Rを変数に解決できません」のエラーが残ることがある。初回はプロジェクトのクリーンを実行した上で、コマンドプロンプトを起動して手動でrcopy.batを実行してR.javaをコピーしておく。(自分はこれで☓マークが消えた)

これでも×マークが残る場合はプロジェクトのクリーンやリフレッシュ、Eclipseの再起動を試す。



以下に、まとめるにあたって参考にさせていただいたページを改めて載せておく。


0 件のコメント:

コメントを投稿