AOSP代码在线搜索:Code Search
阅读源码的时候,一个痛点就是“迷失在茫茫目录中”:找不到类文件在哪、找不到接口的实现类是哪个、找不到方法在哪实现的。
比如,看Display相关源码,会发现DisplayManagerGlobal中有一个成员IDisplayManager,对源码结构不熟悉的话,一时找不到这个接口实现在哪里。在Android源码目录结构一文中对AOSP的目录有些许的了解,知道这里DisplayManagerGlobal在/frameworks/base/core/java/android/hardware/display/目录下,那么相关的Display系统服务在/frameworks/base/services/core/java/com/android/server/display/目录下。
即便对源码目录结构很了解,也还会“迷失方向”。因为源码在不停的迭代,源文件会迁移、目录结构会发生变化。再比如阅读Power相关的源码,在PowerManager中引用到一个类:OsProtoEnums,但翻遍整个AOSP也找不到OsProtoEnums这个类在哪?
public static final int PARTIAL_WAKE_LOCK = OsProtoEnums.PARTIAL_WAKE_LOCK; // 0x00000001
public static final int SCREEN_DIM_WAKE_LOCK = OsProtoEnums.SCREEN_DIM_WAKE_LOCK; // 0x00000006
....
其实OsProtoEnums类是在/frameworks/proto_logging/stats/enums/os/enums.proto中定义。ProtoBuf是Google开发的一套数据结构序列化方法,可用于通信、存储等方面,这里简单了解一下即可。.proto文件用来描述序列化格式:
syntax = "proto2";
package android.os;
//所导出的类名为OsProtoEnums
option java_outer_classname = "OsProtoEnums";
option java_multiple_files = true;
...
// Wakelock types, primarily used by android/os/PowerManager.java.
enum WakeLockLevelEnum {
PARTIAL_WAKE_LOCK = 1;
SCREEN_DIM_WAKE_LOCK = 6 [deprecated = true];
SCREEN_BRIGHT_WAKE_LOCK = 10 [deprecated = true];
FULL_WAKE_LOCK = 26 [deprecated = true];
PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;
DOZE_WAKE_LOCK = 64;
DRAW_WAKE_LOCK = 128;
}
由protoc工具编译成最终的Java文件,最后生成在.intermediates/frameworks/base/framework-minus-apex-intdefs/android_common/xref33/srcjars.xref/android/os/OsProtoEnums.java目录下,源码中当然找不到:
// Generated by protoc-gen-javastream. DO NOT MODIFY.
// source: frameworks/proto_logging/stats/enums/os/enums.proto
package android.os;
/** @hide */
public final class OsProtoEnums {
...
}
铺垫了这么多,该介绍Google官方推出的Android 开源代码搜索工具:https://cs.android.com/。
搜索和查看源码是基本操作:
支持在整个代码库之间进行交叉引用的代码跳转,这个真的非常方便:
唯一的缺点就是需要“梯子”才能打开,国内暂时还没有镜像网站。如果本地有AOSP源码,用Sourceinsight代码阅读神器本地搜索也是一个办法,只是比较慢。
推荐阅读:
Google 代码搜索
Android 开源项目 (AOSP) 代码搜索工具正式发布
Code Search
Getting started with Code Search
Chromium.org
Google Open Source
精彩的人生需要浪漫、无畏和勇气。