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 = ...
Rxjava3序言
Rxjava3
Rxjava其实在很早以前有过学习和了解,但是当时由于没有记笔记的习惯,难以整理成体系化的笔记,零零散散。
本系列笔记学习基于io.reactivex.rxjava3:rxjava:3.1.6
概念RP
RP即Reactive Programming(响应式编程)
所谓的响应式即变化是可传播的,即发生变化后这种变化会如同”病毒“一样扩散出去。
假如计算一个式子
c = a + b
命令式和响应式写法如下
None RP
123456789101112131415161718public class NoneRP { public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; // 3 System.out.println(c); a = 2; b = 3; // 由于逻辑处理没有采用响应式,所以a b的变化不会扩散到c,即abc的值 ...
Http2连接建立
Http/2连接建立过程
Http协议概述
http2支持http1.1的所有功能,并比http1.1更高效
HTTP/2 中的基本协议单元是一个帧。每种帧类型都有不同的用途。
协议标识HTTP/2有两个版本标识:
h2: 构建与TLS之上的HTTP/2协议实现, 在连接的TLS握手阶段, 通过TLS扩展协议的ALPN字段标识。
h2c: 基于明文的TCP传输的协议实现, 在HTTP1.1升级协商阶段的Upgrade字段标识。无安全性保障。
h2c
在并不知道对方是否支持http2的情况下。
http客户端通过使用http升级机制建立http2连接
客户端发送
12345GET / HTTP/1.1Host: server.example.comConnection: Upgrade, HTTP2-SettingsUpgrade: h2cHTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
服务端响应(如果不支持http2连接)
1234HTTP/1. ...
Android线程通信
Handler
Android是支持多线程的,不同线程如何进行通信,底层就是依靠的Handler进行通信。
这里的Handler不是指的Java的Handler,更确切的说是Handler机制。
熟知的有Java层的Handler,但是被遗忘的有Native 层的Handler。
Java的线程通信事件处理是由Java/Native两层Handler共同协作完成。
结构跨线程通信需要用到如下类
Handler
信息的传递者,如果某个线程有通信的需要就需要持有一个Handler对象,由Handler对象完成线程间信息的传递。
同时也是消息的处理者
Looper
默认情况下的线程是不支持通信的,因为默认情况线程是顺序执行,停下来时线程就停止了。而Looper即是对于线程的一层封装让其死循环去寻找事件。
MessageQueue
事件的容器
Message
事件实体,包含了信息
使用
Looper准备
1Looper.prepare()
handler实例化
12345val handler = Handler(Looper.myLoope ...
Android Process基础之创建
Android ProcessJava Process API
直接通过Java Process API创建
123456789101112131415161718192021const val TAG = "com.example.process"class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 创建进程并开启 val process = ProcessBuilder("echo","hello world") .start() // 等待至进程退出 val waitFor = process.waitFor() // 如果 ...