Glide初始化分析
Glide Initial
Glide的初始化方法比较单一
无法无法使用
init
直接调用初始化,会初始化Glide内的static成员
get
初始化并获取Glide的实例
with
初始化Glide并依据传入的组件获取绑定响应生命周期的Manager对象,以便后续构建Request。
其中最为常用的既是with方法。with基本上包含了init和get方法的所有内容。
123public static RequestManager with(@NonNull Context context) { return getRetriever(context).get(context);}
123public static RequestManager with(@NonNull FragmentActivity activity) { return getRetriever(activity).get(activity);}
123public static RequestManager with(@Non ...
Glide核心原理概览
Glide主线流程
Glide是一个图片加载库
Glide通过压缩和缓存,解决了图片内存占用大的问题
Glide的过程大致分为5步
Glide初始化
生命周期绑定(Glide -> RequestManager)
请求构建(RequestManager -> RequestBuilder)
请求配置(RequestBuilder -> RequestBuilder)
发起请求资源获取,解码,转化,呈现(RequestBuilder -> Target)
Note:
前4步通常是在Main线程,主要是做好Request的配置
最后一步最为复杂也最为重要,完成资源获取和界面呈现。其中资源获取在后台线程,然后界面的呈现为main线程。
尺寸优化
Glide会自定依据ImageView的大小对图片进行缩放,以免图像的像素过高导致Bitmap无法分配或者OOM的问题
Bitmap缓存
Glide在加载过程中有使用缓存来加速图片的加载,其中Bitmap会被缓存到BitmapPool中
其中BitmapPool采用了LRU的淘汰策略,即淘汰最近最少使 ...
Glide基础使用
Glidestart up安装12345678910111213plugins { //...... id 'org.jetbrains.kotlin.kapt'}dependencies { // https://mvnrepository.com/artifact/com.github.bumptech.glide/glide implementation("com.github.bumptech.glide:glide:4.15.1") kapt("com.github.bumptech.glide:compiler:4.15.1") // ......}
基础使用
加载图片
123Glide.with(fragment) .load(myUrl) .into(imageView);
取消加载
1Glide.with(fragment).clear(imageView);
自定义request
Glide提供独立 ...
Okio原理解析
Okio原理
基于okio:3.3.0,JVM
Okio有如下优点
简单
指的是它的类关系满足迪米特原则,牵扯少,只有Sink/Source仅凭其可完成所有的IO
高效
发生io时的缓存做了池化处理避免了频繁的内存分配,Sink/Source是由Segment构成的,而Segment的获取会从SegmentPool获取
跨平台
使用了Kotlin Multiplatform插件实现类JVM/Js/Native多平台的兼容
Segment
通常的Segment是一个循环链表
对象创建123456789101112131415constructor() { // const val SIZE = 8192 this.data = ByteArray(SIZE) this.owner = true this.shared = false}constructor(data: ByteArray, pos: Int, limit: Int, shared: Boolean, owner: Boolean) ...
Okio基础使用
Okio使用篇
Note: okio版本为3.3.0
Okio是一个用于io操作的框架
Okio的出现源于java.io以及java.nio不够简洁,不易使用,学习成本大
Okio解决了上手成本的问题
目前okio已经由kotlin重写,并使用了kotlin multiplatform实现跨平台
这已是Okio的几乎所有类
from doc
Okio组成ByteString & Buffer
ByteString
String的增强类,其中包含二进制编码,Base64,UTF-8编码,等。
Buffer
byte[]的增强,Buffer的组织不同于byte[],Buffer的数据会形成一个链表结构,一个节点只是类的一部分。
Source & Sink
Source
Sink
类似于java.io中的InputStream和OutputStream,不同的是Source/Sink类关系更少,方法更少,更简单,并且还提供了Timeout机制,允许使用者自定义超时策略
ByteString
ByteString是String的争抢版, ...
Gson源代码解析
Gson源码解析
源码版本基于2.10.1
分析方向
由于Gson是用于做序列化和反序列的一个框架。所以核心方法也就两个
toJson
fromJson
后续也只会对如上两个方法进行分析
toJson
toJson方法有不少的重载方法,不过按类型划分就两种。
Object -> String
JsonElement -> String
由于JsonElement用于序列化的情况比较少见,所以真正采用的只有Object-> String的序列化
之后会对public String toJson(Object src) 进行分析
12345678public String toJson(Object src) { // 对null值进行序列化 if (src == null) { return toJson(JsonNull.INSTANCE); } // 非空值序列化 return toJson(src, src.getClass());}
非null object序列化
1234 ...
Gson之基础使用篇
Gson基础使用
Gson属于是Java生态的必备技能,很有必要深入学习。
依赖引入
Gradle
123dependencies { implementation 'com.google.code.gson:gson:2.10.1'}
Maven
12345<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version></dependency>
什么是Gson
Gson是一个Google开源的JSON序列化和反序列化框架
Gson设计目标
提供一个简单如toString方法般的机制实现Java对象到JSON字符串的互相转化
对于预定义的Java Bean实现无侵入式
允许自定义对象的序列化和反序列化
生成紧凑的、可读的JSON输出
使用Gson
Gson采用的是门面模式, ...
Android源码构建
Android 源码编译基础要求硬件要求官网链接
环境配置官方链接
源码下载创建文件夹1mkdir aosp
安装源代码控制工具1234mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
配置repo12vim ~/.bashrcexport REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo'
初始化镜像仓库分支列表
1repo init -u https://mirrors.bfsu.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r47
编译设置环境1source build/envsetup.sh
选择编译目标1lunch
构建类型
使用情况
user
权限受限;适用于生产环境
userdebug
与 ...
记一次WSL扩容问题
记一次WSL扩容问题背景
昨日心血来潮,突发地想打一个自己的Android镜像。
所以呢拉了aosp的源代码,sync过程异常平稳(除了跑了我50G+流量…),
构建的过程出了一个小插曲吧,wsl 报了一个空间不足。
环境WSL 2 + Ubuntu 22.04
解决过程
第一我肯定不会认为这是aosp的锅,所以定是不会去aosp查issue。
既然是空间不足,这一定是系统的问题,而系统是wsl,不去微软官网查解决方法还真没别的了。
既然是空间异常铁定是找磁盘管理专栏doc了
事后总结简单来说就是wsl的ex4.vhdx文件是有大小限制的。
虚拟大小
WSL Ubuntu认为的大小空间,即WSL内lsblk的大小
物理大小
WSL是在Windows平台运行的,所有的文件内容是存储在ext4.vhdx中的,此大小指的是占据宿主机的空间。
下图表示
WSL能用的最大空间是500G
WSL Ubuntu占用的内容加载一起占据物理机182G
检测一下
gain简单认识了如下3个linux磁盘相关的指令
df
Linux df(英文全拼:disk fre ...
Gradle之Daemon启动流程
Gradle Daemon
先会尝试连接daemon,如果没有daemon可用尝试通过connector.startDaemon开启新的daemon
123456789101112131415161718192021222324252627282930313233343536public BuildActionResult execute(BuildAction action, BuildActionParameters parameters, BuildRequestContext requestContext) { UUID buildId = idGenerator.generateId(); List<DaemonInitialConnectException> accumulatedExceptions = Lists.newArrayList(); // Attempt to connect to an existing idle and compatible daemon int saneNumberOfAttempts = ...