IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android 4.4 源码中的关键代码路径

    grumoon发表于 2014-08-05 11:13:25
    love 0

    最近再看Android的源码,也就是看看,和资料或者书籍相互印证一下,暂时还没有编译的冲动。

    先吐槽一下下载源码的过程,直接用repo sync下载的最新的4.4的源代码,用长城宽带加VPN,下载源码,16个G左右吧,下载了有一周的时间,中间经常是20多K的速度,vpn还经常断。白天还好,晚上经常是下一晚上,早上一醒发现vpn是断的,那个郁闷啊。

    各种大牛写的资料上都会引用一些源码,我需要找到这些源码才能查看并且相互印证,也可能是各家资料或者源码的版本的不同,感觉路径比较混乱,现在将我学习过程中找到的关键源码的路径贴出来,权当做个备份记录查看。


    以下路径依据Android 4.4源码

    我按照启动的顺序贴出路径来吧(主要是贴出了关键代码的位置,基本上都是有main方法的文件位置,至于代码中调用的其他代码位置,Ctag可以比较方便的找出)

    首先是init

    system/core/init/init.h

    system/core/init/init.c


    然后是init.rc文件

    system/core/rootdir/init.rc

    system/core/rootdir下面还有其他的init.rc的文件


    init.rc中一些主要Daemon进程的源码位置

    ueventd:system/core/init/ueventd.c

    logd:system/core/logd/main.cpp

    adbd:system/core/adb/adb.c

    vold:system/vold/main.cpp

    netd:system/netd/main.cpp

    rild:hardware/ril/rild/rild.c

    servicemanager:frameworks/native/cmds/servicemanager/service_manager.c

    surfaceflinger:frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

    media:frameworks/av/media/mediaserver/main_mediaserver.cpp

    media中会启动一些native的service

    AudioFlinger:frameworks/av/services/audioflinger/AudioFlinger.cpp

    MediaPlayerService:frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

    CameraService:frameworks/av/services/camera/libcameraservice/CameraService.cpp

    AudioPolicyService:frameworks/av/services/audioflinger/AudioPolicyService.cpp


    最后当然是大名鼎鼎的zygote:frameworks/base/cmds/app_process/app_main.cpp

    还有就是AndroidRuntime: frameworks/base/core/jni/AndroidRuntime.cpp


    然后是开始是java层面的东西啦

    ZygoteInit:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    SystemServer:frameworks/base/services/java/com/android/server/SystemServer.java


    接着是SystemServer启动的服务

    本地服务

    jni对应的native代码:frameworks/base/services/jni/com_android_server_SystemServer.cpp

    看到android 4.4中 只可能加载的本地服务为SensorService:frameworks/native/services/sensorservice/SensorService.cpp


    java服务

    我们在应用层编程用到的大多数的系统服务都是在这里启动

    启动后,通过jni方法注册到ServiceManager中

    这里只取几个典型的服务写出路径

    WindowManagerService:frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

    ActivityManagerService:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

    InputManagerService:frameworks/base/services/java/com/android/server/input/InputManagerService.java

    ConnectivityService:frameworks/base/services/java/com/android/server/ConnectivityService.java

    PowerManagerService:frameworks/base/services/java/com/android/server/power/PowerManagerService.java

    AlarmManagerService:frameworks/base/services/java/com/android/server/AlarmManagerService.java


    BluetoothManagerService:frameworks/base/services/java/com/android/server/BluetoothManagerService.java

    WifiService:frameworks/base/services/java/com/android/server/wifi/WifiService.java


    SystemServer将需要加载的服务启动好后,就该通知ActivityManager启动我们的Home应用啦

    也就是Launcher了

    代码路径是packages/apps/Launcher2/src/com/android/launcher2/Launcher.java



    以上就是差不多的一些关键代码的路径,根据这些关键代码,顺藤摸瓜,基本上能很方便的找到我们需要的代码


    以下总结是我个人的观点,如果有错误,希望大牛们指出

    4.4中的代码中

    SystemServer.java中,启动本地代码的方法改为了 nativeInit(),不再是init1

    System.loadLibrary("android_servers");
    Slog.i(TAG, "Entered the Android system server!"); 
    // Initialize native services.
    nativeInit();
    

    关键是对应的jni方法中

    frameworks/base/services/jni/com_android_server_SystemServer.cpp

    static void android_server_SystemServer_nativeInit(JNIEnv* env, jobject clazz) { 
          char propBuf[PROPERTY_VALUE_MAX];
          property_get("system_init.startsensorservice", propBuf, "1");
          if (strcmp(propBuf, "1") == 0) {
              // Start the sensor service
              SensorService::instantiate();
          }
     }

    基本上只有可能启动SensorService了


    也就是说android 4.4中 更多的本地服务是通过

    1. init.rc来启动,例如surfaceflinger

    2. 通过init启动的Media进程来启动,例如AudioFlinger,CameraService等










沪ICP备19023445号-2号
友情链接