开始研究Android的底层了
作者主页:http://blog.youkuaiyun.com/luoshengyang/article/details/7409491
Android Studio下载http://rAndroid Studioj.baidu.com/soft/detail/27390.html?ald
大牛们是怎么阅读 Android 系统源码的?http://www.zhihu.com/question/19759722
- 巨人的肩膀
- AOSP项目官方: https://source.android.com/source/index.html
- 这个一定要先读. 项目介绍, 代码下载, 环境搭建, 刷机方法, Eclipse配置都在这里. 这是一切的基础.
- Android官方Training: https://developer.android.com/training/index.html
- 这个其实是给App开发者看的. 但是里面也有不少关于系统机制的介绍, 值得细读.
- 老罗的Android之旅: http://blog.youkuaiyun.com/luoshengyang
- 此老罗非彼老罗. 罗升阳老师的博客非常有营养, 基本可以作为指引你开始阅读AOSP源码的教程. 你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:
- 早期的博客是基于旧版本的Android;
- 大量的代码流程追踪. 读文章时你一定要清楚你在看的东西在整个系统处于什么样的位置.
- 此老罗非彼老罗. 罗升阳老师的博客非常有营养, 基本可以作为指引你开始阅读AOSP源码的教程. 你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:
- Innost的专栏: http://blog.youkuaiyun.com/innost
- 邓凡平老师也是为Android大牛, 博客同样很有营养. 但是不像罗升阳老师的那么系统. 更多的是一些技术点的深入探讨.
- Android Issues: http://code.google.com/p/android/issues/list
- Android官方Issue列表. 我在开发过程中发现过一些奇怪的bug, 最后发现这里基本都有记录. 当然你可以提一些新的, 有没有人改就是另外一回事了.
- Google: https://www.google.com
- 一定要能流畅的使用这个工具. 大量的相关知识是没有人系统的总结的, 你需要自己搞定.
- AOSP项目官方: https://source.android.com/source/index.html
整理的内容从初学者的角度来组织,由浅入深、自下而上地对Android系统的源代码进行了分析,目录结构如下所示:
- 第一篇 初识Android系统...........................................6
- 第一章 准备知识..............................................7
- 1.1 准备Linux内核基础知识................................7
- 1.2 准备Android应用程序基础知识..........................8
- 1.3 下载、编译和运行Android源代码........................8
- 1.3.1 安装Git工具....................................9
- 1.3.2 安装Java SDK...................................9
- 1.3.3 安装其它工具包.................................9
- 1.3.4 安装repo工具...................................9
- 1.3.5 下载Android源代码..............................9
- 1.3.6 编译Android源代码..............................10
- 1.3.7 运行Android模拟器..............................11
- 1.4 下载、编译和运行Android内核源代码....................12
- 1.4.1 下载Android内核源代码..........................12
- 1.4.2 修改Makefile文件...............................13
- 1.4.3 编译Android内核源代码..........................13
- 1.4.4 运行Android模拟器..............................14
- 1.5 开发第一个Android应用程序............................14
- 1.6 编译和打包单个Android应用程序模块....................17
- 1.6.1 导入编译单个模块的mmm命令......................17
- 1.6.2 编译单个Android应用程序模块....................18
- 1.6.3 重新打包Android系统镜像文件....................18
- 第二章 硬件抽象层............................................19
- 2.1 开发Android硬件驱动程序..............................20
- 2.1.1 实现内核驱动程序模块...........................21
- 2.1.2 修改内核Kconfig文件............................27
- 2.1.3 修改内核Makefile文件...........................28
- 2.1.4 编译内核驱动程序模块...........................28
- 2.1.5 验证内核驱动程序模块...........................29
- 2.2 开发C可执行程序验证Android硬件驱动程序...............30
- 2.3 开发Android硬件抽象层模块............................32
- 2.3.1 硬件抽象层编写规范.............................32
- 2.3.1.1 模块文件的命令规范.......................32
- 2.3.1.2 结构体定义规范...........................33
- 2.3.2 实现硬件抽象层访问接口.........................35
- 2.3.3 硬件抽象层模块加载过程分析.....................39
- 2.3.4 处理硬件设备访问权限问题.......................42
- 2.4 开发Android硬件访问服务..............................44
- 2.4.1 定义硬件访问服务接口...........................44
- 2.4.2 实现硬件访问服务...............................45
- 2.4.3 实现硬件访问服务的Java 本地接口方法............46
- 2.4.4 启动硬件访问服务...............................49
- 2.5 开发Android应用程序来调用硬件访问服务................50
- 第三章 智能指针..............................................55
- 3.1 轻量级指针...........................................57
- 3.1.1 实现原理分析...................................57
- 3.1.2 使用实例分析...................................59
- 3.2 强指针和弱指针.......................................61
- 3.2.1 强指针的实现原理分析...........................61
- 3.2.2 弱指针的实现原理分析...........................68
- 3.2.3 强指针和弱指针的使用实例分析...................74
- 第二篇 Android专用驱动系统.......................................79
- 第四章 Logger日志系统........................................80
- 4.1 Logger驱动程序.......................................83
- 4.1.1 相关数据结构...................................83
- 4.1.2 设备初始化过程.................................85
- 4.1.3 设备文件打开过程...............................90
- 4.1.4 日志读取过程...................................91
- 4.1.5 日志写入过程...................................95
- 4.2 运行时日志库写入接口.................................100
- 4.3 C/C++日志写入接口....................................106
- 4.4 Java日志写入接口.....................................110
- 4.5 Logcat工具分析.......................................116
- 4.5.1 相关数据结构...................................117
- 4.5.2 初始化过程.....................................121
- 4.5.3 日志读取过程...................................133
- 4.5.4 日志输出过程...................................137
- 第五章 Binder进程间通信系统..................................149
- 5.1 Binder驱动程序.......................................151
- 5.1.1 相关数据结构...................................152
- 5.1.2 设备初始化过程.................................172
- 5.1.3 设备文件打开过程...............................173
- 5.1.4 设备文件内存映射过程...........................174
- 5.1.5 内核缓冲区管理.................................181
- 5.1.5.1 分配内核缓冲区...........................181
- 5.1.5.2 释放内核缓冲区...........................187
- 5.1.5.3 查询内核缓冲区...........................192
- 5.2 Binder进程间通信库...................................193
- 5.3 Binder进程间通信应用实例.............................197
- 5.4 Binder对象引用计数技术...............................205
- 5.4.1 Binder本地对象的生命周期.......................206
- 5.4.2 Binder实体对象的生命周期.......................210
- 5.4.3 Binder引用对象的生命周期.......................213
- 5.4.4 Binder代理对象的生命周期.......................218
- 5.5 Binder对象死亡通知机制...............................221
- 5.5.1 注册死亡接收通知...............................221
- 5.5.2 发送死亡接收通知...............................225
- 5.5.3 注销死亡接收通知...............................229
- 5.6 Service Manager的启动过程............................232
- 5.6.1 打开和映射Binder设备文件.......................234
- 5.6.2 注册成为Binder上下文管理者.....................235
- 5.6.3 循环等待Client进程请求.........................239
- 5.7 Service Manager代理对象接口的获取过程................245
- 5.8 Service的启动过程....................................252
- 5.8.1 注册Service组件................................253
- 5.8.1.1 封装通信数据为Parcel对象.................254
- 5.8.1.2 发送和处理BC_TRANSACTION命令协议.........257
- 5.8.1.3 发送和处理BR_TRANSACTION返回协议.........270
- 5.8.1.4 发送和处理BC_REPLY命令协议...............282
- 5.8.1.5 发送和处理BR_REPLY返回协议...............288
- 5.8.2 循环等待Client进程请求.........................291
- 5.9 Service代理对象接口的获取过程........................294
- 5.10 Binder进程间通信机制的Java实现接口..................302
- 5.10.1 获取Service Manager的Java代理对象接口.........303
- 5.10.2 AIDL服务接口解析..............................312
- 5.10.3 Java服务的启动过程............................315
- 5.10.4 获取Java服务的代理对象接口....................321
- 5.10.5 Java服务的调用过程............................324
- 第六章 Ashmem匿名共享内存系统................................329
- 6.1 Ashmem驱动程序.......................................330
- 6.1.1 相关数据结构...................................330
- 6.1.2 设备初始化过程.................................332
- 6.1.3 设备文件打开过程...............................334
- 6.1.4 设备文件内存映射过程...........................336
- 6.1.5 内存块的锁定和解锁过程.........................338
- 6.1.6 解锁状态内存块的回收过程.......................345
- 6.2 运行时库cutils的匿名共享内存接口.....................346
- 6.3 匿名共享内存的C++访问接口............................349
- 6.3.1 MemoryHeapBase.................................349
- 6.3.1.1 Server端的实现...........................349
- 6.3.1.2 Client端的实现...........................353
- 6.3.2 MemoryBase.....................................359
- 6.3.2.1 Server端的实现...........................360
- 6.3.2.2 Client端的实现...........................362
- 6.3.3 应用实例.......................................364
- 6.4 匿名共享内存的Java访问接口...........................370
- 6.4.1 MemoryFile.....................................370
- 6.4.2 应用实例.......................................375
- 6.5 匿名共享内存的共享原理分析...........................386
- 第三篇 Android应用程序框架篇.....................................390
- 第七章 Activity组件的启动过程................................391
- 7.1 Activity组件应用实例.................................391
- 7.2 根Activity的启动过程.................................397
- 7.3 Activity在进程内的启动过程...........................429
- 7.4 Activity在新进程中的启动过程.........................438
- 第八章 Service组件的启动过程.................................441
- 8.1 Service组件应用实例..................................441
- 8.2 Service在新进程中的启动过程..........................448
- 8.3 Service在进程内的绑定过程............................460
- 第九章 Android系统广播机制...................................483
- 9.1 广播应用实例.........................................484
- 9.2 广播接收者的注册过程.................................491
- 9.3 广播的发送过程.......................................499
- 第十章 Content Provider组件的实现原理........................521
- 10.1 Content Provider组件应用实例........................522
- 10.1.1 ArticlesProvider..............................523
- 10.1.2 Article.......................................533
- 10.2 Content Provider组件的启动过程......................548
- 10.3 Content Provider组件的数据共享原理..................570
- 10.4 Content Provider组件的数据更新通知机制..............593
- 10.4.1 内容观察者的注册过程..........................594
- 10.4.2 数据更新的通知过程............................601
- 第十一章 Zygote和System进程的启动过程........................609
- 11.1 Zygote进程的启动脚本................................609
- 11.2 Zygote进程的启动过程................................612
- 11.3 System进程的启动过程................................619
- 第十二章 Android应用程序进程的启动过程.......................628
- 12.1 应用程序进程的创建过程..............................628
- 12.2 Binder线程池的启动过程..............................637
- 12.3 消息循环的创建过程..................................640
- 第十三章 Android应用程序的消息处理机制.......................644
- 13.1 创建线程消息队列....................................644
- 13.2 线程消息循环过程....................................649
- 13.3 线程消息发送过程....................................654
- 13.4 线程消息处理过程....................................658
- 第十四章 Android应用程序的键盘消息处理机制...................666
- 14.1 InputManager的启动过程..............................669
- 14.1.1 创建InputManager..............................669
- 14.1.2 启动InputManager..............................672
- 14.1.3 启动InputDispatcher...........................674
- 14.1.4 启动InputReader...............................676
- 14.2 InputChannel的注册过程..............................687
- 14.2.1 创建InputChannel..............................688
- 14.2.2 注册Server端InputChannel......................695
- 14.2.3 注册当前激活窗口..............................699
- 14.2.4 注册Client端InputChannel......................704
- 14.3 键盘消息的分发过程..................................708
- 14.3.1 InputReader处理键盘事件.......................708
- 14.3.2 InputDispatcher分发键盘事件...................715
- 14.3.3 当前激活的窗口获得键盘消息....................727
- 14.3.4 InputDispatcher获得键盘事件处理完成通知.......741
- 14.4 InputChannel的注销过程..............................745
- 14.4.1 销毁应用程序窗口..............................746
- 14.4.2 注销Client端InputChannel......................754
- 14.4.3 注销Server端InputChannel......................756
- 第十五章 Android应用程序线程的消息循环模型...................762
- 15.1 应用程序主线程消息循环模型..........................762
- 15.2 界面无关的应用程序子线程消息循环模型................764
- 15.3 界面相关的应用程序子线程消息循环模型................766
- 第十六章 Android应用程序的安装和显示过程.....................775
- 16.1 应用程序的安装过程..................................775
- 16.2 应用程序的显示过程..................................808