【原创】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
}
最新我使用的gradle
是gradle-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.gradle
的pluginManagement
中配置
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
中使用相关插件了。那如果您使用其他插件同理也是这样做就可以了。
===========================分割线
如果你是使用Java,在引入Hilt
2.41版本编译会报错:
Execution failed for task ':app:hiltAggregateDepsDebug'.
> A failure occurred while executing dagger.hilt.android.plugin.task.AggregateDepsTask$WorkerAction
> 'java.lang.String com.squareup.javapoet.ClassName.canonicalName()'
这个就在你工程根目录下的build.gradle
中添加如下即可
plugins {
id 'com.android.application' version '7.3.0-alpha05' apply false
id 'com.android.library' version '7.3.0-alpha05' apply false
id 'dagger.hilt.android.plugin' version "${hiltVersion}" apply false // 就是这个
}
参考
1. Using Gradle Plugins
2. Hilt: An exception occurred applying plugin request [id: 'dagger.hilt.android.plugin']