### Android开发之查看Android源码 ###
#### **在线查看Android源码**
* [Android OS](https://www.androidos.net.cn/)
* [Android XRef](http://androidxref.com/)
* http://www.grepcode.com/
>[warning] **下载官方源码麻烦,在线查看源码方便,但是在线查看源码没有工具方便,而且受限于网络状况。不过最大的好处就是可以查找所有版本的源码**
#### **下载官方源码**
- 下载Android源码,有3种方式
- 通过Android SDK Manager下载
- 下载的Android源码都是框架层的(framework层),一些底层的C或者C++语言的源码无法查看
- 通过repo下载
- [官方参考文档](https://source.android.com/source/downloading)
- 官方参考文档针对Linux或者Mac系统,在Windows上基本不可行,很费劲,具体操作可参考官方文档
- 通过国内网友下载好的源码上传到的百度网盘
- Android的源码,可以到[官方](https://source.android.com/source/)下载,但是window平台下载很难实现,而且需要翻墙,很蛋疼;但是国内有牛人,已经随时更新官方的源码(截止写这篇文章,已经更新到了Android11beta版本已发布),而且上传到了百度网盘,好人一生平安,网盘地址在这里[Android源码](https://pan.baidu.com/s/1ngsZs#list/path=%2FAndroid%E6%BA%90%E7%A0%81),感觉这地址长期有效,因为,之前好像就是从这里下载的,现在还是一样,云盘地址无效的话,可以[这里](https://testerhome.com/topics/2229)找大神。**下载完成,解压就很蛋疼,必须用7Z提取(如果使用WinRAR或者其他解压工具,一定会出错,至于原因,我也不知道,所以这里强调一定要用7Z提取),解压很耗时,感觉比下载还费时。**
- 查看Android源码
- 使用Android studio,目前只能查看通过Android SDK Manager下载的框架层的源码,而且某些框架层的源码可能还无法查阅。但是有大神的文章------>[Android Studio导入Android系统源码](http://gityuan.com/2016/06/13/android-studio-reading-source/),是否可行,未验证。
- 使用source sight,可以查阅我的另一篇文章----->[开发利器之source insight 查看Android源码](http://note.youdao.com/noteshare?id=63efcde7782950818f04e927a4470ab2&sub=41C8C2C8E5B84553AF42C4FC4541515E)
- 使用eclipse查看
- 1、只查看框架层的话,可以通过下图操作![](https://i.imgur.com/mZLcGEi.png)
- 2、重点
- 创建一个Java project,路径指向Android源码所在的目录,不过做这一步之前需要将源码根目录下development\ide\eclipse中的.classpath拷贝到根目录,如下图所示
- ![](https://i.imgur.com/0HYqrNI.png)
- ![](https://i.imgur.com/sZUMvUL.png)
- 搞定这一步,就可以创建Java工程了,由于Android源码较大,导入过程可能会耗时长一点,如下图所示
![](https://i.imgur.com/bIHJn3H.png)
- 导入Android源码,创建Java工程后,可以使用Ctrl+shift+R快捷键打开open Resource对话框,查找任意类型的文件,使用Ctrl+shift+T快捷键打开open Type查找类文件
>[warning] **注意**:由于Android5.0(API21)以及以后的版本中使用Android Runtime代替了Dalvik虚拟机,所以在一些方面差异很大,所以最好导入Android5.0 和Android 4.4W(API20)的源码来做对比,其他版本的源码,根据自己的需要,导入即可。
- 使用eclipse查看源码遇到的问题(只是为了方便查看源码)
- 尽管目前主流开发工具是AS,但是查看源码还是用eclipse较好,另外长期不用eclipse,创建Android项目时,会出现各种各样的问题。
- 问题一----------》安装ADT插件
- 最好是离线安装ADT插件,由于国内墙的问题,最好下载好[ADT压缩包](https://pan.baidu.com/s/1o8TfwYu?utm_source=androiddevtools.cn&utm_medium=website),如果这里找不到,可以去[这里](http://www.androiddevtools.cn/)找,然后安装,具体可参考[这里](http://www.cnblogs.com/sinco-20161121/p/6095966.html)或者参考[这里](https://github.com/inferjay/AndroidDevTools/wiki/首页?utm_source=androiddevtools&utm_medium=website)
- ![](https://i.imgur.com/mDQiUwJ.png)
- 如果安装后没有Android SDK Manager及Android Virtual Device Manager两个图标,可以在window中添加然后显示,window-->perspective-->customize perspective--->action set availability中勾选Android SDK and AVD,然后再重启eclipse即可
- 问题二----------》创建Android项目,由于xml文件报错,导致R文件无法生成
- 这类问题,一般都是资源文件问题中找不到资源,才导致R文件无法生成,这时可以参考这里-------》[Eclipse导入android项目包xml报错未生成R文件 ](https://jingyan.baidu.com/article/c910274be7536acd361d2dca.html)
- 问题三--------》ADT版本或者eclipse版本和SDK中的版本不一致,导致找不到某一个jar的问题
- 这类问题一般都是,版本更新造成的,兼容性问题,比如build-tools中的dex.jar包找不到,可以参考[这里](http://blog.csdn.net/qq_32224139/article/details/69525946),这里可以找一个不是最新版本的build-tools,将其下面的dex.jar复制到最新版本的lib目录下,重启eclipse,一般都可以解决。
- 文章概述
- 下载Android源码以及查看源码
- win10 平台通过VMware Workstation安装Ubuntu
- Linux系统安装Ubuntu编译Android源码
- Eclipse快捷键大全
- 前言
- 第一篇 初识Android系统
- 第一章 准备知识
- 1.1 Linux内核参考书籍
- 1.2 Android应用程序参考书籍
- 1.3 下载、编译和运行Android源代码
- 1.3.1 下载Android源代码
- 1.3.2 编译Android源代码
- 1.3.3 运行Android模拟器
- 1.4 下载、编译和运行Android内核源代码
- 1.4.1 下载Android内核源代码
- 1.4.2 编译Android内核源代码
- 1.4.3 运行Android模拟器
- 1.5 开发第一个Android应用程序
- 1.6 单独编译和打包Android应用程序模块
- 1.6.1 导入单独编译模块的mmm命令
- 1.6.2 单独编译Android应用程序模块
- 1.6.3 重新打包Android系统镜像文件
- 第二章 硬件抽象层
- 2.1 开发Android硬件驱动程序
- 2.1.1 实现内核驱动程序模块
- 2.1.2 修改内核Kconfig文件
- 2.1.3 修改内核Makefile文件
- 2.1.4 编译内核驱动程序模块
- 2.1.5 验证内核驱动程序模块
- 2.2 开发C可执行程序验证Android硬件驱动程序
- 2.3 开发Android硬件抽象层模块
- 2.3.1 硬件抽象层模块编写规范
- 2.3.1.1 硬件抽象层模块文件命名规范
- 2.3.1.2 硬件抽象层模块结构体定义规范
- 2.3.2 编写硬件抽象层模块接口
- 2.3.3 硬件抽象层模块的加载过程
- 2.3.4 处理硬件设备访问权限问题
- 2.4 开发Android硬件访问服务
- 2.4.1 定义硬件访问服务接口
- 2.4.2 实现硬件访问服务
- 2.4.3 实现硬件访问服务的JNI方法
- 2.4.4 启动硬件访问服务
- 2.5 开发Android应用程序来使用硬件访问服务
- 第三章 智能指针
- 3.1 轻量级指针
- 3.1.1 实现原理分析
- 3.1.2 使用实例分析
- 3.2 强指针和弱指针
- 3.2.1 强指针的实现原理分析
- 3.2.2 弱指针的实现原理分析
- 3.2.3 应用实例分析
- 第二篇 Android专用驱动系统
- 第四章 Logger日志系统
- 4.1 Logger日志格式
- 4.2 Logger日志驱动程序
- 4.2.1 基础数据结构
- 4.2.2 日志设备的初始化过程
- 4.2.3 日志设备文件的打开过程
- 4.2.4 日志记录的读取过程
- 4.2.5 日志记录的写入过程
- 4.3 运行时库层日志库
- 4.4 C/C++日志写入接口
- 4.5 Java日志写入接口
- 4.6 Logcat工具分析
- 4.6.1 基础数据结构
- 4.6.2 初始化过程
- 4.6.3 日志记录的读取过程
- 4.6.4 日志记录的输出过程
- 第五章 Binder进程间通信系统
- 5.1 Binder驱动程序
- 5.1.1 基础数据结构
- 5.1.2 Binder设备的初始化过程
- 5.1.3 Binder设备文件的打开过程
- 5.1.4 设备文件内存映射过程
- 5.1.5 内核缓冲区管理
- 5.1.5.1 分配内核缓冲区
- 5.1.5.2 释放内核缓冲区
- 5.1.5.3 查询内核缓冲区
- 5.2 Binder进程间通信库
- 5.3 Binder进程间通信应用实例
- 5.4 Binder对象引用计数技术
- 5.4.1 Binder本地对象的生命周期
- 5.4.2 Binder实体对象的生命周期
- 5.4.3 Binder引用对象的生命周期
- 5.4.4 Binder代理对象的生命周期
- 5.5 Binder对象死亡通知机制
- 5.5.1 注册死亡接收通知
- 5.5.2 发送死亡接收通知
- 5.5.3 注销死亡接收通知
- 5.6 Service Manager的启动过程
- 5.6.1 打开和映射Binder设备文件
- 5.6.2 注册成为Binder上下文管理者
- 5.6.3 循环等待Client进程请求
- 5.7 Service Manager代理对象接口的获取过程
- 5.8 Service的启动过程
- 5.8.1 注册Service组件
- 5.8.1.1 封装通信数据为Parcel对象
- 5.8.1.2 发送和处理BC_TRANSACTION命令协议
- 5.8.1.3 发送和处理BR_TRANSACTION返回协议
- 5.8.1.4 发送和处理BC_REPLY命令协议
- 5.8.1.5 发送和处理BR_REPLY返回协议
- 5.8.2 循环等待Client进程请求
- 5.9 Service代理对象接口的获取过程
- 5.10 Binder进程间通信机制的Java实现接口
- 5.10.1 获取Service Manager的Java代理对象接口
- 5.10.2 AIDL服务接口解析
- 5.10.3 Java服务的启动过程
- 5.10.4 获取Java服务的代理对象接口
- 5.10.5 Java服务的调用过程
- 第六章 Ashmem匿名共享内存系统
- 6.1 Ashmem驱动程序
- 6.1.1 相关数据结构
- 6.1.2 设备初始化过程
- 6.1.3 设备文件打开过程
- 6.1.4 设备文件内存映射过程
- 6.1.5 内存块的锁定和解锁过程
- 6.1.6 解锁状态内存块的回收过程
- 6.2 运行时库cutils的匿名共享内存接口
- 6.3 匿名共享内存的C++访问接口
- 6.3.1 MemoryHeapBase
- 6.3.1.1 Server端的实现
- 6.3.1.2 Client端的实现
- 6.3.2 MemoryBase
- 6.3.2.1 Server端的实现
- 6.3.2.2 Client端的实现
- 6.3.3 应用实例
- 6.4 匿名共享内存的Java访问接口
- 6.4.1 MemoryFile
- 6.4.2 应用实例
- 6.5 匿名共享内存的共享原理分析
- 第三篇 Android应用程序框架篇
- 第七章 Activity组件的启动过程
- 7.1 Activity组件应用实例
- 7.2 根Activity的启动过程
- 7.3 Activity在进程内的启动过程
- 7.4 Activity在新进程中的启动过程
- 第八章 Service组件的启动过程
- 8.1 Service组件应用实例
- 8.2 Service在新进程中的启动过程
- 8.3 Service在进程内的绑定过程
- 第九章 Android系统广播机制
- 9.1 广播应用实例
- 9.2 广播接收者的注册过程
- 9.3 广播的发送过程
- 第十章 Content Provider组件的实现原理
- 10.1 Content Provider组件应用实例
- 10.1.1 ArticlesProvider
- 10.1.2 Article
- 10.2 Content Provider组件的启动过程
- 10.3 Content Provider组件的数据共享原理
- 10.4 Content Provider组件的数据更新通知机制
- 10.4.1 内容观察者的注册过程
- 10.4.2 数据更新的通知过程
- 第十一章 Zygote和System进程的启动过程
- 11.1 Zygote进程的启动脚本
- 11.2 Zygote进程的启动过程
- 11.3 System进程的启动过程
- 第十二章 Android应用程序进程的启动过程
- 12.1 应用程序进程的创建过程
- 12.2 Binder线程池的启动过程
- 12.3 消息循环的创建过程
- 第十三章 Android应用程序的消息处理机制
- 13.1 创建线程消息队列
- 13.2 线程消息循环过程
- 13.3 线程消息发送过程
- 13.4 线程消息处理过程
- 第十四章 Android应用程序的键盘消息处理机制
- 14.1 InputManager的启动过程
- 14.1.1 创建InputManager
- 14.1.2 启动InputManager
- 14.1.3 启动InputDispatcher
- 14.1.4 启动InputReader
- 14.2 InputChannel的注册过程
- 14.2.1 创建InputChannel
- 14.2.2 注册Server端InputChannel
- 14.2.3 注册当前激活窗口
- 14.2.4 注册Client端InputChannel
- 14.3 键盘消息的分发过程
- 14.3.1 InputReader处理键盘事件
- 14.3.2 InputDispatcher分发键盘事件
- 14.3.3 当前激活的窗口获得键盘消息
- 14.3.4 InputDispatcher获得键盘事件处理完成通知
- 14.4 InputChannel的注销过程
- 14.4.1 销毁应用程序窗口
- 14.4.2 注销Client端InputChannel
- 14.4.3 注销Server端InputChannel
- 第十五章 Android应用程序线程的消息循环模型
- 15.1 应用程序主线程消息循环模型
- 15.2 界面无关的应用程序子线程消息循环模型
- 15.3 界面相关的应用程序子线程消息循环模型
- 第十六章 Android应用程序的安装和显示过程
- 16.1 应用程序的安装过程
- 16.2 应用程序的显示过程