web-dev-qa-db-ja.com

gradleでサードパーティのDepのさまざまなサポートライブラリバージョンを管理するにはどうすればよいですか?

基本アプリケーションに含めるサードパーティライブラリがたくさんあります。サードパーティモジュールに含まれるサポートライブラリを制御できません。これにより、アプリケーションにAndroidサポートライブラリの同じバージョンを保持することが難しくなります。

各依存関係から特定のライブラリを除外できる場合、gradleを使用することを知っています。

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.Android.support'
}

ただし、サポートライブラリが大量にあり、サードパーティのライブラリごとにそれらをすべて除外すると、やり過ぎのように見えます。

もっと良い方法はありますか?

このブログ投稿を読む: https://www.devsbedevin.net/Android-understanding-gradle-dependencies-and-resolving-conflicts/

それは提案します:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

ただし、それを使用する場合、GradleファイルのAndroid St​​udioで、サポートライブラリの複数のバージョンが検出されたという警告が引き続き表示されます。

依存関係がサポートライブラリの異なるバージョンに依存している場合はどうすればよいですか?上記のいずれの場合でも、サードパーティのライブラリに、ビルドされていない特定のバージョンのサポートライブラリを使用するように強制します。どのバージョンを使用する予定ですか?最新のサポートライブラリ?すべてのサードパーティの依存関係の最小サポートライブラリですか?

以下は、それぞれが独自のサポートライブラリのバージョンに依存するサードパーティの依存関係をプルすることを示す最小限のgradleファイルの例です。

Android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 25
    }
}

configurations.all {
    resolutionStrategy {
        preferProjectModules()
    }
}

dependencies {
    compile 'com.Android.support:support-v13:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

Androidスタジオでは次の警告が表示されます。

enter image description here

38

これは確かに可能です。プロジェクトのbuild.gradleファイル(最上位のbuild.gradleファイル)に、次のコードブロックを追加します。

ext {
    supportlib_version = '26.1.0'
    gps_version = '11.2.0'
}

//Ensure that all dependencies use the same version of the Android Support library
subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.Android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$supportlib_version"
            }
            if (details.requested.group == 'com.google.Android.gms'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$gps_version"
            }
        }
    }
}

次のコードは、すべての依存関係で 'com.Android.support'依存関係バージョンが$ supportlib_versionと等しくなるようにします。 「com.google.Android.gms」フレームワークでも同じです。

モジュールのbuild.gradleファイルで、依存関係にもこれらのバージョンを使用していることを確認してください。例えば。:

compile "com.Android.support:support-v4:$supportlib_version"

Official Gradle documentation で特定の依存関係バージョンの強制の詳細をお読みください。

UpdateGoogleはライブラリバージョンを分離しました 。したがって、15.0.0より上の特定のバージョンを強制すると機能しない場合があります。代わりに、限られた範囲のバージョンを許可できます。以下の例では、15.0.0より高いが16より低いバージョンを許可しています。

gps_version = '[15.0.0, 16.0.0)'
42
Mdlc

最初のケース:互換性がありますlibs既に内部で更新されていますlibs、ここでは問題ありません。

2番目のケース:プロジェクトにlibsがあり、他のバージョンよりも高いバージョンがありますlibs他の内部に含まれていますlibs、これらのlibsは、このような問題もなく新しいバージョンに更新できます。ここでも問題ありません。

最悪の場合:プロジェクトには、他のバージョンよりも高いバージョンを持つライブラリがありますlibs他の内部に含まれていますlibsおよびこれらのlibs内部で既に更新された新しいバージョンはありませんlibs、そのための推奨される解決策:

  1. そのライブラリをダウンロードし、app as projectimplementation project(':library')に含めて、内部のlibsを更新します。
  2. または、代わりに他のライブラリを使用します。

./gradlew app:dependenciesを使用して依存関係を確認することを忘れないでください。

また、私はそれを何らかの方法で自動的に行う必要があると考えています。

3
user6490462

targetsdkversion26を作成し、gradleで26を変更するか、compilesdkバージョンを25に変更し、関連する依存関係を25に変更します。

0
Santanu Sur

必要なライブラリの前に競合を引き起こしている依存関係を、希望するバージョンで指定する必要があります。その場合、これらのlibは指定された依存関係バージョンを使用します。

スクリーンショットのライブラリ(警告メッセージから)の例

dependencies {
    compile 'com.Android.support:support-v13:26.0.0'
    compile 'com.Android.support:support-compat:26.0.0'
    compile 'com.Android.support:animated-vector-drawable:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

異なるライブラリバージョンに関する警告メッセージが表示されなくなるまで、依存関係(スクリーンショットの警告に表示される)の追加を続けます。

0
Mateusz