2013年12月9日 星期一

[Android]IPC - sensorManager

在AP的部分,這個檔案裡面
G:\packages\apps\Settings\src\com\android\settings\fuelgauge\PowerUsageSummary.java
需要用到SensorManager
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

在framework資料夾裡面有一個XxxManager.java就會有一個對應的XxxManagerService.java
例如PowerManager
proxy就是/frameworks/base/core/java/android/os/PowerManager.java
stub就是/frameworks/base/services/java/com/android/server/PowerManagerService.java

Service在Android框架裡的角色是「存取底層硬體」


\frameworks\base\core\java\android\app\ContextImpl.java
裡面的
public Object getSystemService(String name) {
會去比對妳是哪個manager,如果你是SensorManager
它會return getSensorManager();

private SensorManager getSensorManager() {
裡面,她會去new一個SensorManager
mSensorManager = new SensorManager(mMainThread.getHandler().getLooper());
然後實作在
\frameworks\base\core\java\android\hardware\SensorManager.java
裡面的建構式
public SensorManager(Looper mainLooper) {



\frameworks\base\core\jni\android_hardware_SensorManager.cpp
裡面有
int register_android_hardware_SensorManager(JNIEnv *env)
{
    return jniRegisterNativeMethods(env, "android/hardware/SensorManager",
            gMethods, NELEM(gMethods));
}
看到jni小寫開頭的就會到AndroidRuntime裡面去
\frameworks\base\core\jni\AndroidRuntime.cpp
註冊
static const RegJNIRec gRegJNI[] = {
   REG_JNI(register_android_hardware_SensorManager),
要在gRegJNI[] array裡面填入妳要註冊的東西


還有sensors_module_init在G:\frameworks\base\core\jni\android_hardware_SensorManager.cpp
static JNINativeMethod gMethods[] = {
    {"nativeClassInit", "()V",              (void*)nativeClassInit },
    {"sensors_module_init","()I",           (void*)sensors_module_init },
上面這是JNI mapping table
左邊是JAVA最後一支,右邊是C code第一支

有關mapping table會有兩個地方
一個在framework裡面,user自己寫的放這邊
一個在Dalvik VM裡面,也就是AndroidRuntime,android自己寫的放這邊

AndroidRuntime是由Dalvik VM + core lib所組成
上面的API都會經過Dalvik VM來check是否要進入c code
如果前面有native字眼的,就是會
它有個名稱叫做native method

所有java process都由一個叫zygote process去fork出來的
包含system server和JAVA AP
不是JAVA的,就是Daemon,也就是純C的,在zygote前面(比較靠近kernel的)

那像上面的mapping table,Daemon沒有,只有java process有

沒有留言:

張貼留言