对于这张图大家一定不会陌生,好像任何一本关于Android的书都有这一图,你是否真的了解。
下面这个图阐述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:
对于Android源码,我们可以在官网或者其他什么地方下载,我们下载下来的源码一般分为两个部分,Linux Kernel 内核编译后的镜像文件和其他的比如Application,framework,Libraries,Android Runting 源代码。
如何将这个下载下来的源代码pull到我们的手机中呢,我这里只是简单的说一下流程。
基于Linux
1. 通过make命令编译源代码,makefile语言为自动化编译语言,减少时间的消耗.
2.make后会生成out目录,out目录中的targe/product下的一个T6735_Android_scatter.txt文件
3.利用flashtool工具刷机
事实上在我们刷机的时候是将 Linux kernel 的镜像文件和make编译生成的system.img , usedata.img 和 ramdisk.img文件pull上去。
Android对硬件支持分为两层,硬件抽象层和内核驱动层。
简单来说一下这两层的作用:
内核驱动层:提供硬件驱动逻辑,只是提供通道。
硬件抽象层:具体读到硬件的参数
对于各个层来说:
Linux Kernel :
Linux内核驱动,位于kernel 目录 ,功能主要是为上层提供访问设备的寄存器的值,包括读写。
Libraries :
可执行程序,位于external 目录 ,功能是与内核驱动程序交互
Android Runting :
硬件抽象层中增加硬件模块来和内核驱动程序交互,位于hardware目录。
注:Libraries 和 Android Runting 使用C语言编写,两者同时向上提供NDK接口。
Framework 分为两个部分
第一部分:在硬件抽象层中编写JNI方法来提供java访问接口 ,位于framework目录,在这个中编写硬件访问服务类。
第二部分:提供java接口的硬件服务(利用第一部分提供的java接口)与第一部分交互利用aidl机制
Application :
利用提供的java接口实现与用户接口
备注一下 JNI ,NDK ,aidl ,
再来说一下Framework层的编译问题,一般情况下Framework层编译,先编译你改动的目录,再编译base目录。
在一般情况下会生成两类文件 .jar 和 .so 文件
下面来说一下处理bug流程,(目前我处理)
1. 找到bug所在的界面
2. 搜索关键字,这里这个关键字很重要
3. 找到关键字所在的xml
4. 找到是谁在调用这个关键字的id
5. 通过id找到所在的类和方法
对于关键字我这里多说几句,1.明确bug所在的app,知道app所在的目录 2 . 明确界面的特殊字符,比较特别的
备注 快捷方式,对于eclipse :Ctrl + H 全局搜索,Ctrl + shift + G 查看是谁在调用它 Ctrl + shift +T
对两个图的理解还是有些不太明白,HAL硬件抽象层理解也是不清除