|
|
本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明! |
普通会员
|
标 题:
【原创】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):
图 1.classpath 文件基本内容
图 2 在 Eclipse 中导入 Android 源码 需要注意的几点:
完成 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 现在支持的版本如下:
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)下):
图 11 Full Search 搜索
图 12 Definition 搜索
图 13 Symbol 搜索
图 14 File Path 搜索
图 15 History 搜索 当然可以通过组合的方式使用上述提到的搜索方法,例如想在 Activity.java 文件中搜索 finish 函数的定义,则可以在 Definition 中填入”finish”,在 File Path 中填入”Activity.java”,搜索 结果如图 16 所示。 图 16 组合搜索 因为 AndroidXRef 使用的是 OpenGrok 引擎,因此还支持一些其他的搜索方式:
更加详细的使用规则可以参考 AndroidXRef 的 Help(http://androidxref.com/4.4_r1/help.jsp)。 个人觉得 AndroidXRef 适合用来搜索定位源码文件的路径,至于源码的实际分析当然借 助于 Eclipse 等 IDE 会更加方便。 总结 本文主要总结了我个人在 Android 源码分析过程中使用到的一些工具及基本方法,纯属 一家之言,权当抛砖引玉,如果有更好的方法欢迎交流学习! 注:本帖由看雪论坛志愿者PEstone 重新将pdf整理排版,若和原文有出入,以原作者附件为准 关于在Android源码分析过程中使用的一些工具以及基本方法的总结,纯属一家之言,当然还有更多更好的方法,欢迎交流! 下载点这里: Android源码分析工具及方法.pdf*转载请注明来自看雪论坛@PEdiy.com | ||
此帖于 2014-01-02 22:42:07 被 PEstone 最后编辑
|
共 4 位会员 感谢 MindMac 发表的文章: | justlovemm (2014-01-07), Sadllll (2014-01-02), 枫清淡 (2014-01-02), 非虫 (2014-01-02) |
初级会员
|
XRef 这网站用的非常多, 在群里也多次发过链接。
| ||
|
初级会员
|
感谢,收藏了
| ||
|
普通会员
|
路过 看看
| ||
|
初级会员
|
多谢楼主分享!
| ||
|
初级会员
|
速度来收藏了,多谢楼主
| ||
|
初级会员
|
Mark 谢谢分享
| ||
|
普通会员
|
今天上看雪好慢。
| ||
|
初级会员
|
收藏
收藏了,大神 | ||
|
初级会员
|
学习~~
| ||
|
普通会员
|
wine+src insight~~
| ||
|
普通会员
|
| ||
|
初级会员
|
学习了 谢谢
| ||
|
初级会员
|
值得收藏,
| ||
|
中级会员
|
楼主很细心,希望能和楼主共同学习。
| ||
|