【原创】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']

上一篇:第八章 Jenkins使用Gradel构建jar包


下一篇:IDEA grails 3.3.x 项目断点失效问题