1 LocationManagerService启动及初始化过程

(1) 在SystemServer.java的startOtherServices中添加LocationManagerService的代码如下:

try {location = new LocationManagerService(context);ServiceManager.addService(Context.LOCATION_SERVICE, location);
} catch (Throwable e) {reportWtf("starting Location Manager", e);
}

(2) 在systemReady中调用systemRunning, 启动LocationManagerService的代码如下:

try {if (locationF != null) locationF.systemRunning();
} catch (Throwable e) {reportWtf("Notifying Location Service running", e);
}

(3) 准备GnssLocationProvider,LocationManagerService的systemRunning函数中会调用 loadProvidersLocked, 其代码如下:

private void loadProvidersLocked() {    // create a passive location provider, which is always enabledPassiveProvider passiveProvider = new PassiveProvider(this);addProviderLocked(passiveProvider);mEnabledProviders.add(passiveProvider.getName());mPassiveProvider = passiveProvider;if (GnssLocationProvider.isSupported()) {// Create a gps location providerGnssLocationProvider gnssProvider = new GnssLocationProvider(mContext, this,mLocationHandler.getLooper());mGnssSystemInfoProvider = gnssProvider.getGnssSystemInfoProvider();......}......
}

(4) GnssLocationProvider的class_init_native方法。

该方法是一个静态方法,会在isSupported方法之前被调用。最终会调用到native函数中:android_location_GnssLocationProvider_class_init_native。
在这个函数中实现对gps.default.so的加载。

static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {int err;hw_module_t* module;.......err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);if (err == 0) {hw_device_t* device;err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);if (err == 0) {gps_device_t* gps_device = (gps_device_t *)device;sGpsInterface = gps_device->get_gps_interface(gps_device);}}if (sGpsInterface) {......}
}

(5) sGpsInterface 接口:

static const GpsInterface sLocEngInterface =
{sizeof(GpsInterface),loc_init,loc_start,loc_stop,loc_cleanup,loc_inject_time,loc_inject_location,loc_delete_aiding_data,loc_set_position_mode,loc_get_extension
};

(6) Others interface:

具体实现请参考:/LINUX/android/hardware/qcom/gps/loc_api/libloc_api_50001/loc.cpp

if (sGpsInterface) {sGpsXtraInterface =(const GpsXtraInterface*)sGpsInterface->get_extension(GPS_XTRA_INTERFACE);sAGpsInterface =(const AGpsInterface*)sGpsInterface->get_extension(AGPS_INTERFACE);sGpsNiInterface =(const GpsNiInterface*)sGpsInterface->get_extension(GPS_NI_INTERFACE);sGpsDebugInterface =(const GpsDebugInterface*)sGpsInterface->get_extension(GPS_DEBUG_INTERFACE);sAGpsRilInterface =(const AGpsRilInterface*)sGpsInterface->get_extension(AGPS_RIL_INTERFACE);sGpsGeofencingInterface =(const GpsGeofencingInterface*)sGpsInterface->get_extension(GPS_GEOFENCING_INTERFACE);sGpsMeasurementInterface =(const GpsMeasurementInterface*)sGpsInterface->get_extension(GPS_MEASUREMENT_INTERFACE);sGpsNavigationMessageInterface =(const GpsNavigationMessageInterface*)sGpsInterface->get_extension(GPS_NAVIGATION_MESSAGE_INTERFACE);sGnssConfigurationInterface =(const GnssConfigurationInterface*)sGpsInterface->get_extension(GNSS_CONFIGURATION_INTERFACE);
}

(7) GPS framework 回调函数库:

 GpsCallbacks sGpsCallbacks = {sizeof(GpsCallbacks),location_callback,status_callback,sv_status_callback,nmea_callback,set_capabilities_callback,acquire_wakelock_callback,release_wakelock_callback,create_thread_callback,request_utc_time_callback,set_system_info_callback,gnss_sv_status_callback,
};GpsXtraCallbacks sGpsXtraCallbacks = {xtra_download_request_callback,create_thread_callback,
};AGpsCallbacks sAGpsCallbacks = {agps_status_callback,create_thread_callback,
};GpsNiCallbacks sGpsNiCallbacks = {gps_ni_notify_callback,create_thread_callback,
};AGpsRilCallbacks sAGpsRilCallbacks = {agps_request_set_id,agps_request_ref_location,create_thread_callback,
};......

2 GPS启动流程

(1) GnssLocationProvider.java里处理GPS启动,关闭请求

@Override    public void handleMessage(Message msg) {int message = msg.what;switch (message) {case ENABLE:if (msg.arg1 == 1) {handleEnable();} else {handleDisable();}break;......}
}

(2) handleEnable里启动native层初始化动作

private void handleEnable() {if (DEBUG) Log.d(TAG, "handleEnable");synchronized (mLock) {if (mEnabled) return;mEnabled = true;}boolean enabled = native_init();if (enabled) {mSupportsXtra = true;} else {synchronized (mLock) {mEnabled = false;}Log.w(TAG, "Failed to enable location provider");}
}

(3) GPS native初始化,即GnssLocationProvider初始化过程:

static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject obj){// this must be set before calling into the HAL libraryif (!mCallbacksObj)mCallbacksObj = env->NewGlobalRef(obj);// fail if the main interface fails to initializeif (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0)return JNI_FALSE;// if XTRA initialization fails we will disable it by sGpsXtraInterface to NULL,// but continue to allow the rest of the GPS interface to work.if (sGpsXtraInterface && sGpsXtraInterface->init(&sGpsXtraCallbacks) != 0)sGpsXtraInterface = NULL;......return JNI_TRUE;
}

(4) Loc_init, 设置framework层回调函数,初始化loc eng,并通过modem接口上电:

static int loc_init(GpsCallbacks* callbacks){int retVal = -1;ENTRY_LOG();LOC_API_ADAPTER_EVENT_MASK_T event;......LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */callbacks->status_cb, /* status_cb */local_sv_cb, /* sv_status_cb */callbacks->nmea_cb, /* nmea_cb */callbacks->set_capabilities_cb, /* set_capabilities_cb */callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */callbacks->release_wakelock_cb, /* release_wakelock_cb */callbacks->create_thread_cb, /* create_thread_cb */NULL, /* location_ext_parser */NULL, /* sv_ext_parser */callbacks->request_utc_time_cb, /* request_utc_time_cb */callbacks->set_system_info_cb, /* set_system_info_cb */callbacks->gnss_sv_status_cb, /* gnss_sv_status_cb */};gps_loc_cb = callbacks->location_cb;gps_sv_cb = callbacks->sv_status_cb;retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL);......if(retVal) {LOC_LOGE("loc_eng_init() fail!");goto err;}loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530);loc_afw_data.adapter->setPowerVote(true);LOC_LOGD("loc_eng_init() success!");err:EXIT_LOG(%d, retVal);return retVal;
}

(5) LocEngInit及msgTask初始化流程:

qcom android GPS 启动流程相关推荐

  1. android gps时间格式,android gps 数据传输流程

    Android GPS数据流程分析 概述: 该文档将介绍android GPS数据流程分析,在debug的时候可以做为数据流的捕捉的参考. ============================== ...

  2. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  3. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )

    文章目录 前言 一.Android 进程 二.Android 应用启动流程 前言 参考 [Android 逆向]Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_a ...

  4. Android开机启动流程

    Android开机启动流程 一.APPS PBL(Application primary boot loader:主引导加载程序) 二.XBL(Extensible boot loader:可扩展引导 ...

  5. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  6. Android开机启动流程简析

    Android开机启动流程简析 (一) 文章目录 Android开机启动流程简析 (一) 前言 一.开机启动的流程概述 二.Android的启动过程分析 (1).总体流程 init简述 Zygote简 ...

  7. Android -- Wifi启动流程分析

    Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了:下面就简单介绍下Android中Wifi的启动流程. 当我在Setting菜单里点击 ...

  8. 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)

    [SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...

  9. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

最新文章

  1. ApplicationEventPublisherAware--待完善
  2. 美国会议员提出“漏洞披露法案” 仍考虑非中立实体授权
  3. 字符流中第一个不重复的字符
  4. java8 多个字段分组_MySQL基础之分组查询
  5. python gui编程框架_工程师必知的几个Python GUI框架
  6. ElementUI el-table 在flex下的宽度自适应问题
  7. #linux进阶#wget
  8. 【sklearrn学习】朴素贝叶斯
  9. java重构三部曲,建构·解构·重构——漫谈批注式阅读三部曲
  10. 诺基亚java闪退_回顾诺基亚N9:诺基亚手机颜值巅峰,却在发布7天后被“放弃”...
  11. TXS0108双向电平转换芯片用于IIC时的问题
  12. 手机测试陨石软件,鉴定陨石真伪的简单测试方法
  13. 魔兽延迟最低的服务器,魔兽世界延迟高怎么回事_魔兽世界延迟高解决方法_玩游戏网...
  14. 直播公司转让,转让直播文网文-网络文化经营许可证
  15. 浙江海發進出口股份有限公司官网上线|LTD五金技术行业案例分享
  16. 苹果icloud文件服务器,你真的会用苹果iCloud吗?这7个隐藏功能,你未必全知道...
  17. Shell脚本导出导入MySQL建表语句
  18. Error: Unable to access jarfile zipkin-server-2.22.2-exec.jar
  19. C语言编程计算差商表,计算方法C语言编程计算方法C语言编程.doc
  20. [译]Unity3D Shader教程(二)HLSL

热门文章

  1. TemplateMethod模板方法模式之应用
  2. 静电防护:消除静电的秘诀!
  3. Java 逻辑分页 和 物理分页(mybatis的分页插件PageHelper)
  4. youxi_玄幻世界2.0
  5. [GRE] ETS官方PPP模考四 错题
  6. Flutter 实现高仿开眼 APP 的页面开发 03
  7. 在大图中随机裁取一副小图,并输出小图中心点像素位置
  8. 河南许昌需要一个游戏后端
  9. 4.2.5 画笔与填充绘图
  10. 几何分布和二项分布有什么区别?