Android 源代码在线查看网站

在 Android sudio 中,想要查看一个 Android 系统的源代码,仅仅需要 Ctrl+鼠标左键 点击该目标类和方法名,即可在开发软件Android studio里查看到相应的源码。当前前提是你已经在 Android sdk 中下载了对应版本的源码。

这是查看 Android 源码最简单的方法,也是最有用的方法。但是这种方式也有弊端,那就是有些代码,特别是 native 代码是无法看到的。但是如果下载所有 Android 代码到本地不仅是网络上有难度,占用磁盘也很大。

所以此处分享两个查看 Android 源代码的在线网站。

Android Code Search

Android 源代码官方查看网站:https://cs.android/

这个是官方的源代码查看网站,分了四个项目,查看 Android 的话只需要找第一个第一个项目。

非常推荐官方的网站,不仅可以方便的查看、搜索源代码,可以切换分支标记等,还能在整个代码库之间进行交叉引用的代码跳转。更重要的是作为官方的网站,其全局搜索功能是真的好用。强烈推荐。

AOSPXRef

AOSPXRef 在线查看源代码:http://aospxref/

如果官方的网站不方便使用的话,那么就推荐这个网站了,速度非常快,而且包含了最新的代码。

此处直接点进 android-12 版本源码查看

在此处可以进行一些源代码的搜索,不过其搜索体验就完全没有官方的网站好了。图中的各个搜索框对应功能如下:

字段作用
Full Search全文搜索,搜索索引中的所有文本标记(单词,字符串,标识符,数字)。搜索符号:覆盖符号的定义及使用,包括注释出现该符号
Definition仅查找符号定义。例如搜索xx函数在哪些类中有定义
Symbol仅查找符号。包括该符号的定义及使用位置
File Path源文件的路径。搜索源码文件名中包含给定字符串的文件。(类级别)支持输入类名等。方法名通过前三种方式搜索
History历史记录日志注释

AndroidXRef

AndroidXRef 在线查找源代码:http://androidxref/

这个网站最开始比较常用,不过后续只更新到 Android 9。其使用方式与上面的 AOSPXRef 使用方式一样,就不再赘述。

Android 源代码目录结构

Android 各个版本的源码目录结构基本上是大同小异,此处用最新的源代码来表示其源码目录结构。

注意看左侧目录,其结构对应如下:

artAndroid Runtime,一种App运行模式,区别于传统的Dalvik虚拟机,旨在提高Android系统的流畅性
bionic基础C库源代码,Android改造的C/C++库
bootableAndroid程序启动导引,适合各种bootloader的通用代码,包括一个recovery目录
build存放系统编译规则及generic等基础开发包配置
compatibilityAndroid兼容性计划
ctsAndroid兼容性测试套件标准
dalvikAndroid Dalvik虚拟机相关内容
developersAndroid开发者参考文档
developmentAndroid应用开发基础设施相关
deviceAndroid支持的各种设备及相关配置
externalAndroid中使用的外部开源库
frameworks应用程序框架,Android系统核心部分,由Java和C++编写
hardware硬件适配接口
kernelLinux Kernel,不过Android默认不提供,需要单独下载,只有一个tests目录
libcoreAndroid Java核心类库
libnativehelperAndroid动态库,实现JNI库的基础
packages应用程序包
pdkPlug Development Kit 的缩写,本地开发套件
platform_testingAndroid平台测试程序
prebuiltsx86和arm架构下预编译的一些资源
sdkAndroid的Java层sdk
systemAndroid底层文件系统库、应用和组件
testAndroid Vendor测试框架
toolchainAndroid工具链文件
toolsAndroid工具文件
Android.bpAndroid7.0开始代替Android.mk文件,它是告诉ndk将jni代码编译成动态库的一个脚本
Makefile全局Makefile文件,用来定义编译规则

应用层 /packages 目录

应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。其中目录结构如下:

apps核心应用程序
inputmethods输入法目录
providers内容提供者目录
screensavers屏幕保护
services通信服务
wallpapers墙纸

应用框架层 /frameworks 目录

应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。其中目录结构如下:

av多媒体框架
baseAndroid源码的主要核心目录
compile编译相关
ex文件解析器
hardware硬件适配接口
layoutlib布局相关
minikinAndroid原生字体,连体字效果
ml机器学习
multidex多dex加载器
nativenative实现
opt一些软件
rsRender Script,可创建3D接口
supportframework支持文件
wilhelm基于Khronos的OpenSL ES/OpenMAX AL的audio/multimedia实现

应用架构层核心代码 /frameworks/base

在 frameworks 中的 base 目录是应用框架层的主要核心代码,其子目录也比较多,我就不贴图了。其部分目录结构如下:

apct-tests性能优化测试
apiandroid应用框架层声明类、属性和资源
cmdsandroid系统启动时用到的commands
coreframework的核心框架组件
dataandroid下的资源(字体、声音、视频、软盘等)
docsandroid项目说明
drm实现权限管理,数字内容解密等模块的工作
graphics图像渲染模块
keystore秘钥库
libs库信息(界面、存储、USB)
location位置信息
media手机媒体管理(音频、视频等)
native本地方法实现(传感器、输入、界面、窗体)
nfc-extras近场通讯
obex蓝牙
opengl2D和3D图形绘制
packages框架层的实现(界面、服务、存储)
proto协议框架
rs资源框架
samples例子程序
saxxml解析器
services各种服务程序
telecommtelecomm通信框架
telephony电话通讯框架
tests各种测试
wifiwifi模块

之所以说这个目录重要,我举几个例子你就明白了:

  • 常用的 View 类在 /frameworks/base/core/java/android/view/View.java
  • 常用的 Activity 类在 /frameworks/base/core/java/android/app/Activity
  • 常用的 Bitmap 类在 /frameworks/base/graphics/java/android/graphics/

这几个类在 Android 开发中非常常用,它们都是在 /frameworks/base/目录下的。

查找 native 源代码 Bitmap.nativeCreate

现在已经知道了可以从哪里找到源代码,也知道了源代码的目录结构,于是就可以小试一下,通过源代码找到我们想找的 native 代码。这些代码在 Android sdk 中的是没有的。

此处以 Bitmap 类来举例。Bitmap 类在 Android 开发中非常常用,也可以在 Android Studio 中点进去查看源码,不过当点进去之后我们会发现不少地方都是报红线的,这些地方都是 sdk 中没有的代码的引用。不过我们可以通过上面分享的三个网站找到这些代码。

比如说在查看创建 Bitmap 的代码时,在 Android Studio 中只能查看到 Bitmap.createBitmap 的 Java 方法:

在这段代码中,创建图片的核心代码就是红色框中的那段 nativeCreate 方法。但是这段代码是 native 代码,在 Android Studio 中无法查看的,这个时候就可以在 Android 源码里面找了。这里使用官方源码查看网站作为例子,另外的两个网站大同小异。

首先在 Android 源码中找到 Bitmap.java 文件,再点击 nativeCreate,此时能看到这个方法在 Bitmap 类中的引用,但是找不到方法内容:

这个时候就需要用到 JNI 的相关知识了,既然方法名是 nativeCreate,那么根据 jni 的映射规则,此方法在 native 的方法名应该是 Java_android_graphics_Bitmap_nativeCreate。搜索一下:

没有搜索结果,那么这个方法既然不是用 jni 命名映射的方式,那么就应该是使用的动态注册了。动态注册方法会在 JNI_OnLoad 方法中使用 JavaVM->RegisterNatives 的方法将两边的方法绑定到一起。其中需要提供 Java 中的方法名和该方法的签名,以及对应的 native 的方法的指针。

这样的话,我们只需要全局搜索 nativeCreate 字符串,或者搜索这个方法的签名 ([IIIIIIZJ)Landroid/graphics/Bitmap;,如果你下载了源代码到本地的话,这个方法会非常好用。一般情况下,对应于一个 Java 的文件,会有其同名的 cpp 文件来处理其 native 部分,此处就先搜索 Bitmap.cpp 这个文件:

看起来第一个比较像是想要找的,点击去会发现文件中会有这么一段映射:

也就是说 nativeCreate 方法在这个 C++ 文件中对应到了 Bitmap_creator 方法,点击跳转,这样就找到了对应的 native 代码了:

观察此方法的对应参数,能够与 Java 声明的 native 对应的上,确定这就是 Bitmap.nativeCreate 的具体实现代码了。查找源代码,还是要熟悉源代码结构才行啊。

另外注意一下这个目录名 hwui,这个 hwui 是 Android 用于2d硬件绘图而加入的一个模块。在hwui之前,Android 主要是用skia来进行软件绘制,后由于绘制性能等问题,现在 Android 的绘图几乎都是使用了hwui硬件加速绘图。hwui主要则是使用 OpenGL ES 来进行 GPU 硬件绘图,以提升整个系统的绘制性能。

更多推荐

Android 源代码在线查看 目录结构 不完全指南