Android Studio Bumblebee及以上版本Gradle配置相关问题咨询
新版Android Gradle配置结构相关问题解答
新版Android Studio创建项目时默认用的是Gradle官方标准化的plugins DSL声明逻辑,和旧版buildscript+classpath的底层逻辑没有区别,只是写法做了统一规范,几个问题的具体说明如下:
1. 新结构下AGP版本的指定方式
根目录build.gradle的plugins块里声明的com.android.application、com.android.library本身就是AGP(Android Gradle Plugin)的内置插件,这两个插件后面跟的version参数就是全局AGP版本,和旧版在buildscript.dependencies里写classpath指定AGP版本的效果完全一样。
比如默认示例里的id 'com.android.application' version '7.1.0' apply false,就代表当前项目全量使用7.1.0版本的AGP,所有子模块应用这两个插件的时候都不用再重复写版本号。
新版根目录配置对应AGP声明的示例:
// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { // 此处声明的version就是全局AGP版本 id 'com.android.application' version '7.1.0' apply false id 'com.android.library' version '7.1.0' apply false id 'org.jetbrains.kotlin.android' version '1.6.10' apply false }
2. 需classpath引入的第三方插件添加方式
这类插件分两种情况接入就行:
- 如果第三方插件已经适配了Gradle插件门户的标准声明(比如新版本的
com.google.gms:google-services),直接在根目录的plugins块里写上插件id、对应版本,加个apply false就可以,不用再写classpath。示例:
后面要在哪个模块用这个插件(一般是app模块),直接在对应模块的plugins块里写plugins { id 'com.android.application' version '7.1.0' apply false id 'com.android.library' version '7.1.0' apply false id 'org.jetbrains.kotlin.android' version '1.6.10' apply false // 直接声明google-services插件版本 id 'com.google.gms.google-services' version '4.3.10' apply false }id 'com.google.gms.google-services'就能应用,不用重复写版本。 - 如果是还没适配新plugins DSL的老旧第三方插件,不用硬改写法,直接在根目录
build.gradle里保留buildscript块,把classpath依赖写到buildscript.dependencies下就行,新结构完全兼容旧的buildscript写法,两种方式共存不会冲突。
3. com.android.library插件的作用及默认声明原因
- 插件作用:
com.android.library是Android库模块的核心插件,应用了这个插件的模块会被编译成AAR格式的Android依赖库,里面可以包含Android源码、资源、Manifest清单等内容,能给项目里的其他应用模块、库模块依赖复用,和负责编译出可安装APK的com.android.application插件是对应关系。 - 出现在根配置的原因:根目录plugins块里所有带
apply false的插件声明,都只是做全局版本托管,不会真的应用到任何模块上。新建项目默认加上这个声明属于预置配置,后面你给项目加公共组件、基础封装这类library模块的时候,直接在对应模块的plugins块里引这个插件id就行,不用自己再补版本声明,不是说要给app模块用这个库插件。
4. 两级plugins块的设计必要性及意图
这种分层设计非常有必要,两个plugins块的职责完全拆开,从根源上解决了旧版配置里插件版本混乱、重复声明的问题:
- 根级plugins块:核心作用是全局托管所有插件的版本,这里的声明默认都带
apply false,意思是只在这统一指定插件版本、下载对应依赖,不会把插件应用到根项目。后面要升级插件版本只需要改这一处的版本号,所有子模块自动复用同一个版本,不会出现多模块依赖不同版本插件的冲突问题。 - 模块级plugins块:核心作用是声明当前模块实际要加载的插件,这里不用写版本号,只需要按自己的需求声明要启用的插件id就行。比如app模块要打APK,就声明
com.android.application插件;公共库模块要打AAR,就声明com.android.library插件,不会给模块加载不需要的插件,能减少很多没必要的编译开销。
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

