Android阅读源码的几种方法

本篇博客只是记录了阅读源码的几种方法,如果想知道怎么阅读源码的话推荐:
大牛们是怎么阅读 Android系统源码的?

我们必须先知道几个网站:

  • AOSP项目官方(Android Open Source Project)
    • 这个一定要先读. 项目介绍, 代码下载, 环境搭建, 刷机方法, Eclipse配置都在这里. 这是一切的基础.
  • Android官方Training
    • 这个其实是给App开发者看的. 但是里面也有不少关于系统机制的介绍, 值得细读.

1、使用Android Studio阅读

这里先说明两个常用的快捷键:

  • “Ctrl + 鼠标左键”
    • 定位具体源码
  • “双击 Shift”
    • 在查找框里输入目标类的名字来定位

当想要看具体类的源码的时候,如果 Android SDK 里对应 API Level 的 Source 包有下载的话,IDE 会打开对应的 Source 包;如果还没有下载,IDE 会把对应 API Level 的 android.jar 包反编译成 Java代码,这个规则对于一些第三方的开源项目也一样。

我们可以通过SDK Manager下载source,下载完成后再sdk目录下会有source文件夹:
Android阅读源码的几种方法_第1张图片

下载好了之后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中是实际存在的。

Google 的 AOSP 项目

当你需要的源码在 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 源码的一些姿势

2、使用Source Insight阅读源码

一个源码可能有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下的目录加到工程,以后如有需要,再把其他目录加进来。

这里是推荐的使用方法链接:极客学院

3、使用Chrome插件

使用Android SDK Search这个插件。

Android阅读源码的几种方法_第2张图片

相信平时到 Android 开发者官网 查看 API 说明的人不少,这个扩展可以在 API 类名旁边显示一个跳转链接,用于跳转到 AOSP 中对应的类的源码,方便查看源码。

安装以后当我们访问官方文档就会发现多了个“view source ”按钮:

Android阅读源码的几种方法_第3张图片

点击进去就可以看到相应的源码了。

你可能感兴趣的:(Android学习笔记)