文章目录
Android Framework
启动流程
init进程是Android用户空间第一个进程,主要做以下3件事情:
- 创建和挂载启动所需的文件目录。
- 初始化和启动关键服务,守护关键服务。
- 解析init.rc配置文件,并启动Zygote进程。
- 简述Android系统启动流程?
- 按电源键开机,从ROM加载预制程序启动BootLoader。
- Bootloader启动Linux内存Kernel,并启动第一个用户空间进程init。
- init进程创建挂载文件目录,加载属性服务,解析init.rc文件启动Zygote进程。
- Zygote进程,启动虚拟机,注册JNI服务,预加载系统资源(系统类,字体、资源文件、SO库、Chromium动态库)。创建Socket服务,fork出system_server进程,
- system_server进程启动AMS、WMS、PMS等系统服务。
- Zygote进入轮询监听AMS启动应用请求。
- AMS启动Launcher。
- system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?
- Zygote 作为孵化器,可以提前加载一些资源,当fork出子进程,子进程就会拥有这些进程。
- system_server进程需要JNI函数、共享库、常用类、以及主题资源资源,在init进程中是没有的。
- 为什么要专门使用 Zygote 进程去孵化应用进程,而不是让 system_server 去孵化呢?
- system_server进程包含AMS、WMS等系统服务,在应用进程中是不需要的。
- fork操作仅会把调用线程拷贝到子进程,可能会导致死锁。
- 描述下是怎么导致死锁的?
- fork操作复制整个用户空间(copy-on-write策略)以及所有系统对象,然后只复制当前线程到子线程,其他线程蒸发掉了。
- 当某个线程获取了某个锁,锁会被复制进子进程,在子进程看,锁没有所有者没法解锁,程序发生死锁。
- Zygote 为什么不采用 Binder 机制进行 IPC 通信?
- 先后时序问题,binder需要注册到ServiceManager,Zygote使用binder不能保证创建binder时ServiceManager初始化完成。
- binder支持多线程操作,可能出现死锁。
- binder拷贝问题,binder是成对存在的,分为Client端和服务端,fork出应用进程,不能释放无用binder对象,占用内存。
- LocalSocket效率也很高,而且有权限验证能保证进程通信安全。
- Socket fork后,应用进程可以关闭。
Android AMS(ATMS)
Android AMS的理解
Android 的AMS是什么
ASM启动
Android AMS源码解析
Android WMS
Android PMS
事件机制
显示框架
Android Activity/View/Window/Dialog/Fragment 深层次关联
Binder
Binder机制
为什么使用socket而不使用binder
Handler机制
Android消息机制(5)MessageQueue深入解析
ANR触发机制
Android的ANR原理分析
ANR 触发原理与分析
主线程中的Looper.loop()一直无限循环为什么不会造成ANR
主线程的Looper为什么不会导致应用的ANR
管道+epoll
Handle
浅谈Android之Linux pipe/epoll
Android 消息处理以及epoll机制
epoll Android,Android_INotify与Epoll
Linux事件管理机制-epoll
共享内存
fresco
mmkv
Android 内存映射mmap浅谈
Android mmap文件读写
mmap原理与解析
MMKV-Android中的存储框架
MMKV组件原理
信号量
matrix xcrash 友盟apm
跨进程通信
爱奇艺Andromeda 跨进程通信组件分析
饿了么 HermesEventBus
JVM
Java 并发编程
Dalvik & ART
IO
提效工具
编译打包
Gradle
静态代码审查
Sonarqube
FindBugs
PMD
Lint
Android自定义Lint的二三事儿
混淆加固
R8
360加固
自动化部署
Docker
Jenkins
Android ASM
Android Gradle 中的使用ASMified插件生成.class的技巧
Android IOC
数据结构与算法
算法
排序算法
冒泡排序
选择排序
插入排序
快速排序
堆排序
基数排序
查找算法
折半查找
二分查找
树形查找
hash查找
数据结构
数组
ArrayList
LinkedList
HashMap
ConcurrentHashMap
栈
链表
队列
树
图
堆
散列表
设计思想
插件化
组件化
Arouter的原理是什么?
- 通过注解标记Activity。
- 通过反射,找到注解标记的类名和包名,并保存。
- 通过APT技术,根据保存的类名和包名,生成对应的Java代码,这段Java代码的功能就是把activity.class存入路由表,也就是HashMap。
- 不同业务module需要跳转到对应的Activity时,直接从HashMap中取出对应的activity.class,就可以实现跳转。
设计模式
开源库设计原理
图片加载
Glide实现原理解析
设计模式
三级缓存
网络库
数据存储
SharePrefrences
MMKV 原理解析
APM
性能优化
内存优化
网络优化
卡顿优化
电量优化
包大小优化
其他
Android中MotionEvent的来源和ViewRootImpl