EN

使用 Android Studio 查看 Android Lollipop 源码

字数统计: 1.9k阅读时长: 7 min
2015/01/16
loading

技术复核(2026-10-13):原文面向 Android 5.0 Lollipop 与 Android Studio 1.x。下面的 IDEGen 流程已按 AOSP android-5.0.0_r1 源码核对,属于历史方案;新增的 AIDEGen 示例以 android-16.0.0_r1 文档为准。

Android Studio

作为Google的亲儿子,Nexus手机系列所收到的待遇大家有目共睹.Android5.0出来之后,Nexus5第一时间就升级到了最新的系统.那么作为Google亲儿子的Android Studio同样备受Google的重视,我也是第一时间从Eclipse转投到了Android Studio的怀抱中,从最初的测试版本一路升级到现在的1.0正式版本.

现在如何查看源码

只查代码时,可以直接使用 Android Code Search,并确认所选分支;需要精确到发布版本时,使用 AOSP Gitiles 的对应标签。

需要本地跳转和修改代码时,先同步目标分支,按该分支文档执行 source build/envsetup.sh 并选择有效的 lunch 目标。以 Android 16 的 AIDEGen 为例,在已配置的源码根目录执行:

1
2
# 按模块名生成工程,并明确选择 Android Studio
aidegen Settings framework -i s

也可以把模块名换成源码路径:aidegen packages/apps/Settings frameworks/base -i s。默认示例使用 IntelliJ;-i s 才是明确选择 Android Studio。-s 的意思是跳过构建,缺少生成源码或依赖时不要用它掩盖问题。C/C++、Rust 的语言选项和 IDE 支持按所在分支的帮助检查,不保证一个 Java 工程覆盖所有语言。

现代 AOSP 构建环境要求 Linux;官方已从 Android 11 时期停止支持在 macOS 上进行 Android OS 开发。这与在 macOS 上用 Android Studio 开发普通 Android 应用是两回事。环境要求见 AOSP 开发环境文档。整棵源码树很大,通常先导入需要的模块;重新生成工程会覆盖生成的 IDE 配置,手工调整前注意保存。

当时选择 Android Studio 的原因

关于Android Studio的好处我就不用说了,下面两点就足矣让你转投Android Studio了:

  • Android Studio 是 Google 官方 Android IDE,1.0 正式版发布于 2014 年 12 月。
  • ADT 停止维护是后来的变化:Google 在 2015 年 6 月宣布于当年年底结束 Eclipse ADT 和 Android Ant 构建系统的开发与官方支持。不能把这个时间提前到本文标注的 2015 年 1 月。

后来的 1.1 稳定版发布于 2015 年 2 月,比这篇文章的初版晚一个月。版本和 ADT 停止维护的时间可以对照 Studio 1.0 公告和 ADT 公告。

转投Android Studio是大势所趋,网上关于如何使用Android Studio的帖子也是满天飞,所以我就不再啰嗦夸奖Android Studio了.看一下下面的图,估计你就会很有欲望了.想查看详细的内容,可以查看Android Studio官方文档

Android Studio Preview

Android 5.0 : Lollipop

Android 5.0 Lollipop 带来了新的界面和平台能力,详细介绍可以查看 Lollipop 官方介绍,我也就不多说了。作为一个开发者,我们不应该停留在绚丽的界面和新奇的 Material Design 上,更要了解其中的原理。

准备工作

下面是 Android 5.0 的历史准备流程,不能套用到任意 AOSP 版本:

  • 下载完整且版本一致的 Lollipop 源码,配置该分支要求的 JDK 和构建环境。
  • 该版本 IDEGen README 建议先执行 make,用于产生生成的 Java 源码。IDEGen 脚本本身需要已编译的 idegen.jar;“没有全量编译就一定不能生成工程”并不准确,但缺少生成源码和依赖会影响索引完整性。

如果访问官方文档或下载源码不顺畅,可以先处理本地网络环境,能花钱解决的事情,就不要花太多时间。

开始(Android 5.0 历史流程)

在源码根目录,先加载构建环境并选择目标,再编译 IDEGen:

1
2
3
source build/envsetup.sh
lunch
mmm development/tools/idegen/

这里的 lunch 交互菜单属于旧分支的用法。目标要与下载的设备源码匹配。编译成功后,执行:

1
development/tools/idegen/idegen.sh

该版本脚本 会在 out 中查找 idegen.jar 并运行生成器。IntelliJ 生成代码写出的是 android.ipr 和 android.iml,不是原文列出的三个文件;.iws 属于 IDE 的工作区文件。

在当时的 Android Studio 中打开 android.ipr(原文的 android.irp 是笔误),等待索引完成,并按该分支配置 JDK、源码和依赖。这个工程用于阅读源码;IDE 能打开工程不代表可以用普通应用的 Gradle 构建方式编译整个 Android 系统。

到这里就可以看源码了,已经完成了,没有下一步了。

问题

IDEGen 编译失败

先查看第一个实际编译错误,确认源码完整、构建环境已加载、目标正确,以及 JDK 是否符合该分支要求。仅凭“编译失败”不能判断是没有做全量编译。搜索错误时可使用 Google 或 Stack Overflow。

把目录当作 Java 文件读取

当时生成工程,我碰到了下面这个报错:

1
2
3
4
5
6
7
Exception in thread "main" java.io.FileNotFoundException: ./out/target/product/hammerhead/obj/GYP/shared_intermediates/res.java (Is a directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileReader.<init>(FileReader.java:72)
at Configuration.parsePackageName(Configuration.java:204)
at Configuration.rootOf(Configuration.java:180)
at Configuration.traverse(Configuration.java:140)

res.java 在这里是目录。android-5.0.0_r1 的 Configuration.java 只检查名字是否以 .java 结尾,就先进入 Java 文件解析分支,因此会把这个目录交给 FileReader。

我当时的临时办法是把 res.java 改名为 res.j。不过直接改 out 下的产物目录可能破坏后续构建依赖,这个办法不建议照搬。针对这个版本,应当修正 traverse() 的文件类型判断:

1
2
- if (path.endsWith(".java")) {
+ if (file.isFile() && path.endsWith(".java")) {

这样目录会继续进入后面的目录遍历分支。修改后重新编译 IDEGen,再生成工程;其他分支先检查实际代码,不能只按旧堆栈的行号打补丁。

后记

使用Android Studio看Android源码很爽,下面是当时使用 Android Studio 1.x 的感受,不作为当前版本的功能评价:

优点

  • 和Android 完美结合
  • 代码提示很全
  • 代码跳转很强
  • IDE比Eclipse好看(我说的是黑色主题)
  • 插件很强大(底层是IDEA你懂得)
  • 免费(SourceInsight负分,啥?你用的破解版? 当我没说)

缺点

  • 对C++代码的支持不是很好
  • 有一定的上手难度

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫

CATALOG
  1. 1. Android Studio
    1. 1.1. 现在如何查看源码
    2. 1.2. 当时选择 Android Studio 的原因
  2. 2. Android 5.0 : Lollipop
  3. 3. 准备工作
  4. 4. 开始(Android 5.0 历史流程)
  5. 5. 问题
    1. 5.1. IDEGen 编译失败
    2. 5.2. 把目录当作 Java 文件读取
  6. 6. 后记
    1. 6.1. 优点
    2. 6.2. 缺点
  • 关于我 && 博客