- TCP/IP 模型
- TCP 和 UDP
- TCP 为什么要三次握手
- TCP 为什么要四次挥手
- 网页请求一个 URL 的流程
- DNS 工作原理
- HTTPS 加密原理
Android APT 开发实践
基于 APT、JavaPoet,自动生成 Activity/Fragment 对应的 ViewModel.
Android Handler epoll 机制分析
- IO 多路复用
- select、poll、epoll 对比
- epoll API
- epoll 使用示例
- eventfd
- Handler 中的 epoll 源码分析
- nativePollOnce
- nativePollOnce
- nativeWake
开发编写的 View 控件,是怎么变成屏幕上图像的?
- Activity 与 Window
- setContentView 原理
- Activity 窗口添加过程
- UI 刷新机制
- 发起 UI 重绘请求
- 执行 UI 绘制时机
- vsync 信号的生成
- vsync 信号的分发
- SurfaceFlinger -> DispSync
- DispSync -> DispSyncSource
- DispSyncSource -> EventThread
- Connection -> SurfaceFlinger
- Connection -> app
- UI 绘制流程
- Surface 原理
- Surface 创建流程
- Surface 的跨进程传递
- GraphicBufferProducer
Android 消息屏障与异步消息
- 如何插入一个消息屏障?
- 如何删除一个消息屏障?
- 如何插入一个异步消息?
- 消息屏障对插入消息有什么影响?
- 消息屏障是如何优先处理异步消息的?
- Framework 中哪里使用了消息屏障?
Java 并发编程知识点总结
- 线程基础
- 线程池
- 各种各样的锁
- 并发容器
- 原子类
- Java 内存模型
- 线程协作
- AQS 框架
Android 方法插桩 plugin 开发实践
在做应用启动速度优化时,需先了解启动阶段做了哪些耗时任务,分析 Application 的 attachBaseContext、onCreate 等关键方法,统计它们内部调用到的其他方法耗时。
分析要结合 systrace 工具,因为不仅要知道方法的 wall time,还要知道 cpu time,这样才能知道是否属于 cpu 密集型任务,然后针对任务类型进行调整或线程调度。
需求很清晰,在要统计的方法调用前插桩加入 TraceCompat.beginSection(),调用后加入 TraceCompat.endSection()。需求也很简单,我们可以很快的使用 aspect、javassist 或 asm 实现。
但是,这次是方法插桩 + systrace,需为此开发一个插件;下次是方法插桩 + 耗时统计,就得再开发一个插件。为什么插件一定要与插桩逻辑绑定呢?
为什么没有一款插件,只提供方法插桩能力,不写死插桩逻辑,而是由使用者自由的定制插桩逻辑呢?
基于这个痛点,我们来开发一款可自由定制插桩逻辑的插件。
如何绕过 Android 8.0 startService 限制?
- 限制了什么?
- 什么是前台应用?
- 正确理解后台服务限制
- 后台服务限制源码分析
- 适配 Android 8.0 startService 限制策略
- 如何绕过 Android 8.0 startService 限制?
细读《深入理解-Android-内核设计思想》(六)GUI 系统 [上]
- GUI 系统综述
- BufferQueue 与图像数据流
- Gralloc
- ANativeWindow
- FrameBufferNativeWindow
- FramebufferSurface
- 最后
细读《深入理解 Android 内核设计思想》(五)Binder 机制 [下]
- 深入 binder 驱动内部
- binder_ioctl
- binder_get_thread
- binder_ioctl_write_read
- binder_thread_write
- binder_transaction
- binder_thread_read
- 小结
- binder Q&A
- 如何找到目标进程 Binder 实体
- 如何实现 Binder 线程的睡眠与唤醒
- 最后