AGP基础与模块化项目概述
好,咱们直接开始。这门课的目标很明确——让你手里的Android项目,从“能跑就行”变成“又快又小”。第一站我们先聊聊地基:AGP到底是什么?模块化项目又是个什么玩法?我见过太多团队,一上来就搞优化、搞插件,结果发现连AGP的版本怎么选、模块怎么拆分都没整明白,最后回滚得一塌糊涂。咱们先把这个基础打牢。
AGP版本演进:从1.0到8.x,我踩过的坑
AGP全称Android Gradle Plugin,说白了就是Gradle和Android之间的翻译官。它告诉Gradle“咱们这个Android项目要怎么编译、怎么打包”。
从2013年AGP 1.0到现在8.x,变化真不小。我最早接触AGP是1.5版本,那时候gradle-wrapper.properties里配个0.6+的Gradle版本就够用。现在?AGP 8.0必须配合Gradle 8.x,一不小心就版本不兼容,清屏报错。
核心变化一览:
| AGP版本 | Gradle最低版本 | 关键特性 | 我的印象 |
|---|---|---|---|
| 1.x - 2.x | 2.2+ | 基本编译,ProGuard集成 | 当年用eclipse转过来的,配置全靠手写 |
| 3.x | 4.4+ | Instant Run,但很鸡肋 | 我记得Instant Run经常炸,后面被弃用了 |
| 4.x | 6.1+ | AGP DSL重构,Java 8+支持 | 避坑:4.2之后废弃了compile依赖,必须用api/implementation |
| 7.x | 7.4+ | Android Gradle Plugin变快了,但移除了很多旧API | 7.0开始必须开启File系统缓存,否则编译慢一大截 |
| 8.x | 8.1+ | 非传递R类、资源优化、R8全量 | 现在我用8.2,R8的优化效果确实比ProGuard强不少 |
一点小建议:别追最新版,但也别落后太多。我个人习惯是选大版本里的次新小版本,比如AGP 8.1.x,稳定而且坑少。
每次升级AGP,gradle-wrapper.properties里的distributionUrl也要同步升级,否则就会看到那个熟悉的红色报错——“The Android Gradle Plugin requires Gradle 8.x or higher”。我曾经在升级AGP 7.4时忘了改Gradle版本,排查了俩小时才发现。
模块化项目的定义与优势
很多人觉得模块化就是拆成多个module,然后各自编译。其实没那么简单。
模块化项目的本质,是让每个模块有清晰的职责边界,并且能够独立编译、独立测试、甚至独立发布。
你想想看,一个只有app single module的项目,改一行代码就要编译整个工程,正常吗?一个几百人的团队,每天pull下来的代码都要从头编译,精力全耗在等了。
模块化的三大核心好处:
- 构建速度提升:只编译变更的模块,并行构建,整体编译时间能缩减60%以上。
- 职责清晰:每个模块干自己的事,业务层/基础层/功能层各司其职,改bug不会误伤。
- 复用性与独立迭代:比如我们有个推送模块,在A项目里封装好,B项目直接引入aar就行,不用重写。
注意:模块化不是无脑拆!我曾经见过一个项目拆出80多个module,结果每个module之间的依赖乱成蜘蛛网,编译时间反而变长了。拆之前先想好分层策略。
常见的模块化分层模型
实践下来,多数团队采用三层架构或四层架构。我习惯用四层,因为加了一层“业务模块层”方便多App复用。
- 基础层(Base): 网络库、图片加载、工具类等。比如okhttp、Glide、CommonUtils等。特点:不依赖任何业务模块。
- 功能层(Feature): 登录、推送、支付等独立功能。特点:只依赖基础层。
- 业务层(Business): 首页、个人中心、商品详情等业务页面。特点:可能依赖多个功能模块。
- 应用层(App): 壳工程,只做页面路由和依赖注入,不写业务代码。
每个模块内还有自己的build.gradle.kts,我们后面会花大篇幅讲怎么统一配置AGP属性、怎么优化资源打包。到时候你会知道,AGP里每一个闭包都可能影响包体积。
这张图推荐你收藏一下。后面每一章的AGP配置改动,都会直接影响这些层的构建产物和最终包体积。
AGP与模块化项目的关系
你可能会问,AGP和模块化到底有啥直接关系?
关系大了。每个module的build.gradle都会运行AGP的Android扩展,配置compileSdk、minSdk、targetSdk、buildTypes、productFlavors等等。如果所有模块的AGP配置不统一,后果就是:资源冲突、依赖版本混乱、打包时多余的资源被重复打进apk。
我记得之前有个项目,基础层的minSdk设成21,业务层的minSdk设成23,结果编译时AGP会按最高的minSdk来,底层的API检查全乱套了。所以我们后面会用统一的版本目录(version catalog)和ext块来同步所有模块的核心参数。
预习一个点:AGP 8.0开始,默认开启了非传递R类。这意味着每个模块的R类不再包含其他模块的资源ID。这会减少R类的大小,但如果不了解这个机制,可能会误以为资源找不到。我们后面专门有章节讲这个。
总结一下今天的内容
- AGP版本不是越新越好,选对稳定版很重要。
- 模块化项目不是简单拆文件,要按层分职责。
- AGP配置在模块化项目中作用巨大,一个参数影响所有module。
下一站,我们会深入build.gradle里的那些闭包——compileSdk、buildToolsVersion、defaultConfig,每一个都藏着压缩包体积的机会。好,今天就到这儿,自己动手看看你的项目是单模块还是多模块,如果是多模块,先理清楚依赖箭头方向。