5

私は Eclipse を使用して 1 つのプロジェクトで 1 つの Android アプリを開発しました。これは (iPhone から) 構造化されているため、1 つの定数でデモかフル バージョンかを定義します。

デモ版を作成するたびに、定数を変更する必要があるだけでなく、別のパッケージ名でプロジェクトのコピーを作成する必要があるという問題があります。

明らかに、元のフル バージョンの変更コードをデモにコピーする必要があります。そうしないと、アプリを提出するたびにデモ アプリの作成をやり直す必要があります。

次の 3 つのアプローチが考えられます。

1. ライブラリ プロジェクトを調査しましたが、この場合にこれが実際にどのように優れたソリューションを提供するのかはまだ不明です。

たとえば、アクティビティ構造を持つフル バージョンがあるとします。

A1
A2
A3

ユーティリティ クラス U1、U2 の使用

確かに、U1 と U2 はライブラリ プロジェクトにあり、両方のプロジェクトから参照できますが、アクティビティ、strings.xml、グラフィックス、レイアウトを複製する必要があります (または、表示されない別の方法がありますか?)残念ながら、このアプローチが提案されたとき、このトピックに関する同様の質問では説明されていません。

2. 別の方法は、さまざまなビルド設定に基づいてさまざまなパッケージ名を作成することです (iPhone に似ています)。かなりエラーが発生しやすいようです) 一方で、コンパイルは Eclipse の外部で呼び出す必要があります

3. おそらく最も簡単なアプローチ (そして現在もわずかな労力で) は、プロジェクトを手動でコピーし、1 つの定数を変更し、パッケージの名前を変更し、送信するたびにコンパイル/エクスポートすることです。ただし、これはかなり「基本的」であるように見え、確かに専門的には見えません (iPhone/xCode ビルド設定/ターゲット ソリューションと比較して)

最善のアプローチは何ですか (最小限の変更が必要であり、安定していて使いやすい) ?

どうもありがとう!

編集

ティムのソリューションを試したすべての人にとって、問題なく動作しますが、カスタム属性で問題が発生しました。

これを確認してください:ビルド中にAndroidライブラリのカスタム属性とパッケージ名の再マッピングを解決する方法は? ライブラリの問題を解決します

4

3 に答える 3

8

私は現在日食でこれを行っていますが、難しくありません。

  1. 既存のソースをライブラリ プロジェクトに変換します。

  2. 無料と有料の 2 つの新しいプロジェクトを作成します。

  3. ライブラリ プロジェクトを無料および有料のプロジェクトに含めます。

無料/有料プロジェクト内に 1 つのアクティビティまたはリソースを含める必要はありません。必要なのは、ライブラリのアクティビティを参照するそれぞれのマニフェストだけです。私の無料および完全なプロジェクトには、現在、単一の Java、リソース、またはレイアウト ファイルがなく、ライブラリからのアクティビティを参照する単なるマニフェストです。

私は両方のプロジェクトでまったく同じコードを使用しており、次のように区別しています。

if(getApplicationContext().getPackageName().equals("full version package name")) {
    //do full stuff
} else {
    //do free stuff
}

特にアプリをすでに市場にリリースしている場合は、私が見つけたいくつかの落とし穴があります。

  • アクティビティの完全な名前/パスを変更すると、ホーム画面から消えます。したがって、ライブラリのパッケージ名が既存のバージョンと異なる場合、ホーム画面のアイコンが失われます。ユーザーが交換できますが、理想的ではありません。
  • appwidget と同様に、レシーバー名を変更すると、アップグレード時に消えます。
  • リリースされたアプリケーションのパッケージ名は、いかなる場合でも変更できません。

無料版とプロ版を既にリリースしている場合は、アクティビティ パスを共通ライブラリ パスに変更する必要があり、リリースされたパッケージの名前をライブラリ パスと一致するように変更できないため、少し残念です。そのため、誰かが既存のアイコンを失う必要があります。

私の場合、分割前に無料版しかリリースしていなかったので、無料版と同じパッケージ名でライブラリに名前を付けることができました。ラッパー パッケージと同じパッケージ名のライブラリを含めることができるかどうか懐疑的でしたが、どうやらそうすることが可能です (私にとっては問題なく動作しています)。

したがって、私の場合、3 つのプロジェクトがあります。

  • コア ライブラリ: パッケージ名: com.myname.myapp
  • 無料版: パッケージ名: com.myname.myapp
  • Pro バージョン: パッケージ名: com.myname.myapp.Pro

また、無料版と完全版のマニフェストは、ライブラリ プロジェクトにのみ存在するcom.myname.myapp.ActivityAまたはという名前のアクティビティを追加します。com.myname.myapp.ActivityB

于 2012-10-18T20:58:47.627 に答える
2

最も簡単なアプローチは、3つのプロジェクトを持つことだと思います。

  1. デモ
  2. 満杯
  3. 図書館

デモプロジェクトと完全なプロジェクトには、それぞれのマニフェストファイルで定義されている独自のパッケージ名があります。それらのアクティビティは、ライブラリプロジェクトのプライマリアクティビティにバンドルで情報を送信するポートにすぎません。ライブラリプロジェクトのアクティビティは、デモアクティビティによって起動されたか、完全なアクティビティによって起動されたかを決定する必要なパラメータについて渡されたバンドルを読み取ります。その後、それに応じて続行します。

したがって、ロジックは次のようになります。

ユーザーがデモアクティビティを起動します->デモアクティビティは、デモアクティビティであるという情報を含むバンドルを作成します->デモアクティビティはライブラリアクティビティを起動し、ライブラリアクティビティがデモモードでプログラムの残りの部分を実行します。

また

ユーザーが完全なアクティビティを起動します->完全なアクティビティは、完全なアクティビティであるという情報を含むバンドルを作成します->完全なアクティビティはライブラリアクティビティを起動し、プログラムの残りの部分をフルモードで実行します。

于 2012-10-18T20:50:09.820 に答える
1

Android Studio で build.gradle を使用すると非常に簡単です。productFlavorsについてお読みください。とても便利な機能です。build.gradle に次の行を追加するだけです。

productFlavors {
    lite {
        packageName = 'com.project.test.app'
        versionCode 1
        versionName '1.0.0'
    }
    pro {
        packageName = 'com.project.testpro.app'
        versionCode 1
        versionName '1.0.0'
    }
}

この例では、2 つの製品フレーバーを追加します。1 つ目はライト バージョン用、2 つ目はフル バージョン用です。各バージョンには、独自の versionCode と versionName (Google Play 公開用) があります。

コードでは BuildConfig.FLAVOR をチェックするだけです:

if (BuildConfig.FLAVOR == "lite") {
   // add some ads or restrict functionallity

}

デバイスで実行およびテストするには、Android Studio の [ビルド バリアント] タブを使用してバージョンを切り替えます。 ここに画像の説明を入力

于 2014-12-01T08:16:58.197 に答える