Android源码分析工具及方法Word文件下载.docx
《Android源码分析工具及方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《Android源码分析工具及方法Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
行的所有步骤。
在编译完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->
JavaProject,在弹出的窗口中填写ProjectName并去除
Usedefaultlocation的勾选,将Location选择为Android源码的根目录,如图2所示。
完
成后点击Finish按钮,由于Android源码文件较多,导入过程可能会持续较长一段时间(视
机器性能而定)。
图2在Eclipse中导入Android源码
需要注意的几点:
∙在.classpath文件中会有一些指向/out/target/...的路径,而out目录是在对Android
源码进行编译后生成的,所以在将Android源码导入到Eclipse之前需要完成对
Android源码的编译;
∙导入源码前请取消Eclipse的自动编译选项(Android源码文件很多,编译一遍比较耗
时),去除菜单栏Project下的BuildProjectAutomatically的勾选即可。
完成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函数的源代码处(可能根据快捷键的设置不同,自动定位的方法有所不同)。
有了自动
定位功能,就不需要自己来搜索查找源文件了。
AndroidSDKSearch
在Android开发或者源码分析时,一般会去查看Google官方提供的AndroidAPI,如果希
望深入了解API实现的细节,当然最好的方法就是去看源代码了。
对于在线API文档,如果
在查看时,还能够查看到源代码那当然是最好不过的。
在Chrome浏览器下,可以安装Android
SDKSearch扩展程序来达到这个目的,该扩展程序在Chrome网上应用店截图如下所示。
安
装完该扩展程序后,再次搜索AndroidAPI后,会在相应的搜索结果后增加一个viewsource
链接。
例如搜索Activity类,结果如图4所示。
点击viewsource链接,就可以打开Activity
类的源代码,如图5所示,从网页中可以看出其实是链接到了Google的Android源码的Git
图3AndroidSDKSearch
图4添加AndroidSDKSearch扩展程序后的效果
图5ViewSource打开的Activity源码
库。
当然这种在浏览器下分析源代码是有诸多不便的,远没有在Eclipse等IDE下来的方便。
不过我们可以根据网页上给出的路径在本地源码中快速地定位到目标代码,将图5中两个
红框的路径拼接后得到的/frameworks/base/core/java/android/app/Activity.java就是本地源码
对应的路径,这样就可以使用Eclipse等IDE来分析源码。
对于上述情况,也可以直接在Eclipse中关联Android源代码(主要是Framework的源码)。
例如对于在一个Android工程中,希望查看Activity源码,如下代码所示:
代码:
1.publicclassMainActivityextendsActivity{
2.@Override
3.protectedvoidonCreate(BundlesavedInstanceState){
4.super.onCreate(savedInstanceState);
5.setContentView(R.layout.activity_main);
6.......
7.}
8.}
可以使用Eclipse提供的快速定位功能来查看Activity类的源码,但是点击后会显示Sourcenot
found,如图6所示。
对于Android4.0以后的版本,在下载SDK时,可以同时选择下载源码,
如图7,下载完成后在AndroidSDK目录下会有sources目录,其下存在相应版本的Android
源码,如android-17等。
点击AttachSource,在出现的对话框中,选择Externallocation,点
击ExternalFolder,选择下载完的源码目录,如.../sources/android-17,如图8所示,点击OK
就可以看到Activity类的源码信息了。
图6SourceNotFoundError
图7下载Android对应的源码
图8Eclipse关联Android源码
由于只有Android4.0以后的版本存在相应的source目录,所以对于Android4.0之前的
版本是无法通过下载SDK的方式来获得源码的,当然网上也存在一些4.0之前的source压
缩包可以使用。
另一种更方便的方法是安装AndroidSources的Eclipse插件(https:
//code.goo
Eclipse中可以InstallNewSoftware,添加的Location地址为http:
//adt-
较大,大约240M左右,可能下载安装时间较长。
安装完成后对于大部分Android版本都可
以查看源码了。
AndroidSources现在支持的版本如下:
∙14-Android4.0.1
∙10-Android2.3.4
∙9-Android2.3
∙8-Android2.2
∙7-Android2.1
∙6-Android2.0.1
∙4-Android1.6
∙3-Android1.5
AndroidXRef
借助Eclipse以及本地源码可以比较方便地分析Android源码,但是对于Native代码的调
用就无法通过Eclipse的快速定位来查看相应的Native源码了,而且Android源码中对Native
库的加载一般不是通过在Static块里调用System.loadLibrary来加载库文件并完成Native函数
注册的,所以定位这类代码比较困难。
一个可以采取的方法是使用UltraEdit等工具来在文件
中搜索特定的字符串,如函数名,对于JNI函数来说,一般存在于/frameworks/base/core/jni
目录下。
在文件数目较多的情况下,使用这种方法搜索起来还是比较忙的,所以这里介绍下
AndroidXRef。
AndroidXRef(Android源码的交叉索引,可以快速的搜索
符合特定条件的Android源代码,后台是基于OpenGrok引擎,OpenGrok主要用来在源码中搜
索、交叉索引以及进行导航。
AndroidXRef提供了完整的Android源码的索引,包括内核源码。
在AndroidXRef主页的右侧显示了可用的源码版本,如图9所示,点击相应的源码版本链接
就可以进入对应的源码分支,如图10所示。
图9AndroidXRef主页
图10AndroidXRefKitKat4.4-r1分支
图10右侧提供在特定目录下搜索,例如在分析Framework时,可以选择frameworks目
录,这样可以减少搜索范围,能够更加精确地定位到需要的源代码。
左侧则是提供了一些搜
索的条件,其意义如下(在指定的Project(s)下):
∙FullSearch:
进行全文搜索,会匹配所有的单词、字符串、标识符以及数字等,例如在
frameworks下通过FullSearch搜索”activity”,则会显示所有包含activity字符(忽略大小写)
的结果,即使是注释也会显示出来,如图11所示。
点击绿色背景的链接会打开包含
activity字符串文件所在的文件夹;
点击左侧文件名如WidgetAdder.java链接会打开包含
activity字符串文件;
点击右侧每一行的搜索结果链接同样会打开相应的文件内容;
图11FullSearch搜索
∙Definition:
搜索符号定义相关的代码,例如搜索startActivityIfNeeded函数的定义,显示
结果如图12所示,从搜索结果可以看到,右侧绿色字体表明了是位于Activity类中的
方法;
图12Definition搜索
1Symbol:
搜索符号,例如可以搜索类中的成员变量等,图13显示了通过Symbol搜索
WINDOW_HIERARCHY_TAG的结果;
图13Symbol搜索
∙FilePath:
搜索源码文件名中包含给定字符串的文件,例如想要搜索文件名包含Activity
的源码文件,则可以在FilePath中填入Activity进行搜索,结果如所示;
图14FilePath搜索
∙History:
在Git库中的historylogcomments中搜索给定的字符串,这个用处应该不是特
别大,只是从Android源码提交者的comments中搜索信息。
例如搜索god字符串,显
示结果如图15所示,但是点击源码文件链接,只是会显示源码内容,并不会附加history
logcomments内容;
图15History搜索
当然可以通过组合的方式使用上述提到的搜索方法,例如想在Activity.java文件中搜索
finish函数的定义,则可以在Definition中填入”finish”,在FilePath中填入”Activity.java”,搜索
结果如图16所示。
图16组合搜索
因为AndroidXRef使用的是OpenGrok引擎,因此还支持一些其他的搜索方式:
∙+表示包含此字符串,-表示包含此字符串。
例如在FullSearch中搜索包含activity
字符串但是不包含service字符串的源文件,可以填入+”activity”-“service”(去掉双引
号同样可以,但是对于不可分割的词且两者间包含空格则双引号不可去,此规则适
用于所有的搜索规则,例如FullSearch“finalString”,双引号去除表示或的关系,这
个与Google的搜索规则是一样的);
∙布尔操作,可以使用AND(&
&
),”+”,OR(||),NOT(!
)以及”-”(AND等必须全部大写),例如搜
索既包含final又包含String的源码文件,可以FullSearch中填入”final”AND“String”;
∙使用通配符,”?
”代表一个字符,”*”代表多个字符(“?
”和”*”不可用于字符串的开头);
∙模糊查询,可以使用”~”搜索包含与提供的字符串拼写类似的源码文件等内容;
∙转义字符,OpenGrok中使用到的特殊字符包括+-&
||!
(){}[]^"
~*?
:
\,因此如果需要搜索的内容中包含这些特殊字符,可以使用\进行转义,例如搜索(1+1):
2,
可以这样\(1\+1\)\:
2。
更加详细的使用规则可以参考AndroidXRef的Help(
个人觉得AndroidXRef适合用来搜索定位源码文件的路径,至于源码的实际分析当然借
助于Eclipse等IDE会更加方便。
总结
本文主要总结了我个人在Android源码分析过程中使用到的一些工具及基本方法,纯属
一家之言,权当抛砖引玉,如果有更好的方法欢迎交流学习!
注:
本帖由看雪论坛志愿者PEstone重新将pdf整理排版,若和原文有出入,以原作者附件为准
关于在Android源码分析过程中使用的一些工具以及基本方法的总结,纯属一家之言,当然还有更多更好的方法,欢迎交流!