2013-11-01 3 views
12

私は無料のアプリと有料アプリを結合しようとしています。 Androidの新しいビルドシステムのproductFlavorsは、私の問題に完全に適合しているようです。Gradle Androidプラグインは、さまざまな製品の味のためにRファイルを生成しますか?

私はfreeAppフレーバーをうまく使っていますが、私がpayappフレーバーを作成すると、生成されるRファイルはfreeAppで定義されたパッケージ構造になります。私はいつもRファイルの場所は、マニフェストにパッケージ名によって定義されていると信じ

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" 
} 

:ここ

はgradle.buildファイルによってからの抜粋です。マニフェストファイルが正しく生成されていることを確認しました。

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

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

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

enter image description here

それぞれのAndroidManifest.xmlファイルには、完全かつ完全なマニフェストである - マニュアルに従って、メインツリー内のマニフェストには、製品を完全に上書きする必要があります風味のバージョン。しかし、これは明らかに起こっていません。なぜなら、開始されるべき活動とコンテンツプロバイダーが上書きされていないからです。

私が間違っていることについての洞察は、最も高く評価されます。これは、packageNameをオーバーライドする誰もが実行される非常に一般的な状況でなければなりません。私は今約1週間それを把握しようとしていて、自分でそこに着くことができないようです。

おかげで、AndroidののGradleプラグイン0.7.3の下で

-Aaron

答えて

10

は、生成されたR.javaファイルがのみsrc/mainのパッケージ名のために作られています。これは、異なるフレーバーのためのすべてのリソースを含んでいます、それは単にR.javaファイルに生成されます。私はこれをan IO talkから聞いた。

src/main/AndroidManifest.xmlのパッケージ名は何ですか?私の推測では、それはあなたsrc/mainのパッケージ名を使用してプログラム的にリソースにアクセスする必要があなたのクラスでRをインポートしてみcom.flyingspheres.android

だということです。

など。

import com.flyingspheres.android.R; 
+3

これは正しい回答です。受け入れられるべきである。 – osayilgan

関連する問題