1

使用: 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 の構成に何かが欠けていると思います。

誰でも助けることができますか?ありがとう

4

1 に答える 1