KSP
APT注解处理器,编译时扫描和处理注解,生成模版代码
KAPT借助APT,实现kotlin注解处理能力,效率较低
KSP针对kotlin符号的预处理工具,只能新增源码不能修改
SymbolProcessor符号处理器
SymbolProcessorEnvironment符号处理器环境
codeGenerator生成与管理文件
logger编译时打印
SymbolProcessorProvider符号处理器环境提供者
SymbolProcessor接口处理符号
process(Resolver){}使用符号处理方法,返回值不需要处理的符号
getSymbolsWithAnnotation获取某个注解
getClassDeclarationByName获取class
路由
TheRouter方案
Navigator页面跳转
开发阶段,注解标识页面
编译期生成RouteMapXX类
记录当前模块路由表
生成app/assets/RouteMap
第三方SDK页面手动添加
可自动下发,实现不同跳转
Gradle插件,将RouteMapXX统一到初始化类
页面跳转时,通过path获取页面,调用startActivity
ServiceProvider跨模块服务调用,SPI实现
FlowTaskExecutor任务初始化
任意类或方法,@FlowTask注解
-
- taskName:任务名
- dependsOn:依赖的任务或执行时机
- async:是否异步
编译期解析,生成Task
编译完成,Gradle插件检查构建有向无环图,聚合
应用启动后,Task按顺序加载
ActionManager动态指令
Action类似广播的全局指令,用于弹窗、日志上传、清理缓存
用户某操作触发或服务端下发指令
一键切换源码与 AAR
默认aar编译
local.properties声明参与编译的module
Gradle脚本替换依赖project或aar
用moduleApi等替换,注释或解注释include语句
网络
Okhttp
构建者创建OkhttpClient和Request
client.newCall(request)创建Call,实现ReallCall
调用Call同步方法
调用分发器同步方法
将当前请求加入同步队列
请求完成移除
getResponseWithInterceptorChain() 获得结果
调用Call异步方法
添加AsyncCall(线程)到准备执行异步队列
同一host请求数小于5,总请求数小于64
添加到正在执行异步队列
AsyncCall.executeOn(线程池)
IO线程池保证立即执行
run中getResponseWithInterceptorChain获得请求结果
responseCallback回调
分发器finished结束
拦截器
自定义应用拦截器
重试和重定向拦截器
路由或Sokect读写超时,有其他线路可选
代理或服务器授权
重定向,保存返回结果,构建新Request
桥接拦截器
添加请求头必要参数,响应头gzip用GzipSource解析
缓存拦截器
得到RealInterceptorChain
通过CacheStrategy得到
networkRequest发起网络请求
cacheResponse使用本地缓存
是否为null判断是直接或协商缓存或新请求
更新缓存
连接拦截器
连接池,新建或复用连接
空闲连接数5
遍历和当前连接Host, url, ip 相同连接
超过5最近最久未使用
定时器5分钟清理
没有创建新连接
自定义网络拦截器
请求服务拦截器
建立服务器连接,请求网络,将结果逐层返回
Retrofit
基于OkHttp封装
建造者创建Retrofit
注解描述请求方式,Path、参数等
动态代理创建Service,消除模板方法
创建CallAdapter<ResponseT,ReturnT>响应类型,返回类型
根据method是否是挂起函数和响应类型获取适配器类型
platform默认CallAdapter
addCallAdapterFactory添加自定义适配器工厂
策略模式,不同返回类型,不同适配器
新适配器,新增ReturnT和对应工厂
创建HttpServiceMethod
CallAdapted默认类型
SuspendForResponse兼容协程
重写adapt适配Call
HttpServiceMethod.invoke发起网络请求
创建responseConverter反序列化响应
addConverterFactory也是适配器+策略模式
图片
Bitmap
内存大小=宽 * 高 * 像素点字节数
BitmapFactory.decodeResource根据dpi 和 drawable文件夹判断图片缩放
Bitmap.Config,默认ARGB_8888,用RGB_565或4444
inTargetDensity,自己设置缩放比例。
质量压缩,一般75或70,内部使用skia保存在本地
尺寸压缩,循环对半计算inSampleSize接近 ImageView实际宽高
大图加载,BitmapRegionDecoder滑动中计算显示区域图片
Glide
加载过程
- Glide.with获取生命周期绑定RequestManager
- RequestManager.load获取RequestBuilder
- RequestBuilder构建Request,RequestManager管理Target 将Request
- RequestManager.track开始请求,默认HttpConnect
- request通过Engine尝试从弱引用、Lru、文件缓存加载图片
- 没有网络获取,ModelLoader匹配模型,DataFetcher获取数据,最后解码、转换,缓存原始数据返回
缓存
HashMap Key由图片url、宽高等参数组成,value是图片资源弱引用
Lru 最近最少使用,LinkedHashMap实现
磁盘缓存DiskLruCache
-
- DATA: 原图
- RESOURCE:转换图
- ALL:原图和转换图
- NONE:不缓存
- AUTOMATIC:网络图片原图,本地图片转换图
内存优化
inSampleSize精确图片尺寸到目标
EngineJob DecodeJob等大量重复对象重用池
图片解码时设置inBitmap重用内存
onlowMemory
- 清除内存缓存
- 系统资源紧张,回收Lru和BitMap池
- 其他原因将缓存内容减小到配置一半
多线程
into回调到主线程
submit回调当前线程
磁盘缓存线程池,1核心,任务串行加载图片
资源线程池,CPU核心数,网络加载
列表加载数据错乱
View类型,Target每次重新创建,setRequest设置tag复用
非View类型,提供原来target,不重新创建
Coil
协程图片加载库
- kotlin库更易用,轻量
- Lifecycle监听生命周期
- 默认okhttp网络加载
缓存
- 弱引用缓存,曾加载到内存的图片
- 缓存池,不再使用的图片
- Lru缓存
- 磁盘缓存,OkHttp实现缓存原始图片