【訳】Gradleの依存関係が適切に処理されていないため、コンパイルが異常になる可能性があります

7035 ワード

記事|Ashesh Bharadwaj
承香墨影
承香墨影翻訳、編集、発表を授権する
Android Studioでは、Gradle構築プロセスは開発者にとって抽象的であることが多い.新しいAndroid開発者として、Gradleに初めて出会ったのはbuildです.gradleファイルにリモート依存項目を追加します.
Gradle依存関係ツリーを読み、依存関係に関する問題を解決する方法を見てみましょう.
これは私の仕事で管理しているプロジェクトで、targetVersionを27にアップグレードしたいと思っています.私もGradleで、最新のappcompat-v7サポートライブラリを最新の依存バージョン27.0.2に更新しました.変更後、buildでプロジェクトを同期します.gradleで次のエラーメッセージが表示されます.
このエラーは、完全に同じバージョンのサポートライブラリを使用する必要があることを示しています.しかし私は私のbuildにしかいません.gradleでは、このサポートライブラリが使用されています.
Android Studioのこのヒントはいったいどういう意味ですか?
このエラープロンプトでは、com.android.support:animated-vector-drawable:27.0.2またはcom.android.support-v4:21.0.3がどこで参照されていますか?
アプリケーションの直接依存ライブラリのみの場合はbuild.gradleでは依存を示すとよいが,これは非常に明確である.しかし、実際にはそうではなく、これらの依存関係はさらに自分の依存関係を持つ可能性があり、これを依存伝達と呼ぶ.Gradleは、すべての直接的または間接的な依存性をアプリケーションに含める必要があります.
前のAndroid Studioが提示した誤った情報は、私たちが今議論しているこれらの伝達依存関係に起因しています.
Gradleはこれらの依存関係をすべて解決しなければならない.どのライブラリが使用されていますか?2つの異なるライブラリが同じライブラリに対して異なるバージョンの依存関係を持っている場合、どのような問題が発生しますか?
Gradle依存ツリー(Gradleが依存関係を解析する方法)を表示するには、Android Studioの下部にあるTerminalタブに次のコマンドを入力します.
gradlew app:dependencies

これにより、すべての構築変数の依存関係解析ツリーが表示されます.上記のコマンドに識別子を追加して、特定の構築バリエーションの構成を表示できます.例えば、--configuration releaseCompileClasspathは、release変異体の依存ツリーを示すであろう.
構築バリエーションについては、公式ドキュメントを参照することをお勧めします.
https://developer.android.com/studio/build/build-variants.html
以上が上記コマンドの出力です.
releaseCompileClasspath - Resolved configuration for compilation for variant: release
+--- com.android.databinding:library:1.3.1
|    +--- com.android.support:support-v4:21.0.3
|    |    \--- com.android.support:support-annotations:21.0.3 -> 27.0.2
|    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1
+--- com.android.databinding:baseLibrary:3.0.1
+--- com.android.databinding:adapters:1.3.1
|    +--- com.android.databinding:library:1.3 -> 1.3.1 (*)
|    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1
+--- com.android.support.constraint:constraint-layout:1.0.2
|    \--- com.android.support.constraint:constraint-layout-solver:1.0.2
\--- com.android.support:appcompat-v7:27.0.2
     +--- com.android.support:support-annotations:27.0.2
     +--- com.android.support:support-core-utils:27.0.2
     |    +--- com.android.support:support-annotations:27.0.2
     |    \--- com.android.support:support-compat:27.0.2
     |         +--- com.android.support:support-annotations:27.0.2
     |         \--- android.arch.lifecycle:runtime:1.0.3
     |              +--- android.arch.lifecycle:common:1.0.3
     |              \--- android.arch.core:common:1.0.0
     +--- com.android.support:support-fragment:27.0.2
     |    +--- com.android.support:support-compat:27.0.2 (*)
     |    +--- com.android.support:support-core-ui:27.0.2
     |    |    +--- com.android.support:support-annotations:27.0.2
     |    |    \--- com.android.support:support-compat:27.0.2 (*)
     |    +--- com.android.support:support-core-utils:27.0.2 (*)
     |    \--- com.android.support:support-annotations:27.0.2
     +--- com.android.support:support-vector-drawable:27.0.2
     |    +--- com.android.support:support-annotations:27.0.2
     |    \--- com.android.support:support-compat:27.0.2 (*)
     \--- com.android.support:animated-vector-drawable:27.0.2
          +--- com.android.support:support-vector-drawable:27.0.2 (*)
          \--- com.android.support:support-core-ui:27.0.2 (*)

目的を見つける前に、Gradle依存関係ツリーのフォーマットを理解することが重要です.
まず、フォーマット用の3つの記号について説明します.
  • +- - -は、依存ブランチライブラリの開始である.
  • |は、以前の依存ライブラリでの依存かを識別し、依存ライブラリを表示します.
  • \- - -は依存ライブラリの末尾である.

  • アスタリスク(*)は依存ライブラリの末尾にあり、他のサブ依存ツリーにリストされているため、ライブラリのさらなる依存関係は表示されません.
    最も重要な標識は->です.
    Gradleが複数の依存ライブラリが同じライブラリに依存しているが異なるバージョンを発見した場合、選択する必要があります.同じライブラリを含む異なるバージョンは意味がありません.この場合、Gradleはデフォルトでライブラリの最新バージョンを選択します.
    例:
    | + — — com.android.support:support-v4:21.0.3
    | | \ — — com.android.support:support-annotations:21.0.3 -> 27.0.2
    

    以上、Gradleは、support-v4:21.0.3依存関係ツリーでは、support-annotations:21.0.3が更新されたバージョンsupport-annotations:27.0.2に依存するため、27.0.2が使用されると伝えた.
    Gradle依存関係解析ツリーを読む方法を知っています.私たちは本論文の核心問題に戻ります.すべてのcom.android.supportライブラリは、完全に同じバージョンを使用する必要があります.
    すべてのサポートライブラリは、次のグループcom.android.supportに属します.Gradleの依存関係ツリーで見たように、com.android.support:support-v4:21.0.3はバージョン21.0.3のみであり、最新バージョンのサポートライブラリ27.0.2に解析されていないため、競合の原因となります.
    どうやってこの問題を解決しますか?いくつかの方法があります.
    **1、ResolutionStrategy**経由
    ResolutionStrategyでGradleのバージョンを強制指定します.
    android {
            configurations.all {
            // To resolve the conflict for com.android.databinding:library:1.3.1
            // dependency on support-v4:21.0.3        
            resolutionStrategy.force 'com.android.support:support-v4:27.0.2'
        }
    }
    

    ResolutionStrategyの詳細については、公式ドキュメントに以下の詳細が記載されています.
    https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html
    2、build.gradleでバージョンを指定
    ビルドでgradleでは、com.android.support:support-v4:27.0.2が追加されていることを明確に指定しています.これにより、Gradleは古いバージョンを上書きします.
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support.constraint:constraint-layout:1.0.2'
        // To resolve the conflict for com.android.databinding:library:1.3.1
        // dependency on support-v4:21.0.3
        implementation 'com.android.support:support-v4:27.0.2'
        implementation 'com.android.support:appcompat-v7:27.0.2'
    }
    

    私にとってbuild.gradleに依存関係を明示的に追加すると、より自然になり、コメントを残すことができます.ライブラリを再更新して明示的に追加する必要があるかどうかを確認すると、このコメントは私に注目するように注意します.
    プロジェクトの同期を追加して実行すると、エラーテキストは消えます.次に、依存関係コマンドを再実行すると、support-v4:21.0.3-> 27.0.2を解決するのを見ます.
    ほとんどの場合、Gradleは依存関係を正しく解決します.Gradleの依存関係を理解して、私たちはこのような問題に直面して、どのようにそれを解決するかをもっとはっきりしなければならないと思います.
    私はこの文章がGradle依存関係ツリーとソリューションをさらに理解することを望んでいます.
    今日は公众号の楽屋で成长『成长』を回复して、私が整理したいくつかの学习资料を得て、『加群』を回复することができて、いっしょに学习の进歩.
    テキストリンク:https://proandroiddev.com/android-gradle-and-the-curious-case-of-invisible-dependency-7f1bcc8bb79e
    おすすめ:
  • 漫画:プログラマー、あなたはあなたの製品マネージャーを「管理」することができますか?
  • 公式新出Kotlin拡張ライブラリKTX
  • 批判的な思考が分からないので、プログラマーの生涯を制限している可能性があります.
  • Android開発、Emojiに頭痛いですか?
  • Andorid署名およびマルチチャネルパッケージングスキーム|VasDolly