使用: Android Studio 3.2.1 - Gradle 4.6
:app :lib1 (ライブラリ) :lib2 (ライブラリ) :app は lib1 と lib2 に依存します :lib 1 は lib2 に依存します lib2 はリソースのみを含むモジュールです (画像、文字列、色の res フォルダー) :app と :lib1 の両方から参照される一般的な値であり、Java コードではありません)
:app モジュールと :lib2 モジュールを同じフレーバーでフレーバーしたい (アプリごとに異なるパッケージを指定する顧客向けにアプリをカスタマイズするため)。:lib1 にはフレーバーがありません
フレーバーを追加する前に、すべてが正しく機能します。:app モジュールと :lib2 モジュールに "client1" というフレーバーを 1 つ追加しました。:lib2\src\client1 の "client1" フォルダーを :lib2 に追加しました。
Gradle コンパイルにより、次の関連するビルド バリアントが作成されました。
デバッグ ビルド バリアントを実行すると、アプリが正しくインストールされ、:lib2 モジュールの client1 フレーバーから適切なリソースが正常に取得されます
ここで、2 番目のフレーバー、つまり「client2」を :app および :lib2 モジュールに追加し、「:lib2\src\client2」に 2 番目の顧客カスタマイズ用のフレーバーのリソース用のフォルダーを追加しました。ライブラリ モジュール :lib2 の :app と :lib1 の gradle ファイルに productFlavors と構成、および相対的な依存関係を追加しました。
APP MODULE GRADLE FILE
apply plugin: 'com.android.application'
android {
defaultConfig {
applicationId "it.test.myapp"
.
.
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
versionNameSuffix "-client1"
applicationIdSuffix ".client1"
}
client2 {
dimension="default"
versionNameSuffix "-client2"
applicationIdSuffix ".client2"
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
// implementation project(':lib2') //before flavors
implementation project(':lib1')
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2Debug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ....
. . .
}
:lib1 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
....some configuration
defaultConfig {
...some configuration
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
//implementation project(':lib2') //before flavors
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2tDebug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ...
....some implementation
}
:lib2 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
publishNonDefault true
...some config
defaultConfig {
...some config
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
}
client2 {
dimension="default"
}
}
}
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])
...some implementation
}
:app と :lib1 モジュールの両方が :lib2 モジュール リソースの適切なフレーバー バージョンを使用することを期待していました。gradle をビルド バリアントと同期します: :app-client1Debug :lib1-Debug //フレーバーはありません :lib2-client1Debug
Gradle 同期プロセスは例外で終了します: :app:processClient1DebugResources FAILED FAILURE: Build failed with an exception. • 問題: タスク ':app:processClient1DebugResources' の実行に失敗しました。Android リソースのリンクに失敗しました 出力: /Users/davide/Documents/......./android/MyApp/app/build/intermediates/incremental/mergeClient1DebugResources /merged.dir/values/values.xml:2601: エラー: リソース color/colorPrimary (別名 it.test.myapp.client1:color/colorPrimary) が見つかりません。</p>
および:lib1が:lib2 client1フレーバーから取得する必要がある他のリソースをリンクする他の同様のエラー。
:lib1 パッケージはこれらのリソースを読み取ることができないようです メニュー「Build->Rebuild Project」から再構築しようとすると、同様のエラーが発生します:
:lib1:javaPreCompileDebug /Users/david/Documents/...../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:183: エラー: シンボル textView が見つかりません。 setTextColor(MyApplication.getInstance().getResources().getColor(R.color.colorPrimaryDark)); ^ 記号: 変数 colorPrimaryDark 場所: クラス color .... ..... /Users/davide/Documents/......../android/MyApp/lib1/src/main/java/it/test/ lib1/utils/Utils.java:228: エラー: シンボル文字列が見つかりません channelId = context.getString(R.string.default_notification_channel_id); ^ 記号: 変数 default_notification_channel_id 場所: クラス string . . ....他の同様のエラー。. . 注: 一部の入力ファイルは、非推奨の API を使用またはオーバーライドします。注: 詳細については、-Xlint:deprecation を使用して再コンパイルしてください。50 エラー :lib1:compileDebugJavaWithJavac FAILED FAILURE: ビルドが例外で失敗しました。• 問題: タスク ':lib1:compileDebugJavaWithJavac' の実行に失敗しました。コンパイルに失敗しました。詳細については、コンパイラ エラー出力を参照してください。<br> • 試してみてください: --stacktrace オプションを指定して実行し、スタック トレースを取得します。--info または --debug オプションを指定して実行し、より多くのログ出力を取得します。--scan を指定して実行すると、完全な洞察が得られます。* でさらにヘルプを得る https://help.gradle.org
:app-client2Debug :lib1-Debug //フレーバーがありません:lib2-client2Debugでビルドバリアントを選択した場合
client2 フレーバーで同じエラーが発生し、:lib1 はそれらのリソースを読み取ることができません。誰かが私に正しい解決策を教えてくれませんか?ライブラリに依存関係があり、別の FLAVORED ライブラリからリソースを読み取ることはできますか? 私はこれを読みました https://android.jlelse.eu/product-flavors-for-android-library-d3b2d240fca2 とこれ https://proandroiddev.com/advanced-android-flavors-part-1-building-white-label- apps-on-android-ade16af23bcf と、非フレーバー アプリケーションから参照されるこの 1 つのAndroid マルチフレーバー ライブラリ - AAPT: リソースが見つかりません など...そして、私は正しかったのですが...しかし....動作しません
//UPDATE :lib2 gradle ファイルからフレーバーを削除し、:app と :lib1 からその依存フレーバー構成を削除しても、2 つのフレーバーがオンになっている :app モジュールを維持すると、アプリが実行され、boh バリアント用にインストールされ、この i の正しい versionNameSuffix が使用されます。 :lib2 の正しいフレーバーからリソースを読み取れるようにするために、:lib1 の構成に何かが欠けていると思います。
誰でも助けることができますか?ありがとう