4

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

 2 years ago
source link: https://blog.csdn.net/Innost/article/details/20292347
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

首先感谢各位兄弟姐妹们的耐心等待。本书预计在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的虚拟机运行时,相信它的出现能提升应用程序的运行速度。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK