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