全部博文(86)
分类: LINUX
2010-12-31 17:03:52
概述:
下面将从用户点击使能按钮开始的整个初始化流程跟踪一遍,这样在debug的时候可以
确保gps时候是否真的被初始化好了
======================================================================
当用户空间点击seting下的gps使能按钮的时候,会调用函数到:
frameworks/base/location/java/com/android/internal/location/GpsLocationProvider.java
这时会调用构造函数:
public GpsLocationProvider(Context context, ILocationManager locationManager) {
……………………………………
mThread = new GpsLocationProviderThread();
mThread.start();
…………………………………….
}
}
}
在构造函数中会创建一个线程,
会实例化一个消息处理对象: mHandler = new ProviderHandler();
private final class ProviderHandler extends Handler {
@Override
public void handleMessage(Message msg)
{
switch (msg.what) {
case ENABLE:
if (msg.arg1 == 1) {
handleEnable();
} else {
handleDisable();
}
break;
case ENABLE_TRACKING:
handleEnableLocationTracking(msg.arg1 == 1);
break;
………………………………………………….
}
}
};
那么线程和消息处理对象都ok后,进入的函数是:
public void enable() {
synchronized (mHandler) {
mHandler.removeMessages(ENABLE);
Message m = Message.obtain(mHandler, ENABLE);
m.arg1 = 1;
mHandler.sendMessage(m);
}
}
通过mHandler.sendMessage(m); 发送一个enable消息,接收消息方接收到enable消息后,
调用函数handleEnable():
private void handleEnable() {
if (DEBUG) Log.d(TAG, "handleEnable");
if (mEnabled) return;
mEnabled = native_init();
……………………………………….
mEventThread = new GpsEventThread();
mEventThread.start();
} else {
Log.w(TAG, "Failed to enable location provider");
}
}
NOTE:hanleEnable实际上做了两件事情:
通过native_init 调用jni接口初始化gps的相关数据结构
通过mEventThread = new GpsEventThread();创建事件监听线程来监听gps来自hal层的事件
下面分别对以上两点做详细的跟踪:
对第一点native_init,进入函数
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
实际上调用的是函数android_location_GpsLocationProvider_init():
static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)
{
android_location_GpsLocationProvider.cpp(android_location_GpsLocationProvider_init)");
if (!sGpsInterface)
sGpsInterface = gps_get_interface();
if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0)
return false;
………………………………………………………
return true;
}
这个函数主要是干两件事情:
填充sGpsInterface方法,通过调用函数gps_get_interface,这个函数在
hardware/libhardware_legacy/gps/gps.cpp
调用流程是:gps_get_interface=> gps_find_hardware=> gps_get_hardware_interface=>
sLocEngInterface
实际上sLocEngInterface就是static const GpsInterface的一个实例而已,里面实现gps
所有操作的方法:
loc_eng_init,
loc_eng_start,
loc_eng_stop,
loc_eng_cleanup,
loc_eng_inject_time,
loc_eng_inject_location,
loc_eng_delete_aiding_data,
loc_eng_set_position_mode,
loc_eng_get_extension,
执行完这步,实际上就是将gps可能用到的所有方法都初始化好了。
执行sGpsInterface->init(&sGpsCallbacks),这里实际上执行就是loc_eng_init,这个方法,
这个方法的关键代码如下:
static int loc_eng_init(GpsCallbacks* callbacks)
{
……………………………………………
loc_api_glue_init();
……………………………………..
memset(&loc_eng_data, 0, sizeof (loc_eng_data_s_type));
loc_eng_data.location_cb = callbacks->location_cb;
loc_eng_data.sv_status_cb = callbacks->sv_status_cb;
loc_eng_data.status_cb = callbacks->status_cb;
loc_eng_data.nmea_cb = callbacks->nmea_cb;
……………………………………..
}
该函数实现两个功能:
通过loc_api_glue_init();实现的功能是创建一个与ARM9 rpc通讯的通道,这部分内容比较多,在数据流程的文件里面分析。
通过loc_eng_data.location_cb = callbacks->location_cb;将jni实现的方法注册到hal层,那么在hal调用相关函数的时候就可以实现hal层与jni的通讯,在数据流程文件里面分析。
回到前面framework层的enable的时候,出料native_init之外,还做了一件事情,就是通过
mEventThread = new GpsEventThread();创建一个监听线程,用来监听底层的事件:
private final class GpsEventThread extends Thread {
public GpsEventThread() {
super("GpsEventThread");
}
…………………………………..
native_wait_for_event();
}
if (DEBUG) Log.d(TAG, "GpsEventThread exiting");
}
}
通过native_wait_for_event()来监听hal来的事件,同样在jni层也有对应的文件去调用
对应的jni的函数是:android_location_GpsLocationProvider_wait_for_event
这个函数的功能如下:
假如在hal层有调用jni到hal层的回调的时候,就会触发该线程运行去拷贝数据,上报事件等原因。
chinaunix网友2011-01-04 15:04:07
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com