在哪里可以找到 Android 源码?
主要有以下几个官方和权威的渠道:

Google 官方 AOSP (Android Open Source Project) 仓库
这是最权威、最完整的源码来源,它包含了 Android 系统几乎所有的代码,包括框架、应用、库、驱动等。
- 网址: https://source.android.com/
- 如何获取:
- 在线浏览: AOSP 网站提供了强大的在线代码浏览工具,你可以直接在网页上查看任意版本的源码,并搜索代码,这是最方便快捷的方式。
- 代码浏览器: https://cs.android.com/
- 下载源码: 如果你需要完整下载源码到本地进行编译或深度研究,可以使用
repo工具,这通常需要较大的磁盘空间和较长的下载时间,具体步骤请参考 AOSP 官方的“设置构建环境”指南。
- 在线浏览: AOSP 网站提供了强大的在线代码浏览工具,你可以直接在网页上查看任意版本的源码,并搜索代码,这是最方便快捷的方式。
GitHub 上的镜像仓库
由于 Google 的 AOSP 仓库访问速度可能不稳定,许多开发者将 AOSP 的镜像托管在 GitHub 上,方便大家快速浏览和 git clone。
- 知名镜像:
- lineageos: https://github.com/LineageOS/android_frameworks_base (这是
frameworks/base模块的镜像,是最核心的部分) - 其他镜像: 你可以在 GitHub 上搜索 "android platform" 或 "aosp mirror" 找到更多。
- lineageos: https://github.com/LineageOS/android_frameworks_base (这是
注意: GitHub 上的镜像通常是某个特定版本(如 Android 13, 14)的快照,而不是像 AOSP 那样有持续更新的主线分支,但对于学习和阅读来说,这完全足够了。
Android Studio 内置的源码
这是日常开发中最常用、最方便的方式,当你遇到一个系统 API 不确定其内部实现时,直接在 Android Studio 中就能查看。

-
如何使用:
- 在你的代码中,将光标定位到你想要查看源码的类或方法上(
Activity类)。 - 按下
Ctrl + B(Windows/Linux) 或Cmd + B(macOS)。 - 如果你的项目正确配置了 SDK,Android Studio 会自动打开该 API 的源码文件。
- 在你的代码中,将光标定位到你想要查看源码的类或方法上(
-
原理: Android Studio 会根据你 SDK 的路径,找到
platforms目录下的相应版本(如android-34),然后进入sources文件夹,找到对应的 Java/Kotlin 源码,这个源码是 Google 编译时使用的、经过格式化和优化的版本,非常便于阅读。
Android 源码的核心目录结构
当你下载或浏览 AOSP 源码时,你会看到一个庞大的目录结构,了解核心目录的功能至关重要,以下是最重要的几个目录:
| 目录 | 描述 | 举例 |
|---|---|---|
frameworks/ |
Android 应用框架层,这是 Java 开发者最关心的部分,包含了所有 App 依赖的 API。 | frameworks/base/: 核心框架库,包含 java/ 和 java/com/android/ 包下的所有系统 API,如 Activity, Service, ContentProvider, BroadcastReceiver, View, WindowManager 等。 |
system/ |
系统核心服务,很多用 C++ 编写的系统服务,但会通过 JNI (Java Native Interface) 被 Java 框架调用。 | system/core/: 包含 adb, logcat 等基础工具的 C/C++ 实现。system_server: Java 代码,是 Android 系统的核心进程,运行着所有系统服务 (WindowManager, ActivityManager 等)。 |
packages/ |
系统应用程序,包含所有预装在系统里的 App。 | packages/apps/: Settings (设置), Launcher (桌面), Phone (电话), Contacts (联系人) 等。 |
hardware/ |
硬件抽象层,定义了硬件厂商需要实现的接口。 | 主要是 C/C++ 代码,定义了如 gralloc (图形内存分配), audio (音频) 等硬件接口。 |
libnativehelper/ |
JNI 辅助库,帮助 Java 代码更方便地调用 C/C++ 代码。 | 包含 JNIHelp 等辅助类。 |
dalvik/ |
虚拟机,早期 Android 的虚拟机实现,现在主要是指 ART (Android Runtime) 的历史部分。 | ART 负责运行 Java 字节码,并进行 AOT (Ahead-Of-Time) 编译。 |
art/ |
Android Runtime,现代 Android 使用的运行时。 | 包含 ART 虚拟机、垃圾回收器、编译器等核心 C++ 实现。 |
build/ |
构建系统,用于编译整个 Android 系统和各个模块。 | 包含 Soong, Makefile 等构建脚本和工具。 |
如何有效阅读和理解源码?
直接从 Activity 的 onCreate() 开始读,很容易迷失在浩如烟海的代码中,建议遵循以下策略:

从问题出发,带着目标去读
不要漫无目的地浏览,当你遇到一个具体的技术问题时,再去看源码。
- 例如: "为什么
startActivity()之后,新的 Activity 就能显示出来?" -> 这就是绝佳的切入点。
学习调用链分析
这是阅读源码的核心技能,以 startActivity() 为例,它的调用链大致如下:
- App 层: 你在
ActivityA中调用this.startActivity(new Intent(...))。 - Framework API (Java): 进入
ContextWrapper.startActivity(),最终会调用到Activity类的startActivity()方法。 - Instrumentation (Java):
Activity的startActivity()内部会调用Instrumentation.execStartActivity(),这个类负责监控和管理应用与系统的交互。 - ActivityManagerService (AMS) (Java):
Instrumentation通过 Binder 机制(IPC,进程间通信)跨进程调用到系统进程中的AMS的startActivity()方法,这是整个 Activity 调度的核心。 - Stack (Java):
AMS会将Activity的信息压入一个称为 "Activity Stack" 的任务栈中。 - ApplicationThread (Java):
AMS通知应用进程的ApplicationThread(Binder 的另一端):"你需要创建一个新的 Activity 了"。 - ActivityThread (Java):
ApplicationThread将消息发送到主线程的Handler(H) 中,最终在ActivityThread中调用Activity的onCreate(),onStart(),onResume()等生命周期方法。 - WindowManager (Java/C++): 在
onResume()之后,Activity会通过WindowManager将其DecorView添加到屏幕上,这会涉及到SurfaceFlinger(C++) 服务,最终将图像合成并显示出来。
如何追踪调用链:
- Android Studio: 使用
Ctrl + Alt + H查看一个方法的调用关系图。 - 在线浏览: 使用
cs.android.com的 "References" 标签页。 - 耐心: 仔细阅读每个方法的注释,理解它的作用。
先看 Java,再看 C++
大部分开发者只需要关注 Java 框架层,当你发现 Java 代码中有一句 System.loadLibrary("some_native_lib") 或者调用了一个 @hide 的 @Native 方法时,才需要去对应的 C++ 目录寻找答案,这通常是性能关键或与硬件交互的部分。
善用工具
- 全局搜索: 在
cs.android.com或 GitHub 上使用强大的搜索功能。 - 代码对比: 使用
git diff或 GitHub 的 "Blame" 功能查看某一行代码的修改历史和作者。 - IDE: Android Studio 的跳转、查找引用、查看结构图等功能不可或缺。
一个简单的实例:追踪 Logcat 的源码
假设你想知道 Log.d() 的日志最终是如何出现在 logcat 界面上的。
- 起点:
Log.d("TAG", "message")。- 在
frameworks/base/core/java/android/util/Log.java中找到d方法,你会发现它是一个静态方法,内部调用了println_native()。
- 在
- 进入 JNI:
println_native是一个@Native方法,这意味着它的实现在 C++ 中。- 在
frameworks/base/core/jni/android_util_Log.cpp中找到对应的android_util_Log_println_native()函数。
- 在
- 找到核心逻辑: 在 C++ 代码中,你会看到它调用了
logger相关的函数,它会创建一个LogBufferElement对象,并将其写入到LogBuffer中。 - 追踪
LogBuffer:LogBuffer是一个单例,它是一个内存中的环形缓冲区,用于存储所有日志,它的实现在system/core/liblog/logd_write.c中。 - 写入 socket:
logd_write.c中的代码最终会将日志通过 Unix Domain Socket 发送给一个名为logd的守护进程。 logd守护进程:logd是一个独立的系统进程,它运行在系统层面,负责接收所有来自 App 和系统的日志,并将其写入到/dev/log设备文件中,同时也可以通过网络或管道转发出去。logcat命令: 当你在终端运行logcat命令时,logcat工具(位于system/core/logcat/)会从logd守护进程读取这些日志并显示在屏幕上。
通过这个例子,你就能清晰地看到一条日志从 App 产生到最终显示的完整路径。
获取和阅读 Android Java 源码是成为一名高级 Android 开发者的必经之路。
- 工具: 优先使用 Android Studio (Ctrl+B) 和 cs.android.com。
- 路径: 核心代码在
frameworks/base/。 - 方法: 从问题出发,沿着调用链层层深入,善用 IDE 和搜索工具。
- 心态: 保持耐心和好奇心,不要指望一次性就能完全理解,每次阅读都会有新的收获。
祝你阅读愉快!
