Glide 框架结构浅析
一、概述
1.1 背景
Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。基于 Glide 优秀的缓存管理策略和生命周期关联的特点,目前市面上对 Glide 的使用非常广,因此我们有必要深入研究下 Glide 相关的实现原理,便于更好的使用它。
目前 Glide 版本已经更新到 4.11.0,但本系列我们仍采用 Glide3.7.0 版本进行分析,原因有两个:
- 3.7.0 版本代码相对比较简单。
- 与 3.7.0 版本相比,4.0+ 版本之后代码改动较大。
所以本着先易后难的原则,我们使用 Glide 3.7.0 来进行分析,对 Glide 整体有一个全面了解之后,再去分析 4.0+ 版本。
Glide 版本:
Glide 3.7.0
Github 地址:https://github.com/bumptech/glide/tree/v3.7.0
Gradle 依赖:implementation 'com.github.bumptech.glide:glide:3.7.0'
1.2 Glide 框架的优点
- 加载类型多样化:Glide 支持 Gif、WebP、Jpeg、Png 等格式的图片。
- 生命周期的绑定:图片请求与页面生命周期绑定,避免内存泄漏。
- 使用简单(链式调用),且提供丰富的 Api 功能 (如: 图片裁剪等功能)。
- 高效的缓存策略:
1. 支持多种缓存策略 (Memory 和 Disk 图片缓存)。
2. 根据 ImageView 的大小来加载相应大小的图片尺寸。
3. 内存开销小,默认使用 RGB_565 格式 (3.x 版本)。
4. 复用对象 (享元模式),降低内存的抖动。
5. 通过 Lru 算法来管理内存缓存和磁盘缓存,保证资源使用的可控性。
1.3 系列文章
- Glide系列(一) — Glide 框架结构浅析
- Glide系列(二) — DataLoadProvider 及与 Encoder&Decoder 的关系
- Glide系列(三) — LoadProvider、ModelLoader、DataFetcher 和 ResourceTranscoder 关系
- Glide系列(四) — Glide 缓存流程分析
- Glide系列(五) — Request 构建流程分析
- DiskLruCache 源码分析
二、Glide 框架整体结构设计
Glide 框架整体结构如下图所示。

Glide 框架结构如上图所示:
- Glide 框架主要分为两大流程:
1.1图片请求的构建流程。
1.2图片缓存的获取流程。- 图片请求构建流程内又分为四个模块:
2.1用户态的请求模块:用户使用 Glide 进行链式调用的时候会生成一个用户态的 Request。
2.2真实的请求模块:由于步骤2.1中会根据场景构建多种Request,因此在发起图片请求时需要进行收口,因此会使用用户态的 Request 构建一个真正的 GenericRequest 请求。
2.3Request 生命周期管理模块:Glide 的一大特点是会将图片的请求和页面生命周期进行绑定,避免出现内存泄漏的风险,因此会有一个 Request 生命周期管理模块。
2.4Registry中心模块:由于 Glide 支持加载多种类型的数据,因此在注册中心会预先注册所支持类型处理类的信息。- 图片缓存一共分为3大层,5小层:
3.1内存缓存(2小层):弱引用缓存、LruCache。
3.2本地缓存(2小层):本地 ResultCache 缓存、本地 SourceCache 缓存。
3.3Source 数据源(1小层):网络获取、本地 AssetPath 获取、其它本地图片。
小结:
看到这里,只要知道以下三点就可以了。
- 知道 Glide 分为两大流程 (请求创建流程、缓存获取流程) 就可以了。
- 知道 Glide 缓存部分分为3大层,5小层就可以了。
- 可以将 Glide 的两大流程与网络请求进行类比。网络请求也分为两个流程:网络请求的构建流程、数据的接收和响应流程 (Glide的缓存获取流程)。
- 这里我们对五层缓存进行定义,方便后面引用说明:
- 第一层:内存缓存 -> 弱应用缓存(ActiveResource)。
- 第二层:内存缓存 -> LruCache
- 第三层:磁盘缓存 -> ResultCache (经过transform的图)
- 第四层:磁盘缓存 -> SourceCache (从DataFetcher 直接拉取到的数据)
- 第五层:数据源 -> Source
三、Glide中涉及的几个基本概念
在研究 Glide 之前,需要对下面几个类有一个基本概念。
Glide中涉及的几个基本概念:
Target、ViewTarget是什么?Resource是什么?Encoder、ResourceEncoder是什么?ResourceDecoder是什么?Transformation是什么?ResourceTranscoder是什么?DataFetcher、ModelLoader是什么?DataLoadProvider、LoadProvider是什么?DataLoadProvider、ModelLoader、DataFetcher之间的关系?
3.1 Target、ViewTarget 是什么?
- Target、ViewTarget 的作用类似于网络请求中的 Callback,主要是用于处理图片已经返回后的逻辑。主要的回调方法如下图所示。
- Target 与 ViewTarget 的主要区别在于 ViewTarget 中包含有一个设置图片的 View。
- Target 实现了 LifecycleListener,方便在处理生命周期时调用对应的方法。
public interface Target<R> extends LifecycleListener {
// 开始请求
void onLoadStarted(Drawable placeholder);
// 请求失败
void onLoadFailed(Exception e, Drawable errorDrawable);
// 请求成功
void onResourceReady(R resource, GlideAnimation<? super R> glideAnimation);
}
3.2 Resource 是什么?
- Resource 的作用类似于网络请求返回时统一的数据封装 Result,目的是便于数据的传输。
- 同时针对 Resource 包含的不同数据类型,获取相应的编解码器等。
// 网络接口数据封装
class Result<T> {
T data;
}
// 用于包装从缓存中获取的数据(图片)
public interface Resource<Z> {
Z get();
}
// 具体的使用场景
public class BitmapResource implements Resource<Bitmap> {
private final Bitmap bitmap;
@Override

最低0.47元/天 解锁文章
1233





