web-dev-qa-db-ja.com

複数のres.srcDirsを使用し、いくつかのリソースをgradleでオーバーライドする方法

さまざまなproductFlavorsに基づいてアプリのさまざまなバージョンを構築したいのですが、まだ達成できないある程度の柔軟性が必要です。

これは私のフォルダ構造です:

_+src
  +main
    +Java
    +res
  +base
    +Java
    +res
  +custom1
    +Java
    +res
  +custom2
    +res
_

共通コードはmain(サービス)にあり、ベースUIはbase(アクティビティ)にあります。次に、新しいUIを定義するアプリのカスタムバージョンがオンになりますcustom1(新しいアクティビティ)。これは正常に実行されています。しかし、base uiを使用する別のバージョンのアプリ(custom2)が必要ですが、一部の解像度(アイコン、文字列、または色)を変更しています。

Build.gradleファイルで試しているのは次のとおりです。

_Android{
    ...
  productFlavors {
    base {
      ...
    }
    custom1 {
      ...
    }
    custom2 {
      ...
    }
  }

  sourceSets{
    custom2{
      Java.srcDirs = ['src/base/Java']
      res.srcDirs = ['src/custom2/res', 'src/base/res']
    }
  }
}
_

custom2baseのソースコードとリソースおよびcustom2のリソースを使用することを指定します。

問題は私が得ることです:

_Error: Duplicate resources: <project_path>/src/base/res/values-es/strings.xml:string-en/app_name, <project_path>/src/custom2/res/values-es/strings.xml:string-en/app_name
_

_app_name_はbasecustom2の両方で定義されているため、私の目標はbaseのリソースの定義をcustom2のいずれか。

custom2の_app_name_に何も指定しないと、_res.srcDirs_がmainでオーバーライドされることはわかっていますが、- baseは利用できなくなります。

アプローチは正しいですか?または、Gradleが提供する柔軟性を悪用していますか?または私がやろうとしていることをする方法はありますか?

前もって感謝します!

10
Parmaia

この方法でそれを達成することはできません。

リソースのマージには優先順位があります。

マージされたリソースは、次の3種類のソースから取得されます。

  • メインのsourceSetに関連付けられているメインのリソース。通常はsrc/main/resにあります。
  • ビルドタイプとフレーバーに由来するバリアントオーバーレイ。
  • ライブラリプロジェクトの依存関係。これは、aarバンドルのresエントリを介してリソースを提供します。

説明したように ここ

上記のように、各sourceSetは複数のリソースフォルダーを定義できます。例えば:

Android.sourceSets {
   main.res.srcDirs = ['src/main/res', 'src/main/res2']
}

この場合、両方のリソースフォルダの優先度は同じです。これは、リソースが両方のフォルダーで宣言されている場合マージが失敗し、エラーが報告されることを意味します

あなたの場合も同じことが起こります。この方法で同じリソースを複製することはできません。

9

Srcの兄弟に共有と呼ばれる別のレベルのフォルダーを追加し、重複を避けるために必要なリソースを手動でチェックして追加のスクリプトにアセンブルすることで、このようなことを実現できました。

スクリプトはここから入手できます: https://github.com/smbgood/examples/blob/master/family-resources.gradle

リソースは次のようなフォルダーに移動します(3つのアプリ「ファミリー」、IG、JB + CBがあります):
/shared/JB/res/values/ids.xml

現在使用しているビルドバリアントごとに、ids.xml'family 'に、使用するアプリファミリを決定するプロパティがあります。ビルド時に、スクリプトは共有で見つかったドローアブルとxmlファイルを調べ、それらをバリアントに存在するものと比較してから、重複するアイテムを削除し、最後に必要なアイテムを/ assembled /フォルダーに書き込みます。

1
Chase Turner