补充:
1. 由于Android源码过于庞大,SourceInsight会经常卡死,不适合了。适合的是Android Studio, 非常好用。使用手册上有介绍如何安装。
编译安卓的过程说明手册中也有。
3.Android的源码非常庞大,而且C++的类的继承关系非常的深,如果能快速知道这些类的继承关系,对阅读代码会有非常大的帮助。可以
使用UML工具来自动生成这些类的继承关系。大部分UML工具都是收费了,bouml是一款比较好用的免费的版本,但是最新版本的bouml也开
始收费了,可以找一个比较老的版本,如4.23(7.71),它又一些bug,但是已经够用了。所谓的UML工具就是可以先建立一些模型,然后根据这些模
型来生成C++或Java源代码。还可以通过源代码来生成那些类的继承关系。
这个bouml工具显示出的继承关系图(类图)中:
黑体字表示类的名称
“-”表示私有属性
“+”表示public属性
箭头指向的是父类
=========================3-2======================
第0课第1节_工具_使用AndroidStudio来阅读源码.mp4
-----------------------------------------------
根据第六章来阅读Android源码
1.首先要搭建环境
1.使用Android Studio来阅读Android源码
$ mmm development/tools/idegen //生成一些必备的文件,然后通过这些文件做到快速阅读源代码
$ mv .out/target/product/tiny4412/obj/GYP/shared_intermediates/res.java xxx 把这个文件重命名成res.j,这是由于下面这一步报错说它是个目录,搜索了发现重命名可以。
$ sh ./developement/tools/idegen/idegen.sh //这一步编译完后会在Android工程根目录下
生成android.iml和android.ipr这两个文件,
把它传到Window上的Android源码的根目录下,然后使用Android Studio打开.ipr文件(file --> Open...)。此时
Studio会“Sacnning files to index”扫描文件建立索引,这个过程会持续几十分钟或1h.
使用ctrl+shift+n打开一个文件,按住ctrl键点击import的类就会跳转到对应的类里面。
但是有时候会发生跳转错误,解决方法参考:
www.cnblogs.com/Lefter/p/4176991.html
参考文章:
使用Android Studio查看Android Lollipop源码:
http://www.jianshu.com/p/c85984cf99e2
http://www.jianshu.com/p/c85984cf99e2
1.下载Android Lollipop源码(当然不一定非要是Lollipop源码,其他的版本也是可以的)
并进行过一次完整编译(不编译是无法进行源码导入工作的)
2.
如何使用Android Studio开发/调试Android源码:http://www.cnblogs.com/Lefter/p/4176991.html
1.源码中development/tools/idegen/README可以作为指导文档.
第0课第2节_工具_建模工具bouml_已看但是没有试验.mp4
-------------------------------------------------------
1.UML工具:bouml, 4.23是免费的,可以自动生成C++和Java中类的继承关系。
2.Bouml使用
a.Project --> new 创建一个工程
b.Languages --> 选C++和Java,可以多选.然后
c.添加C++文件获取uml图:Tools --> reverse C++ -->添加cpp文件 -->点击ok在点击cancel就会自动生成翻转关系了。
d.在browser栏下的第三层的目录上右击选“new class diagrom”输入名字test_uml,然后双击生成的test_uml表项,然后
将对应的类拉到test_uml表中。然后把对应列表项上的类拉倒这个test_uml界面上。
若在test_uml界面没有看到类的所有属性的话,可以在test_uml界面点击“edit” --> "edit drawing settings"
然后将“show classes members full definition”(会显示出完整的函数签名和属性类型)和“show members visibility”(在函数和属性的前面增加‘+’或‘-’分别表示public和private)都
选为Yes.
e.把其它所有的类都拖到test_uml界面中,此时会自动生成箭头指示继承关系。
f.点击保存,然后在左侧test_mul列表项上右击-->tool-->HTML doc.(flat),将test_uml界面转成png图片。
e.test_uml界面ctrl+滑轮可以放大和缩小,以便能导出一个看得清的png图片。
3.所谓的uml就是可以建立一些模型,然后根据这些模型生成你的C++或Java源代码。也可以通过源代码生成那些类的继承关系,这是逆过程,称为reverse。
4.bouml是使用Qt写的,目录中的‘’需要替换为‘/’ (注意不要忘记转换了)
5.当class列表中类比较多需要查找时可以直接输入class的命令来查找class, 尽管没有任何输入栏。
6.类图对其:选中一个类后atrl选中另一个类,右键,align选择对齐方式。
7.若软件没有自动给出继承箭头,可以自己添加上去,但是bouml并不会帮我们检查是不是真的有继承关系。
8.4.23版软件bug: 先把类的继承关系的连线删除掉,但是删除后就不能手动添加了。也就是说一旦操作出错了,就
需要把整个uml类图删掉,然后再重新创建类图。
9.在uml界面中右击,format,然后可以调节uml图纸的大小。
10.在做图过程中发现缺少了源文件,此时还可以继续添加
============================================
第0课第3节_工具_使用bouml制作时序图.mp4
---------------------------------------
1.使用bouml制作时序图步骤
a. 和制作类图类似,一开始也是要创建一个工程然后reverse Java/C++文件。在browser栏的
第二级目录上右击,"create class view",例如输入名class_view。在class_view上右击,创建一个
“new squence diagram”,例如输入名字seq。双击seq打开时序图窗口。
b. Demo中使用的Ext7.java中中main()的执行路径涉及两个类Ext7和Son, 然后将他两个从browser栏拖动到
时序图窗口中。然后自己选择箭头,然后再双击箭头在箭头上注释。
2.对于Java文件会弹出一个.cat文件的弹框,若是没有就点击取消。
3.bouml制作时序图可以参考(目前还没看)
http://www.cnblogs.com/ywqu/archive/2009/12/22/1629426.html
http://blog.csdn.net/pashanhuxp/article/details/41982285
4.UML图中对象介绍
a. 对象
格式:对象名:类 但是通常会摆对象名省略掉,如此例中:Ext7和:Son就是两个对象。
b. 控制块
代表函数的执行
c. 消息
代表函数调用关系
同步消息:使用实心的指向右的箭头
异步消息:使用普通的指向右的箭头
返回消息:使用指向左的虚线箭头
===>比如将鼠标方法工具栏上的普通箭头上将显示“Synchronous message”
还有一种消息是自调用消息(定义和调用都在一个类中)
5.若导入的文件既有C++又有Java,可以先revert C++,然后再revert Java.
6.可以在类对象上右击,“Edit drawing setting” 来设置颜色,让Java、C++、C的类对象具有不同的颜色以便区分。
7.可以给每一个生命线都添加Note, 直接选中时序窗口的Note选项添加note即可。
6.Android的输入系统构建时序图的例子
a.reverse C++和 Java文件后,先在browers栏中的二级目录(src_files)上右键"new class view"创建一个例如名为
seq_c的表项。然后在seq_c表项上右击"new sequence diagram"创建一个例如seq的表项,双击它打开时序图窗口。
SystemServer.java中 public static void main(String[] args) //SystemServer.java 中的public class SystemServer类中 sysSrv.run(); //SystemServer.java startBootstrapServices(); //SystemServer.java startCoreServices(); //SystemServer.java startOtherServices(); //SystemServer.java 这里面启动了其它很多server,例如input,power,wifi,bt等等 startServiceInputManager() //SystemServer.java inputManager = new InputManagerService(mSystemContext); //InputManagerService.java nativeInit //com_android_server_input_InputManagerService.cpp NativeInputManager* im = new NativeInputManager //com_android_server_input_InputManagerService.cpp sp<EventHub> eventHub = new EventHub(); //native/service/inputflinger/EventHub.cpp 使用inotify和epoll机制来监听目录"/dev/input"
后记:
每个硬件模块相关的服务的目录:
frameworksaseservicescorejavacomandroidserver
每个硬件模块JNI文件的目录:
frameworksaseservicescorejni
inputflinger displayservice surfaceflinger batteryservice等存放目录:
frameworks
ativeservices
注意:
SystemServer.java文件中的 class SystemServer类中
startServiceAlarmManager
startServiceWatchdog
startServiceBluetooth
startServiceNetworkScore
startServiceInputMethodManager
startServiceInputManager
....
===>系统的所有服务应该都是在SystemServer中启动的。