正文  网络通信 > 近场通信/NFC >

《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第一章 准备工作

首先感谢各位兄弟姐妹们的耐心等待。本书预计在3月中旬上市发售。从今天开始,我将在博客中连载此书的一些内容。注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业。[要点:建议那些还...

首先感谢各位兄弟姐妹们的耐心等待。本书预计在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