本篇博客只是记录了阅读源码的几种方法,如果想知道怎么阅读源码的话推荐:
大牛们是怎么阅读 Android系统源码的?
我们必须先知道几个网站:
这里先说明两个常用的快捷键:
当想要看具体类的源码的时候,如果 Android SDK 里对应 API Level 的 Source 包有下载的话,IDE 会打开对应的 Source 包;如果还没有下载,IDE 会把对应 API Level 的 android.jar 包反编译成 Java代码,这个规则对于一些第三方的开源项目也一样。
我们可以通过SDK Manager下载source,下载完成后再sdk目录下会有source文件夹: 。
下载好了之后Android Studio就可以查看具体类的源码了。
但是这源码大小明显不科学,我们的Android源码怎么可能100M都不到?
这是因为Android SDK 自带的 Source 源码包,并没有包括所有的 Android Framework 的源码,仅仅提供给应用开发参考用,一些比较少用的系统类的源码并没有给出。
所以我们看源码时经常会出现下面的情况:
view的源码:
public class View implements Callback, android.view.KeyEvent.Callback, AccessibilityEventSource {
...
public boolean performClick() {
throw new RuntimeException("Stub!");
}
public boolean callOnClick() {
throw new RuntimeException("Stub!");
}
public boolean performLongClick() {
throw new RuntimeException("Stub!");
}
public boolean performContextClick() {
throw new RuntimeException("Stub!");
}
public boolean showContextMenu() {
throw new RuntimeException("Stub!");
}
...
}
RuntimeException(“Stub!”)
表示实际运行时的逻辑会由 Android ROM 里面相同的类代替执行。
此外,在IDE里看源码的时候,有时候一些方法或者类会出现报红(找不到)的情况。
这是因为这些方法或者类是被Android SDK隐藏的,出于安全或者某些原因,这些API不能暴露给应用层的开发者,所以编译完成的android.jar包里会把这些API隐藏掉,而我们的Android项目是依赖android.jar的,查看源码的时候,IDE会自动去android.jar找对应的API,自然会找不到。当然,这些API在ROM中是实际存在的。
当你需要的源码在 Android SDK Source 中找不到的时候,就有必要去 AOSP(Android Open Source Project)项目里面找了。
不过 AOSP 项目包括整个 Android 所有开源的东西,实在是太庞大了,对于一般开发者来说,我们只需要接触 Framework 层次的东西就够了,这里包括了 base、build-tools、support 包甚至 Volley 项目的源码。
以 base 为例,进入 base 目录,能看到 base 项目的 git 仓库,左边是其所有的分支。
进入 “master/core/java/android/” 路径就能看到熟悉的 Package 目录了,其他分支以及项目都类似。有必要的时候可以把整个 AOSP 项目 Clone 下来,大概 20G 左右,可以把项目导入到 IDE 里面,这样就更方便查看源码了,另外可以可是试着编译自己的 Android ROM,只需要部署能够跑 MakeFile 命令的环境就好。
以上出自: 阅读 ANDROID 源码的一些姿势
一个源码可能有20G,这时候使用AS就不是非常好的选择了。
这里推荐Source Insight。这个工具是一个很好的阅读源码的工具。
下载地址:
Source Insight 3.5 Download
下载安装完之后发现这是要收费的,我建议支持正版。
当然,如果手头比较紧的话也可以破解的(手动滑稽),这里说明下可用的破解方法(我个人用这个方法成功了,网上好多都是没法破解的):
新建文本文档,将对应的内容粘贴进去,重命名为.reg文件,双击运行,弹出提示窗口,点击“确定”,就破解好了。
64bit:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0\Install]
"SetupAdminOK"="1"
"SerialNumber"="SI3US-802287-90702"
"UName"=hex:76,6e,03
"UNameData"=hex:00,00,61,61
"UOrg"=hex:76,6e,03
"UOrgData"=hex:00,00,61,61
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0\Paths]
"CmdShell"="C:\\Windows\\system32\\cmd.exe"
"InitDir"="D:\\SourceInsight"
"BackupDir"="D:\\SourceInsight\\Backup"
32bit:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Source Dynamics\Source Insight\3.0\Install]
"SetupAdminOK"="1"
"SerialNumber"="SI3US-802287-90702"
"UName"=hex:7a,7a,79,62,7b,66,6d,6c,17
"UNameData"=hex:00,00,67,6e
"UOrg"=hex:60,66,6d,71,7f,6a,6d,6c,31,6c,71,78,7c,76,03
"UOrgData"=hex:00,00,79,6b
关于这个工具的使用方法可以去网上查找,这里就不多说了。
如果我们把Android所有源代码都加到工程中,会导致Source Insight运行速度非常慢,所以只需要将当前分析的源码目录加到工程即可
一般首先把framework/base下的目录加到工程,以后如有需要,再把其他目录加进来。
这里是推荐的使用方法链接:极客学院
使用Android SDK Search这个插件。
相信平时到 Android 开发者官网 查看 API 说明的人不少,这个扩展可以在 API 类名旁边显示一个跳转链接,用于跳转到 AOSP 中对应的类的源码,方便查看源码。
安装以后当我们访问官方文档就会发现多了个“view source ”按钮:
点击进去就可以看到相应的源码了。