1.背景
2.需要的资料
(1)多套android源码
因为android系统是开源的,所以源码都是比较容易获得的。我这里要说的是我们在学习源码的时候不要光盯着最新版本或是跟我们手机适配的版本来学习。看看以前的版本的源码,我们就知道android的源码的进化过程,在这之中,更可以体会到google的严谨。
举一个源码进化的例子。在4.2之前的版本,surfaceview的功能都是写在surfaceview这一个类中的,但是在之后的版本对于surfaceview的操作都专门写了一个新的类-surfaceControl。
(2)linux操作系统
如果在windows下搞android源码是及其可怕的。因为我们在生成sdk或是手机系统的时候要用到make,mm等指令。。源码中每层的makefile文件将零散的类连接在一起,而这些操作都需要在linux环境下完成。
(3)opengrok
不懂的可以google一下,这个软件让你查看源码更方便,上万的文件,总不能一个文件夹一个文件夹找吧。。上个图
2-1 opengrok视图
(4)刷机工具以及一部可刷的root手机
最低要求是有root权限。因为操作系统级的app这是必须的,而且不root的话也不能用adb shell。
3.adb shell
搞源码一定会用到的,这个是sdk中自带的google提供的一个操作手机内部资源的工具。具体能使先很多功能,像是抓取log,push/pull一些东西,增加一些service等。有兴趣可以看看这个【android-tips】adb
常用命令汇总(持续更新中)
4.android系统的层次以及之间的关系
4-1 android源码结构
这张图已经看得很清楚了,在源码中有三层:linux kernel(c语言和汇编),native函数(c和c++),framework(java)。
linux-kernel我没涉及过,不知道怎么改。。一般的操作主要是集中在native层和framework层。
先上一张源码内部文件的组成图。
4-2 源码文件夹结构
framework层的函数就是在图中的frameworks文件夹中。里面就是平时我们在代码中import的那些包。比如说我们常用的所有view类,都在这里
4-3 view的位置
framework层的大多功能都是从native的函数中来的。只是在framework层做成sdk中可以直接调用的接口,native层函数和framework层函数的桥梁就是jni。
5.ndk
很多做android的人都知道ndk,ndk的功能可以用一句话概括,就是“越过framework层直接调用native函数”。具体的安装和用法可以参见。android图文介绍NDK安装及简单jni demon的实现
6.关于hook
hook就是源码钩子,很多人听说过但没有用过。我尝试过搞过一个hook,hook其实就是提取一些源码中没有提供接口的功能。比如说当系统渲染界面的显示的时候,google没有提供方法来得知每个字应该画到哪,我们要想知道每个字的坐标,就要去看它的渲染文件,然后在里面加上自己的方法然后把需要的信息提取出来。
写到最后:对于android系统的理解,我还停留到比较肤浅的水平。不过对于系统再熟,也只是了解一个系统,最重要的是明白它的结构的原理,知道它处理数据的算法,说白了就是设计模式和算法。写给曾经那个停留在app层拿着android入门摆弄各种控件的自己,you are still too naive too simple!