简介:这是一份面向Android开发者的常用第三方库速查资源,系统整理了Butter Knife、Gson、Retrofit、OkHttp、Picasso、Glide、Dagger 2、EventBus、RxJava、GreenDao、Room等主流库,涵盖视图绑定、网络请求、JSON解析、图片加载、依赖注入、组件通信、响应式编程、数据库访问、生命周期管理等开发高频场景,同时说明每类库的适用位置与独特价值,帮助开发者建立清晰的技术选型框架。压缩包共2000个文件,以xml、png、json类型为主,其中xml多用于布局与配置,png为界面或示例图片,json承载数据样例,另有java源码、class文件、jar/aar库文件等,整体体积约22.67MB,资源组织较系统,便于按模块查阅。当前已有1348人学习,适合从入门到进阶的Android开发者。内容不只是罗列工具清单,还结合实践场景解释各库核心特性,例如Retrofit与OkHttp配合网络请求、Glide处理大图与视频缩略图、Room简化SQLite操作、LeakCanary自动发现内存泄漏等,读者可据此快速上手并在项目中灵活选用,提升开发效率与应用质量。 说实话,见过太多入行两三年的人,被问“项目里用了哪些第三方库”时只能讲出Glide和Retrofit,再多就卡壳了。Android开发是个极度依赖第三方库的领域——网络、图片、缓存、依赖注入、线程切换,几乎每一层都有成熟的开源方案帮你把最脏最累的活做完。但“会用”和“会选、会避坑、会管理依赖”完全是两码事。这篇文章我不会给你一份“史上最全的100个库”清单,那种列表翻完收藏夹吃灰,根本没意义。我更想从实战角度,把这些年我验证过、踩坑过、最后稳定下来的选型经验讲透。
1. 谈库之前,先把“要不要用库”这件事想清楚
1.1 库不是零件越多越好,先看清它的隐形成本
很多新人有个错觉:引入的库越多,项目越“高级”。但每个第三方库的引入都是一笔负债,不是资产。它至少带来四层成本:
- 依赖体积:一个库连同它的传递依赖,可能给APK增加几MB甚至几十MB,直接影响下载转化率。
- 初始化耗时:不少库需要在 Application 里初始化,加得多了会影响冷启动。
- 版本冲突:库A依赖Gson 2.8,库B依赖Gson 2.10,Gradle 在解析依赖树时可能直接报错,或者某个库用了被删除的API,编译期才炸出来。
- 学习与维护成本:项目里每个库,团队都需要有人懂、有人能修。作者停更之后,迁移路径往往比当初封装还痛苦。
所以我的建议是:遇到需求先想“官方有没有”,再想“社区抄近路”,最后才想“自己造”。这个顺序能帮你挡掉至少一半的不必要依赖。
1.2 一个场景该不该上库的四条判断标准
判断要不要引入一个第三方库,我通常问自己四个问题:
- 这个功能是不是项目的核心竞争力?如果是,尽量不要依赖别人的实现,尤其是支付、音视频编解码这类底层逻辑。
- 官方AndroidX或者Jetpack里有没有等价方案?比如后台任务,WorkManager已经覆盖了你能想到的大部分场景,没必要再引一个Job库。
- 这个库的维护状态是否健康?看最后一次release日期、star趋势、issue回复速度,超过一年没更新的库要非常谨慎。
- 我用官方API手动实现,代码量大概是多少?如果不超过200行,或者只是把一个进度条换个圆角样式,就别引库了。
网上关于“android进度条”的搜索很高频,很多人上来就搜自定义控件库。其实Material Components里的LinearProgressIndicator和CircularProgressIndicator已经覆盖了绝大多数场景,还自带动态颜色和无障碍支持。这种就是典型的不该上第三方库的需求。
1.3 Android引入库的方式,和“安装第三方库”根本不是一回事
这里要特别提醒一下跨语言过来的新手。搜“第三方库怎么安装”,搜出来大量Python相关的pip install教程,那套思路在Android里完全不适用。Android引入第三方库是通过构建工具完成的:
- 在
build.gradle.kts里声明依赖坐标(group、name、version) - Gradle 启动时从Maven仓库(Google Maven、Maven Central)拉取AAR/JAR
- 由AGP(Android Gradle Plugin)完成打包
// app/build.gradle.kts dependencies { implementation("com.squareup.retrofit2:retrofit:2.11.0") implementation("com.squareup.okhttp3:okhttp:4.12.0") }理解这一层,你就能明白为什么“android studio每次新建项目都要下载gradle”这类问题那么普遍——本质不是库的问题,是构建工具链和依赖仓库的版本匹配问题,后面第3章会展开讲。
2. 我把高频第三方库按功能拆成五块地图
2.1 网络层:OkHttp、Retrofit、Ktor 各自的位置
网络层是Android工程最不可能绕开的第三方库。三个关键词基本把分工说清楚了:
- OkHttp:底层的HTTP客户端,负责连接池、HTTP/2、拦截器、超时控制。它是“轮子”,Retrofit是踩在它上面的“车壳”。
- Retrofit:把REST接口声明成Kotlin接口方法,通过注解和Converter完成序列化/反序列化,配合协程的
suspend函数写起来非常清爽。 - Ktor Client:JetBrains家的KMP方案,协程原生,适合需要多端共用一套网络代码的项目。
我自己的标准配置是OkHttp + Retrofit + GsonConverterFactory,再加一个日志拦截器,并在Release包关闭日志输出:
val okHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE }) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build() val retrofit = Retrofit.Builder() .baseUrl(BuildConfig.API_BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build() interface ApiService { @GET("user/info") suspend fun getUserInfo(@Query("id") id: String): ApiResponse<UserInfo> }Ktor Client我一般只在KMP项目里推荐,单Android端没必要引入,因为OkHttp生态太成熟了,拦截器、WebSocket、MockWebServer测试方案要啥有啥。
2.2 图片加载:Glide、Coil 二选一就够了
图片加载库也是手机装机必备。目前主流就三个:Glide、Coil、Fresco。
| 对比维度 | Glide | Coil | Fresco |
|---|---|---|---|
| 底层实现 | 自研缓存 + 可接OkHttp | Kotlin协程实现 | C++ So库架构 |
| 包体积 | 中等 | 偏小 | 偏大 |
| 生命周期感知 | 有 | 有 | 有 |
| Compose支持 | 需要额外适配 | 原生AsyncImage | 较弱 |
| 适用场景 | 大多数Android项目 | 纯Kotlin/Compose新项目 | 极重度图片信息流 |
Glide的优势是生态最成熟,几十种Transformer、占位符、缩略图方案随便搜都有;Coil的优势是轻量和Compose友好,AsyncImage直接传URL就能加载:
AsyncImage( model = "https://example.com/image.jpg", contentDescription = null, modifier = Modifier.size(128.dp) )Fresco的内存控制确实强,但代价是复杂的So加载逻辑和偏大的SDK体积,普通项目没必要用。我的建议很简单:老项目继续用Glide,新项目如果是纯Kotlin + Compose,直接Coil。
2.3 异步与响应式:RxJava 时代的存款和现在的协程
聊到异步,必须承认RxJava曾经是Android的王者。链式操作符(map、flatMap、concatMap)、线程切换、背压处理,功能确实强大,但学习成本也惊人——很多人写RxJava代码写着写着就变成了只有自己能看懂的“天书”。
现在的共识是:新项目用Kotlin协程 + Flow,存量老项目如果RxJava跑得稳,没必要强行迁移。协程更贴近同步代码的写法,结构化并发也比RxJava的订阅生命周期更好管理:
viewModelScope.launch { val user = repository.getUserInfo(userId) _uiState.value = UiState.Success(user) }Flow替代了大部分RxJava的操作符场景,像map、flatMapLatest、combine都有对应API。背压场景用conflate()或buffer()也够用了。唯一要提醒的是:别再引rxjava相关的新库了,你已经走在技术栈迁移的路上,没必要在旧车上继续加零件。
2.4 依赖注入与本地存储:Hilt/Koin、Room/DataStore
依赖注入是大型项目绕不开的架构环节。
- Hilt:Google官方推荐的Dagger封装,编译期生成代码,性能好、和ViewModel/WorkManager等组件的集成是官方级的。代价是注解处理会让构建时间变长,而且报错信息对新手不太友好。
- Koin:Kotlin DSL风格的运行时注入,无代码生成,启动快,写起来直观。缺点也很明显:错误只能运行时暴露,调一个因为依赖没声明而NPE的问题可能要看半天日志。
我个人的倾向是:团队刚起步、不想在注解处理上折腾,选Koin足够;如果项目规模已经到几十个模块,或者你想在架构上更贴近Google官方范式,直接上Hilt。
本地存储这块,Room和DataStore已经是官方指定的答案。Room在SQLite之上封装了编译期SQL校验、DAO接口和Flow返回,写起来非常舒服:
@Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") fun observeUser(id: String): Flow<UserData> }DataStore替代SharedPreferences,基于文件存储和事务机制,支持Flow监听变化。至于曾经火的Realm,优点在API很对象化,但包体积和类替换机制在现在反而成了负累,新项目我不建议入坑。
2.5 UI 组件:Banner、刷新、图表在 Compose 前后的区别
UI类第三方库是变化最剧烈的一块。以热搜里的“协调布局+banner”为例,那是典型的XML时代首页结构:CoordinatorLayout做联动,Banner做轮播,再加一个下拉刷新。当年比较流行的是各类Banner开源库配合SmartRefreshLayout。但到了Compose时代,情况变了:
// Compose 里实现Banner的核心就是HorizontalPager HorizontalPager(state = pagerState) { page -> AsyncImage(model = banners[page].imageUrl, contentDescription = null) }一个轮播图在Compose里几乎不需要第三方库,HorizontalPager+AutoCarousel自己写很快就搞定。图表库也一样,过去的MPAndroidChart在Compose里用起来很别扭,新选择是Vico、YCharts这类“Compose-first”的库。
所以我的建议:涉及UI的库,先看它是不是Compose原生,再看维护状态。很多XML时代的UI库停更极快,不建议在新项目里继续引。
3. 第三方库集成里的三大坑:依赖冲突、混淆、构建版本
3.1 依赖冲突的定位链路:别猜,用命令查
依赖冲突是引入第三方库时最常报的错。典型的报错长这样:
Duplicate class com.google.gson.internal...这种“Duplicate class”错误说明依赖树里有多个版本的同一个库。很多人这时候直接去改Gradle文件,凭感觉加exclude,运气好能编过,但根本不知道根因在哪。
正确的排查链路是用Gradle自带的可视化命令:
./gradlew :app:dependencyInsight --dependency gson --configuration debugRuntimeClasspath这条命令会列出app模块的运行时依赖路径里,所有和gson相关的依赖是从哪个库传递进来的。看到像下面的输出就一目了然:
com.google.code.gson:gson:2.10.1 installDebugRuntimeClasspath ├─ com.squareup.retrofit2:converter-gson:2.11.0 └─ com.tencent.mmkv:mmkv:1.0.23解决办法优先级从高到低是:
- 升级主库版本,让它传递的依赖覆盖旧版本,而不是到处exclude。
- 用全局
resolutionStrategy强制统一版本,但只在你确认兼容的前提下做。 - 局部
exclude,这是最后手段,因为exclude会让依赖关系变得不可追踪。
3.2 混淆配置:release 崩溃的“隐形凶手”
依赖冲突是编译期报错,混淆问题则是运行时黑盒。一个Debug跑得好好的App,打Release包后一进页面就崩,十有八九是混淆规则没配好。
原因很简单:R8在混淆时会把类名、方法名重写成abcdef,如果某个第三方库内部用了反射,它按名字找类就找不到了,直接抛ClassNotFoundException或NoSuchMethodException。
解决思路有两个方向:
- 优先用官方proguard规则。大部分主流库(OkHttp、Retrofit、Glide、Gson)都内置了consumer rules,会在引入时自动打进AAR的
proguard.txt,不需要你手动配置。 - 对反射重灾区手动keep。常见的需要手动keep的是:Gson序列化实体类、EventBus/ARouter这类路由索引库,以及所有自己写了注解反射的框架。给Gson的实体类加keep规则时注意数据类字段也不要被混淆:
-keep class com.example.api.response.** { *; }每次发版前,至少在Debug和Release两个包上跑一遍主流程回归。别等用户反馈“Release版崩溃”再去翻日志,那个成本高得多。
3.3 AGP 与 Gradle 版本匹配:新建项目反复下载的根因
“android studio每次新建项目都要下载gradle”这个热搜说明很多人栽在构建工具链上。这个问题虽然不完全是第三方库,但它直接影响第三方库能不能拉下来。
根因是:Android Studio版本、AGP版本、Gradle版本三者之间有严格的对应关系。比如AGP 8.5要求Gradle 8.7及以上,如果你项目里gradle-wrapper.properties写的distributionUrl版本低于AGP要求,Gradle会因为不兼容跑不起来,然后Studio尝试下载匹配版本的Gradle,每次新建项目如果wrapper版本没统一,就在重复下载。
# gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip解决方案是团队内部统一一套版本矩阵:AS版本 + AGP版本 + Gradle版本 + JDK版本写进团队文档。别指望每个人本地都能自动匹配,这不是运气问题,是工程规范问题。
4. 选型逻辑正在被 AndroidX 和 Compose 重塑
4.1 官方组件取代了一大波第三方库
以前需要第三方库解决的事情,Jetpack现在基本都官方化了:
- 后台任务:WorkManager 取代了各种自研任务队列和Job库
- 分页加载:Paging 3 取代了各种列表加载库
- 数据持久化:DataStore 取代了SharedPreferences封装库
- 拍照:CameraX 取代了大部分第三方拍照库
- 崩溃处理:Google Play还自带崩溃报告(第三方统计库除外)
判断一个库是否值得引入,先查AndroidX里有没有同名组件是个好习惯。如果官方已经提供,那么第三方库的价值就只剩下“官方太基础、不值得自己写”的部分。
4.2 Compose First 成了新库的前置门槛
Compose普及后,选第三方库必须多问一句:这个库是Compose原生的吗?不是说非Compose不能用,而是非Compose的UI库在Compose里用起来极其别扭,需要包一层AndroidView去桥接,事件回调、状态管理、重组都割裂。
反观Coil这种库,官方直接提供AsyncImage;Room的Flow查询天然适配Compose的状态流。这种“围绕Compose设计”的库,用起来体验是质的差别。
所以现在评估一个UI库,我甚至会把“Compose First”排在“功能丰富度”前面。不是因为它炫技,而是它代表这个库作者还在跟进现代Android开发,维护状态大概率也更健康。
4.3 定期清理“僵尸依赖”是一项长期工作
依赖树里的僵尸库比你想的多。很多项目跑着跑着,某个库已经没人用了,但Gradle依赖还待在build.gradle.kts里,还带着一整套传递依赖。
我的习惯是每个季度干一次这件事:
./gradlew :app:dependencies --configuration debugRuntimeClasspath > deps.txt扫一遍输出,看看哪些库自己压根没在代码里import过。搜索代码里对应的包名,确认没有引用后直接从Gradle里删掉。删完后重新构建一次,能过就说明确实是僵尸依赖。
这个动作最大的价值不是瘦身APK,而是降低混淆规则的维护成本。因为每个库的keep规则和反射配置都可能成为下一次release崩溃的隐患,能少一个是一个。
5. 我从零搭工程时的库引入顺序和评审清单
5.1 引入顺序
新建一个项目时,我习惯按下面这个顺序引入第三方库,每一层都是下一层的基础:
- 基础工具层:Kotlin协程、AndroidX Core KTX、Lifecycle组件
- 网络层:OkHttp + Retrofit + 序列化库
- 图片层:Coil 或 Glide
- 架构层:Hilt或Koin、ViewModel、Room
- UI层:Material Components 优先,特殊组件(图表、轮播)再单独评估
先搭网络和图片,是因为可以立刻动手写页面;架构层早点定,是因为后面几十个模块不可能再回头重构;UI层最后考虑,是因为官方Material库能覆盖大部分基础控件。
5.2 用 Version Catalog 统一锁版本
团队项目最怕的就是每个人在自己的模块里写死不同的依赖版本。Gradle推荐的Version Catalog能把这个坑堵上。在gradle/libs.versions.toml里统一管理版本号:
[versions] retrofit = "2.11.0" okhttp = "4.12.0" coil = "3.0.4" [libraries] retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } coil-compose = { group = "io.coil-kt.coil3", name = "coil-compose", version.ref = "coil" }这样每个模块引入依赖时只用引用一个key,版本集中在同一个文件里维护,升级依赖时也只需改动一处。
5.3 引入新库前的 CheckList
最后分享一个我每次引入新库前都会过的清单,你可以直接抄走:
- 这个库最后一次release是什么时候?超过一年,pass。
- 它的GitHub issue是不是已关闭一堆没回复?是,pass。
- 最低API版本是否低于项目的
minSdk?低于会提高兼容成本,慎重。 - 依赖树是否和现有库冲突?拉一下
dependencies --configuration先看一眼。 - 官方AndroidX是不是已经有等价方案?有,先考虑官方。
- 它是不是Compose友好的?在UI库里这条尤其重要。
- 许可证是否允许商用?GPL类的库要特别小心。
说实话,做Android的时间越长,我对第三方库的态度反而越保守。刚工作那会儿恨不得把所有好看的开源库都塞进工程里,光是轮播图就换过四五个库。后来维护的代价全部还回来了:要么是作者停更之后找不到迁移路径,要么是一个小功能拖着一个巨大的依赖树。我现在给团队定的原则很简单——能让主要业务开发效率提升两倍以上的库才值得引入,官方方案能解决的就别去翻GitHub。按这个标准筛下来,一个中型App里同时存活的第三方库基本不会超过20个,维护成本完全可控。愿你也能早点想明白这个道理,少走一些弯路。
本文还有配套的精品资源,点击获取