首先感谢各位兄弟姐妹们的耐心等待。本书预计在3月中旬上市发售。从今天开始,我将在博客中连载此书的一些内容。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。
[要点:建议那些还在拿vim看代码的兄弟,赶紧用source insight或者eclipse吧。
对于搞Framework的人,必须要掌握的技能就是用Eclipse调试System_server代码
最后,没有代码,airpcap工具的兄弟,请下载本书资源]
第一章 准备工作
-
介绍本书的内容组成;
- 工具使用;
- 本书资源下载说明。
1.1 Android系统架构
Android是Google公司推出的一款手机开发平台。该平台本身是基于Linux内核的,图1-1展示了这个系统的架构。
图1-1 Android系统架构
从图1-1可知,Android系统大体可分为四层,从下往上依次是:
- Linux内核层,目前Android 4.4(代号为KitKat)基于Linux内核3.4版本。
- Libraries层,这一层提供动态库(也叫共享库)、Android运行时库、Dalvik虚拟机[1]等。从编程语言上来说,这一层大部分都是用C或C++写的,所以也可以简单地把它看成是Native层。
- Libraries层之上是Framework层,这一层大部分用Java语言编写。它是Android平台上Java世界的基石。
- Framework层之上就是Applications层了,和用户直接交互的就是这些应用程序,它们都是用Java开发的。
1.2 工具使用
本节介绍Android开发和源码研究过程中的三件利器。
1.2.1 Source Insight的使用
Source Insight是阅读源码的必备工具,是一个Windows下的软件,在Linux平台上可通过wine安装。下面介绍一下如何在Source Insight中导入源码。
使用Source Insight时,需要新建一个源码工程,通过菜单项Project→New Project,可指定源码的目录。
提示 特别提醒读者的是,很多读者常把Android所有源代码都加到工程中,这将导致Source Insight运行速度非常慢。
实际上,只需要将当前分析的源码目录加到工程即可。例如,新建一个Source Insight工程后,只把源码/framework/base目录加进去了。另外,当一个目录下的源码分析完后,可以通过Project→Add and Remove Project Files选项把无须再分析的目录从工程中去掉。上述步骤如图1-2所示。
图1-2 添加或删除工程中的目录
从图1-2右边的框可知:Source Insight支持动态添加或删除目录。通过这种方式可极大减少Source Insight的工作负担。
提示:一般首先把framework/base下的目录加到工程,以后如有需要,再把其他目录加进来。另外,关于Source Insight其他使用技巧,读者可参考《深入理解Android:卷1》第1章。
1.2.2 Eclipse的使用
笔者一般使用Source Insight来查看Native代码,而Android推荐的集成开发工具Eclipse却既能查看Java代码和Native代码,也能调试系统核心进程。
1. 导入Android Framework Java源码
注意,这一步必须编译完整个Android源码才可以实施,步骤如下:
1) 将Android源码目录/development/ide/eclipse/.classpath复制到Android源码根目录。
2) 打开Android源码根目录下的.classpath文件。该文件是供Eclipse使用的,其中保存的是源码目录中各个模块的路径。
由于我们只关心Framework相关的模块,因此可以把一些不是Framework的目录从该文件中注释掉。同时,去掉不必要的模块也可加快Android源码导入速度。图1-3所示为该文件的部分内容。
图1-3 .classpath文件内容示意
然后,请读者单击Eclipse菜单栏New->Java Project,弹出如图1-4所示的对话框。设置Location为Android 4.2源码所在路径。
图1-4 导入Android源码示意图
由于Android 4.2源码文件较多,导入过程会持续较长一段时间。
提示:
1)导入源码前一定要取消Eclipse的自动编译选项(通过菜单栏Project→Build Project Automatically设置)。另外,源码导入完毕后,读者千万不要清理(clean)这个工程。清理会删除之前源码编译所生成的文件,导致后续又得重新编译Android系统了。
2)笔者在本书的共享资源中提供了一个已经配置好的.classpath文件,请读者下载并使用它。
2. 导入Android Native代码
本节介绍如何在Eclipse中导入Android Native代码,其步骤如下所示:
- 导入Android Framework中的Java文件后,首先切换到C/C++视图(通过单击菜单栏Window→Open Perspective→选择C/C++)。
- 单击菜单栏New→C/C++,然后选择Convert to a C/C++ project。如图1-5所示:
图1-5 转换成C++工程示意
按照图1-5操作之后,之前的Java工程就被转成了C++工程。不过读者仍需要完成以下几个步骤。
1) 通过Properties→C/C++ General→Paths and symbols,打开该工程的路径和符号设置对话。如图1-6所示。
图1-6 路径和符号设置
2)在图1-6上边的框中选择Includes页面,然后点击下方框中的Import Settings,然后选择4.2源码/development/ide/eclipse/android-include-paths.xml以导入路径配置。
3) 同上,再选择图1-6中的Symbols页面,然后通过下方框中的Import Settings以导入4.2源码/development/ide/eclipse/android-symbols.xml文件。
以上配置好路径和符号文件后,读者可进一步通过图1-6上框中的Source Location页面选择此次需要导入的C++文件。这一步如图1-7所示。
图1-7 过滤C++文件
通过图1-7中Add Folder选项,读者可以选择哪些目录下的C++文件被过滤掉。笔者目前仅导入了frameworks目录下的Native代码。
当所有文件都导入完毕后,读者通过右击C++工程,然后选择Index→Rebuild来重新生成Native代码的索引。
至此,通过上述方法就能导入Android中的Native代码了。
3. 调试SystemServer
调试SystemServer的步骤如下:
1) 首先编译Android源码工程。编译过程中会有很多警告。如果有错误,大部分原因是.classpath文件将不需要的模块包含了进来。读者可根据Eclipse的提示做相应处理。笔者配置的几台机器基本都是一次配置就成功了。
2) 在Android源码工程上单击右键,依次单击Debug As→Debug Configurations,弹出如图1-8所示的对话框,然后从左边找到Remote Java Application一栏。
图1-8 Debug配置框示意图
3) 单击图1-8中黑框中的新建按钮,然后按图1-9中的黑框中的内容来设置该对话框。
图1-9 Remote Java Application配置示意图
由图1-9所示,需要选择Remote调试端口号为8600,Host类型为localhost。8600是SystemServer进程的调试端口号。Eclipse一旦连接到该端口,即可通过JDWP协议来调试SystemServer。
提示:读者也可阅读《深入理解Android:卷2》第1章来了解更多使用Eclipse的建议。
1.2.3 BusyBox的使用
BusyBox,号称Linux平台上的“瑞士军刀”,它提供了很多常用的工具,例如grep、find等。这些工具在标准Linux上都有,但Android系统却去掉了其中的大多数工具。这导致了我们在调试程序、研究Android系统时步履维艰,所以就需要在手机上安装BusyBox。
1. 下载BusyBox
可从网站http://www.busybox.net/downloads/binaries/1.21.1/下载已编译好的BusyBox,如图1-10所示。
图1-10 BusyBox下载
注意该网站已经根据不同平台编译好了对应的BusyBox,我们可根据自己手机的情况下载对应的文件。笔者下载了支持Galaxy Note 2的busybox-armv7l。
提升:arm v7表示ARM指令集为v7,目前ARM Cortex-A8/A9系列的CPU支持该指令集。
2. 安装和使用BusyBox
下载完BusyBox后,需将它adb push到手机上。如:
adb push busybox /system/xbin #为了避免冲突,笔者push到了/system/xbin目录下
cd /system/xbin #进入对应目录
chmod 755 busybox #更改busybox权限为可执行
busybox –-install . #安装busybox
grep #执行busybox提供的grep命令,或者busybox xxx执行xxx命令也行
BusyBox安装完了,如执行busybox命令,就会打印如图1-11的输出。
图1-11 BusyBox提供的工具
从上图中可看出,BusyBox提供了不少的工具,这样,我们在研究Android系统时就如虎添翼了。
提示:本书共享资源中提供了busybox-armv7l的下载。
1.3 本书资源下载说明
为了减轻国内读者无法从Android官网上下载源码的烦恼,笔者在115网盘上分享了本书所使用的Android源码及其他一些资源,如图1-12所示。
图1-12 本书资源
图1-12中:
- 4.2.2.tar.gz为4.2.2源码压缩包。请读者特别注意,本书对wpa_supplicant的分析使用的是Android 4.1源码中的wpa_supplicant,故笔者在external目录中将4.1版本中的wpa_supplicant代码复制到wpa_supplicant_8_4.1中。
- classpath为Android Java配置文件,使用时请将它改名为.classpath。
- busybox-armv7l是BusyBox。
- com.cb.eclipse.folding_1.0.6.jar是一个Eclipse的插件,名叫Coffee Byte Java,它可以折叠代码段以方便阅读[2]。
- 最后四个文件为笔者研究Wi-Fi时利用Wi-Fi数据截获工具AirPcap保存的相关协议数据包,其中p2p_cap为测试P2P时保存的数据包,wps_pbc和wps_pin为测试WSC PBC和PIN时保存的数据包,wpa_supplicant_analysis为测试STA加入AP时所保存的数据包。没有AirPcap工具的读者可通过Wireshark工具直接导入这些数据以更直观得方式来分析Wi-Fi。
最后,该资源的下载地址是http://115.com/lb/5lbee5qn4g5g。另外,请读者务必关注笔者的博客blog.csdn.net/innost以获取更新信息。
[1] 4.4新增了一个名为ART的虚拟机运行时,相信它的出现能提升应用程序的运行速度。
[2]其用法请参考《深入理解Android:卷2》第1章。其电子版下载地址为http://download.csdn.net/detail/innost/4408140。