【原創】AndroidStudio Gradle編譯腳本中關於插件部分的變更


Android Studio 版本

Android Studio Bumblebee | 2021.1.1 Canary 8

起因

好久沒有使用AndroidStudio創建新工程了(雖然我使用的預覽版)。最近要做個項目,於是新建了一個工程默認發現卧槽,build.gradle不在像以前一樣了,setting.gradle反而多了寫東西。那我的插件如何配置呢?於是Google一番,最終還是解決了,記錄下來分享給有需要的人(我是預覽版所以經常采坑,呵呵哈哈)。

問題描述

舊版本gradle構建的項目build.gradle內容大致如下:

buildscript {
    ext.kotlin_version = '1.3.72'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

最新我使用的gradlegradle-7.1.1-bin.zip,gradle的Android插件版本是7.1.0-alpha08,新建的項目builde.gradle空空如也

// 只剩下個clean任務了
task clean(type: Delete) {
    delete rootProject.buildDir
}

然后呢,setting.gradle中多出來很多東西

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
    plugins {
        id 'com.android.application' version "${androidPluginVersion}"
        id 'com.android.library' version "${androidPluginVersion}"
        id 'org.jetbrains.kotlin.android' version "${kotlinPluginVersion}"
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "ZZ"
include ':app'

解決

從上面我們可以看出來,最近的gradle引用插件的方式從buildscript切換到pluginManagement,不知道這樣有什么好處(我也不懂,也不敢問啊┭┮﹏┭┮)

因為我要使用Google的Hilt框架,所以需要使用kapt插件和Hilt插件,以往我們都是在build.gradle中如下配置以后就可以在app/build.gradle中使用了

buildscript {
  ....
  dependencies {
    .......
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
  }
}

那現在就需要再setting.gradlepluginManagement中配置

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
    plugins {
        id 'com.android.application' version "${androidPluginVersion}"
        id 'com.android.library' version "${androidPluginVersion}"
        id 'org.jetbrains.kotlin.android' version "${kotlinPluginVersion}"
        id 'org.jetbrains.kotlin.kapt' version "${kotlinPluginVersion}" // kapt插件
    }
}

這樣就可以正常引用kapt了,但是Hilt咋整呢,你如果也是通過plugins中配置

id 'dagger.hilt.android.plugin' version "${hiltVersion}"

這樣可不行,你編譯時候就會報錯找不到該插件了。因為插件庫中沒有,這個通過查看官方文檔和其他項目知道可以通過resolutionStrategy這個屬性來解決

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
    plugins {
        id 'com.android.application' version "${androidPluginVersion}"
        id 'com.android.library' version "${androidPluginVersion}"
        id 'org.jetbrains.kotlin.android' version "${kotlinPluginVersion}"
        id 'org.jetbrains.kotlin.kapt' version "${kotlinPluginVersion}"
    }

    resolutionStrategy {
        eachPlugin {
            // Use `resolutionStrategy` to define the Hilt plugin and its coordinate
            if (requested.id.id == 'dagger.hilt.android.plugin') {
                useModule("com.google.dagger:hilt-android-gradle-plugin:${hiltVersion}")
            }
        }
    }
}

這樣你就可以在app/build.gradle中使用相關插件了。那如果您使用其他插件同理也是這樣做就可以了。

參考
1. Using Gradle Plugins
2. Hilt: An exception occurred applying plugin request [id: 'dagger.hilt.android.plugin']


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM