http://bbs.pediy.com/showthread.php?t=183278
【原创】Android源码分析工具及方法
作 者: MindMac
时 间: 2014-01-02,09:32:35
链 接: http://bbs.pediy.com/showthread.php?t=183278
在对 Android 源码进行分析时,如果有得力的工具辅助,会达到事半功倍的效果。本文
介绍了一些在分析 Android 源码时使用的一些工具和方法,希望能够帮助到有需要的同学。
Eclipse
在 Android 应用程序开发过程中,一般会使用 Eclipse,当然 Google 在 2013 年也推出了
针对 Android 开发的 IDE 工具 Android Studio。借助于 Eclipse 可以更好的分析 Android 源码,
关于 Android 源码的下载和编译在此省略,网上有很多相关的教程,当然最好是参考 Google
官方的文档了,http://source.android.com/source/downloading.html 提供了从源码下载到编译运
行的所有步骤。在编译完 Android 源码后,可以将源码导入到 Eclipse 中方便后续的分析,具
体步骤如下(可参考《深入理解 Android 卷 II》P7-P8):
- 将 Android 源码目录下/development/ide/eclipse/.classpath 复制到 Android 源码根目录;
/development/ide 目录下除了 eclipse 文件夹以外,还有 intellij,emacs 和 xcode 文件夹,
这些文件夹下提供了相应 IDE 的配置文件; - /development/ide/eclipse/.classpath 文件供 Eclipse 使用,文件内容是源码目录中各个模块
的路径,基本内容如图 1 所示。可以根据自己分析的需要来修改.classpath 的内容,例
如如果只需要分析 Framework 相关的模块,可以把一些不属于 Framework 的源码目录路
径从该文件中注释或者删除掉;
图 1.classpath 文件基本内容
- 在 Eclipse 中单击 File -> New -> Java Project,在弹出的窗口中填写 Project Name 并去除
Use default location 的勾选,将 Location 选择为 Android 源码的根目录,如图 2 所示。完
成后点击 Finish 按钮,由于 Android 源码文件较多,导入过程可能会持续较长一段时间(视
机器性能而定)。
图 2 在 Eclipse 中导入 Android 源码
需要注意的几点:
- 在.classpath 文件中会有一些指向/out/target/...的路径,而 out 目录是在对 Android
源码进行编译后生成的,所以在将 Android 源码导入到 Eclipse 之前需要完成对
Android 源码的编译; - 导入源码前请取消 Eclipse 的自动编译选项(Android 源码文件很多,编译一遍比较耗
时),去除菜单栏 Project 下的 Build Project Automatically 的勾选即可。
完成 Android 源码的导入后,就可以借助 Eclipse 进行源码的分析。一般我在分析 A
ndroid 源码时,主要借助 Eclipse 的自动定位功能。以分析 ActivityManagerService 为例,
该服务由 system_server 线程创建,在 SystemServer.java(/frameworks/base/services/java/c
om/android/server/SystemServer.java)的 main 函数入口处调用了 System.currentTimeMillis()
函数,那么如果希望分析该函数的具体实现过程,则可以按住 Ctrl 键,将鼠标移动到调
用的 currentTimeMillis 函数处,单击鼠标左键,则可以自动定位到 System.currentTimeMi
llis 函数的源代码处(可能根据快捷键的设置不同,自动定位的方法有所不同)。有了自动
定位功能,就不需要自己来搜索查找源文件了。
Android SDK Search
在 Android 开发或者源码分析时,一般会去查看 Google 官方提供的 Android API,如果希
望深入了解 API 实现的细节,当然最好的方法就是去看源代码了。对于在线 API 文档,如果
在查看时,还能够查看到源代码那当然是最好不过的。在 Chrome 浏览器下,可以安装 Android
SDK Search 扩展程序来达到这个目的,该扩展程序在 Chrome 网上应用店截图如下所示。安
装完该扩展程序后,再次搜索 Android API 后,会在相应的搜索结果后增加一个 view source
链接。例如搜索 Activity 类,结果如图 4 所示。点击 view source 链接,就可以打开 Activity
类的源代码,如图 5 所示,从网页中可以看出其实是链接到了 Google 的 Android 源码的 Git
图 3 Android SDK Search
图 4 添加 Android SDK Search 扩展程序后的效果
图 5 View Source 打开的 Activity 源码
库。当然这种在浏览器下分析源代码是有诸多不便的,远没有在 Eclipse 等 IDE 下来的方便。
不过我们可以根据网页上给出的路径在本地源码中快速地定位到目标代码,将图 5 中两个
红框的路径拼接后得到的/frameworks/base/core/java/android/app/Activity.java 就是本地源码
对应的路径,这样就可以使用 Eclipse 等 IDE 来分析源码。
对于上述情况,也可以直接在 Eclipse 中关联 Android 源代码(主要是 Framework 的源码)。
例如对于在一个 Android 工程中,希望查看 Activity 源码,如下代码所示:
代码:
1. public class MainActivity extends Activity { 2. @Override 3. protected void onCreate(Bundle savedInstanceState) { 4. super.onCreate(savedInstanceState); 5. setContentView(R.layout.activity_main); 6. ...... 7. } 8. }
found,如图 6 所示。对于 Android4.0 以后的版本,在下载 SDK 时,可以同时选择下载源码,
如图 7,下载完成后在 Android SDK 目录下会有 sources 目录,其下存在相应版本的 Android
源码,如 android-17 等。点击 Attach Source,在出现的对话框中,选择 External location,点
击 External Folder,选择下载完的源码目录,如.../sources/android-17,如图 8 所示,点击 OK
就可以看到 Activity 类的源码信息了。
图 6 Source Not Found Error
图 7 下载 Android 对应的源码
图 8 Eclipse 关联 Android 源码
由于只有 Android 4.0 以后的版本存在相应的 source 目录,所以对于 Android4.0 之前的
版本是无法通过下载 SDK 的方式来获得源码的,当然网上也存在一些 4.0 之前的 source 压
缩包可以使用。另一种更方便的方法是安装 Android Sources 的 Eclipse 插件(https://code.goo
gle.com/p/adt-addons/),在 Eclipse 中可以 Install New Software,添加的 Location 地址为 http:
//adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update/。由于插件
较大,大约 240M 左右,可能下载安装时间较长。安装完成后对于大部分 Android 版本都可
以查看源码了。Android Sources 现在支持的版本如下:
- 14 - Android 4.0.1
- 10 - Android 2.3.4
- 9 - Android 2.3
- 8 - Android 2.2
- 7 - Android 2.1
- 6 - Android 2.0.1
- 4 - Android 1.6
- 3 - Android 1.5
AndroidXRef
借助 Eclipse 以及本地源码可以比较方便地分析 Android 源码,但是对于 Native 代码的调
用就无法通过 Eclipse 的快速定位来查看相应的 Native 源码了,而且 Android 源码中对 Native
库的加载一般不是通过在 Static 块里调用 System.loadLibrary 来加载库文件并完成 Native 函数
注册的,所以定位这类代码比较困难。一个可以采取的方法是使用 UltraEdit 等工具来在文件
中搜索特定的字符串,如函数名,对于 JNI 函数来说,一般存在于/frameworks/base/core/jni
目录下。在文件数目较多的情况下,使用这种方法搜索起来还是比较忙的,所以这里介绍下
AndroidXRef。
AndroidXRef(http://androidxref.com/)项目提供 Android 源码的交叉索引,可以快速的搜索
符合特定条件的 Android 源代码,后台是基于 OpenGrok 引擎,OpenGrok 主要用来在源码中搜
索、交叉索引以及进行导航。AndroidXRef 提供了完整的 Android 源码的索引,包括内核源码。
在 AndroidXRef 主页的右侧显示了可用的源码版本,如图 9 所示,点击相应的源码版本链接
就可以进入对应的源码分支,如图 10 所示。
图 9 AndroidXRef 主页
图 10 AndroidXRef KitKat4.4-r1 分支
图 10 右侧提供在特定目录下搜索,例如在分析 Framework 时,可以选择 frameworks 目
录,这样可以减少搜索范围,能够更加精确地定位到需要的源代码。左侧则是提供了一些搜
索的条件,其意义如下(在指定的 Project(s)下):
- Full Search: 进行全文搜索,会匹配所有的单词、字符串、标识符以及数字等,例如在
frameworks 下通过 Full Search 搜索”activity”,则会显示所有包含 activity 字符(忽略大小写)
的结果,即使是注释也会显示出来,如图 11 所示。点击绿色背景的链接会打开包含
activity 字符串文件所在的文件夹;点击左侧文件名如 WidgetAdder.java 链接会打开包含
activity 字符串文件;点击右侧每一行的搜索结果链接同样会打开相应的文件内容;
图 11 Full Search 搜索
- Definition:搜索符号定义相关的代码,例如搜索 startActivityIfNeeded 函数的定义,显示
结果如图 12 所示,从搜索结果可以看到,右侧绿色字体表明了是位于 Activity 类中的
方法;
图 12 Definition 搜索
- Symbol:搜索符号,例如可以搜索类中的成员变量等,图 13 显示了通过 Symbol 搜索
WINDOW_HIERARCHY_TAG 的结果;
图 13 Symbol 搜索
- File Path:搜索源码文件名中包含给定字符串的文件,例如想要搜索文件名包含 Activity
的源码文件,则可以在 File Path 中填入 Activity 进行搜索,结果如所示;
图 14 File Path 搜索
- History:在 Git 库中的 history log comments 中搜索给定的字符串,这个用处应该不是特
别大,只是从 Android 源码提交者的 comments 中搜索信息。例如搜索 god 字符串,显
示结果如图 15 所示,但是点击源码文件链接,只是会显示源码内容,并不会附加 history
log comments 内容;
图 15 History 搜索
当然可以通过组合的方式使用上述提到的搜索方法,例如想在 Activity.java 文件中搜索
finish 函数的定义,则可以在 Definition 中填入”finish”,在 File Path 中填入”Activity.java”,搜索
结果如图 16 所示。
图 16 组合搜索
因为 AndroidXRef 使用的是 OpenGrok 引擎,因此还支持一些其他的搜索方式:
- + 表示包含此字符串,- 表示包含此字符串。例如在 Full Search 中搜索包含 activity
字符串但是不包含 service 字符串的源文件,可以填入+”activity” -“service”(去掉双引
号同样可以,但是对于不可分割的词且两者间包含空格则双引号不可去,此规则适
用于所有的搜索规则,例如 Full Search “final String”,双引号去除表示或的关系,这
个与 Google 的搜索规则是一样的); - 布尔操作,可以使用 AND(&&),”+”,OR(||),NOT(!)以及”-”(AND 等必须全部大写),例如搜
索既包含 final 又包含 String 的源码文件,可以 Full Search 中填入”final” AND “String”; - 使用通配符,”?”代表一个字符,”*”代表多个字符(“?”和”*”不可用于字符串的开头);
- 模糊查询,可以使用”~”搜索包含与提供的字符串拼写类似的源码文件等内容;
- 转义字符,OpenGrok 中使用到的特殊字符包括+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ ,因此如果需要搜索的内容中包含这些特殊字符,可以使用\进行转义,例如搜索(1+1):2,
可以这样\(1\+1\)\:2。
更加详细的使用规则可以参考 AndroidXRef 的 Help(http://androidxref.com/4.4_r1/help.jsp)。
个人觉得 AndroidXRef 适合用来搜索定位源码文件的路径,至于源码的实际分析当然借
助于 Eclipse 等 IDE 会更加方便。
总结
本文主要总结了我个人在 Android 源码分析过程中使用到的一些工具及基本方法,纯属
一家之言,权当抛砖引玉,如果有更好的方法欢迎交流学习!
注:本帖由看雪论坛志愿者PEstone 重新将pdf整理排版,若和原文有出入,以原作者附件为准
关于在Android源码分析过程中使用的一些工具以及基本方法的总结,纯属一家之言,当然还有更多更好的方法,欢迎交流!
下载点这里: Android源码分析工具及方法.pdf