アンドロイドのGradleシリーズ - 高度な記事

私たちは、限り、あなたはこのシリーズの私のGradleを読んだことがあるように、そしてあなたのGradleは国境を越えるだろう、いわば、再び使用Gradleの基盤を導入している通常の作業に対処するために開発された前回の記事では問題ではありません。

私は、複数のモジュールのよりエレガントな管理の間のGradleの依存関係を使用する方法についてです、この記事をご紹介したいと思います。

私はあなたがこの経験を持っていると確信しています:メインプロジェクトは、複数のサブプロジェクト、プロジェクトやお互いに相互依存に依存します。異なるサブプロジェクト間のサードパーティ製ライブラリのバージョン依存関係が均一でなかった、すべての依存プロジェクトのバージョンアップを変更する必要があります。でも、minSdkVersionが及びtargetSdkVersionない同じ。

今日はGradleのよりエレガントなバージョン管理を聞かせて、この問題を解決します。

Googleが推奨しました

前の記事アンドロイドのGradleシリーズ-の記事を使用する基本的な参照を使用して依存関係に。新しいプロジェクトのkotlinの経験を持っている場合は、Googleの推奨ソリューションが表示されます

buildscript {
    ext.kotlin_version = '1.1.51'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
复制代码

中build.gradle rootProjectで内線グローバル変数のバージョン番号を定義します。だから私たちは直接build.gradleモジュールの中にこれらの定義された変数を参照することができます。リファレンス次のように:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
复制代码

あなたはJavaは静的変数として理解これらの変数を使用することができます。このように、構成が異なるモジュールでの統一を達成することができますが、制限が設定あまりにも多くのエントリは、すべての構成が肥大化build.gradleその結果、rootProjectプロジェクトbuild.gradle書き込まれるということです。あなたが別々のうち内線を設定するための方法を考える必要がありますので、これは、私たちのモジュール開発が提唱と一致していません。

私は記事を使用する必要がある前に、この時間は、アンドロイドのGradleシリーズ-原理章で説明する関数を適用します。前の記事では、我々は唯一のbuild.gradleサブプロジェクトでは、(IDまたはクラス名でプラグインアプリケーション、)3例1を適用するプラグインを使用します。

apply plugin: 'com.android.application'
复制代码

我々はそれを使用する必要がこの時間からは、それが主の役割であるアプリケーションのスクリプトファイル私たちが行う必要がある次のアクションは、Gradleのを入れて内線別のスクリプトファイルを設定することです。

まず、私はここにversion.gradle命名した、rootProjectディレクトリ内のスクリプトファイルのGradleを作成します。

その後、我々はversion.graldeファイルの内線で使用される変数を定義します。以前のバージョンkotlinたとえば、あなたは、次の方法を使用することができます

ext.deps = [:]
 
def versions = [:]
versions.support = "26.1.0"
versions.kotlin = "1.2.51"
versions.gradle = '3.2.1'
 
def support = [:]
support.app_compat = "com.android.support:appcompat-v7:$versions.support"
support.recyclerview = "com.android.support:recyclerview-v7:$versions.support"
deps.support = support
 
def kotlin = [:]
kotlin.kotlin_stdlib = "org.jetbrains.kotlin:kotlin-stdlib-jre7:$versions.kotlin"
kotlin.plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin"
deps.kotlin = kotlin
 
deps.gradle_plugin = "com.android.tools.build:gradle:$versions.gradle"
 
ext.deps = deps
 
def build_versions = [:]
build_versions.target_sdk = 26
build_versions.min_sdk = 16
build_versions.build_tools = "28.0.3"
ext.build_versions = build_versions
 
def addRepos(RepositoryHandler handler) {
    handler.google()
    handler.jcenter()
    handler.maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}
ext.addRepos = this.&addRepos
复制代码

Gradleのは、グルーヴィーな言語を使用しているので、ので、上記の構文はかっこいい

Kotlin例、DEPSはEXTに入れながら、上記のコードは、変数DEPSにバージョン依存kotlinのkotlinに関連しているであろうことを意味し、バージョン管理、。その他の真。

定義まあ以来、今我々が使用し、すべてのサブプロジェクトがアクセス権を持ってできるようにするために、プロジェクトの紹介を始めるから適用 rootProjectにbuild.gradleへの導入

buildscript {
    apply from: 'versions.gradle'
    addRepos(repositories)
    dependencies {
        classpath deps.gradle_plugin
        classpath deps.kotlin.plugin
    }
}
复制代码

その後、宣言したデフォルトの変数内線にbuild.gradle同じの参照依存関係としてそれを使用します。

私たちは、上記のaddRepos方法を見て、のGradleの原則に関する記事は、リポジトリがRepositoryHandlerによって実行される分析されているので、ここでは直接RepositoryHandlerを呼び出すための統一されたアプローチを定義します。私たちは次のようにbuild.gradleを使用する必要がないように、この方法は、直接addRepos呼び出すことができます

    //之前调用
    repositories {
        google()
        jcenter()
    }
    //现在调用
    addRepos(repositories)
复制代码

複数Module1を、例えばモジュール1が存在する一方、現在、直接build.gradleにおけるモジュール1良い構成の定義に使用することができます

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // support
    implementation deps.support.app_compat
    //kotlin
    implementation deps.kotlin.kotlin_stdlib
}
复制代码

次のような効果があり、我々はまた、上記とツールSDKのバージョン定義されたので、一緒に統一することができます

android {
    compileSdkVersion build_versions.target_sdk
    buildToolsVersion build_versions.build_tools
    defaultConfig {
        applicationId "com.idisfkj.androidapianalysis"
        minSdkVersion build_versions.min_sdk
        targetSdkVersion build_versions.target_sdk
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    ...
}
复制代码

一度統一構成を実現するので、我々は単に私たちの定義version.gradle変更することができ、それの関連するバージョンを改正したいです。もはや統一の設定を変更するには、いずれかによって、モジュール1のために使用されません。

BUILDSRC&Kotlin

あなたのプロジェクトがkotlin使用している場合、BUILDSRC&Kotlin統合管理ソリューションは、あなたのために、より適しているであろう。

GradleのプロジェクトはBUILDSRCのデフォルト・ディレクトリを識別し、それはbuild.gradleが直接設定項目BUILDSRCを参照することができますということでbuild.gradleするディレクトリ構成を注入します。

BUILDSRCへversion.gradle設定が入れる前に、この機能を使用すると、私たちは直接、の実装を開始させることができます。

まず、それから、新しいディレクトリのsrc / main / javaディレクトリ(同じレベルのアプリで)、ディレクトリはあなたの後の構成項目のディレクトリであるルートディレクトリBUILDSRCに新しいディレクトリを作成;、その後、新しいbuild.gradle.ktsファイルを同時にとし、文書はkotlin-DSLを追加しました

plugins {
    `kotlin-dsl`
}
 
repositories {
    jcenter()
}
复制代码

次のように再同期プロジェクト、最終的なディレクトリ構造の後

ファイルがに置かれる前に、良いカタログを構築し、そして今、私たちは新しい依存関係ファイル(任意のファイル名)kotlinのsrc /メイン/ Javaで使用し、設定項目は、ちょうどそれを達成するためにkotlin構文を使用し、に次のコードになります

object Versions {
    const val support = "26.1.0"
    const val kotlin = "1.3.31"
    const val gradle = "3.4.1"
    const val target_sdk = 26
    const val min_sdk = 16
    const val build_tools = "28.0.3"
}
 
object Dependencies {
    val app_compat = "com.android.support:appcompat-v7:${Versions.support}"
    val kotlin_stdlib = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}"
    val kotlin_plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}"
    val gradle_plugin = "com.android.tools.build:gradle:${Versions.gradle}"
    val addRepos: (handler: RepositoryHandler) -> Unit = {
        it.google()
        it.jcenter()
        it.maven { url = URI("https://oss.sonatype.org/content/repositories/snapshots") }
    }
}
复制代码

その後、直接アプリのbuild.gradleの下で、例えば、引用した様々なbuild.gradleで依存関係とバージョンを使用することができます

android {
    compileSdkVersion Versions.target_sdk
    buildToolsVersion Versions.build_tools
    defaultConfig {
        applicationId "com.idisfkj.androidapianalysis"
        minSdkVersion Versions.min_sdk
        targetSdkVersion Versions.target_sdk
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    ...
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // support
    implementation Dependencies.app_compat
    //kotlin
    implementation Dependencies.kotlin_stdlib
}
复制代码

build.graldeも真ルート

buildscript {
    Dependencies.addRepos.invoke(repositories)
    dependencies {
        classpath Dependencies.gradle_plugin
        classpath Dependencies.kotlin_plugin
    }
}
 
allprojects {
    Dependencies.addRepos.invoke(repositories)
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}
复制代码

実際に、私たちは本当にを取得する必要があるという考え、統一された構成管理です。最終的に使用するためのように、これは個人的な好みに依存しますが、あなたのプロジェクトがkotlin使用している場合、私はGroovyの構文については、私はあなたがまだKotlinに精通していると考えているので、あなたがBUILDSRCモードを使用することをお勧め。

送信元アドレス:github.com/idisfkj/and ...

あなたは私の記事についての詳細をお知りになりたい場合は、次のFanger魏コードをスキャンすることができ、私は公共の数が心配です〜

ます。https://juejin.im/post/5cfe4a905188250b6d63360eで再現

おすすめ

転載: blog.csdn.net/weixin_33968104/article/details/91456060