13

無料アプリと有料アプリを統合しようとしています。Android の新しいビルド システムの productFlavors は、私の問題に完全に適合しているようです。

freeApp フレーバーはうまく機能していますが、paidApp フレーバーをビルドすると、生成される R ファイルは、freeApp で定義されたパッケージ構造になっています。

gradle.build ファイルによるスニペットを次に示します。

productFlavors {
freeApp {
    versionCode 201308020
    versionName "2.0.13_free"
    packageName "com.flyingspheres.android"
}
paidApp {
    versionCode 201305110
    versionName "2.0.10_paid"
    packageName "com.flyingspheres.android.inventory"
}

R ファイルの場所は、マニフェストのパッケージ名によって定義されると常に信じていました。マニフェスト ファイルが正しく生成されていることを確認しました。

問題は、両方のフレーバーの R ファイルが同じ場所にあることです。Gradle は、マニフェストがメイン ソース ツリー内に存在することを要求するため、R.java ファイルが生成されるメイン ソース ツリーにマニフェストのどのバージョンを入れてもかまいません。

各フレーバーの正しい場所に R ファイルを生成すると仮定します。各フレーバーが正しい R ファイルを参照するように、R ファイルのインポート ステートメントをどのように管理する必要がありますか?

これが私のプロジェクト構造のスクリーンショットです:

ここに画像の説明を入力

各 AndroidManifest.xml ファイルは完全なマニフェストです。ドキュメントによると、メイン ツリーのマニフェストは製品フレーバー バージョンを完全に上書きする必要があります。ただし、起動する必要があるアクティビティとコンテンツ プロバイダーが上書きされていないため、明らかにそうではありません。

私が間違っていることについての洞察をいただければ幸いです。これは、packageName をオーバーライドする人が遭遇する非常に一般的な状況でなければなりません。私は約1週間それを理解しようとしてきましたが、自分でそこにたどり着くことができないようです.

ありがとう、

-アーロン

4

1 に答える 1

10

Android の gradle plugin 0.7.3 では、生成されるR.javaファイルはの package nameに対してのみ作成されます。さまざまなフレーバーのすべてのリソースが含まれており、生成された 1 つのファイルにそれらを配置するだけです。これは IO トークで聞きました。src/mainR.java

のパッケージ名は何src/main/AndroidManifest.xmlですか? 私の推測では、それはcom.flyingspheres.android

のパッケージ名を使用してプログラムでリソースにアクセスする必要があるクラスにインポート してみてください。Rsrc/main

例えば

import com.flyingspheres.android.R;
于 2014-01-15T16:50:36.430 に答える