当前位置: 代码迷 >> Android >> Android 4.4 源码中的关键代码途径
  详细解决方案

Android 4.4 源码中的关键代码途径

热度:38   发布时间:2016-04-28 04:23:16.0
Android 4.4 源码中的关键代码路径

最近再看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等








  相关解决方案