AOSP代码在线搜索:Code Search

Quibbler 2022-4-29 1173

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


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com