i.MX8 系列 | Android 平臺 GPS 啟動流程分析

2021-02-14 飛車俠

上一篇博文中,我們已經跟大家分享了如何在 i.MX8QM Android 上實現 GPS 地圖導航功能,本文我們將持續跟大家分享關於 i.MX8QM 系列相關的內容:分析 i.MX8QM Android 平臺上 GPS 啟動流程。本文我們將用到的軟硬體分別是:

    硬體平臺:IMX8QMMEK EVM BOARD

    軟體環境:IMX-P9.0.0_2.1.0-AUTO-GA

系統在啟動後會首先啟動 LocationManager,這項服務是在 SystemServer.java 中啟動的,對應到的代碼如下圖所示,

frameworks/base/services/java/com/android/server/SystemServer.java

調用到 LocationManagerService 函數,

frameworks/base/services/core/java/com/android/server/LocationManagerService.java

然後再來看看 systemRunning 函數,

frameworks/base/services/core/java/com/android/server/LocationManagerService.java

這裡調用到 loadProvidersLocked 函數,同樣在 LocationManagerService.java 文件下,

這裡可以看到 GnssLocationProvider.isSupported 函數,主要就是通過這個函數來檢測 GPS 位置服務是否準備就緒,isSupported 函數如下,

frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java

接著是進入到 JNI 函數,android_location_GnssLocationProvider_is_supported,

frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp

這裡會判斷 gnssHal 的值是否存在,如果存在則返回值為 true。

這裡還有一個重要的函數,初始化 service 對象,HIDL_FETCH_IGnss,

hardware/interfaces/gnss/1.0/default/Gnss.cpp

這裡通過 hw_get_module 方法,獲取到對應模塊的 so 庫

hardware/libhardware/hardware.c

對應 PATH 定義如下,這裡使用的是 64 位的,只要將對應的 so 文件放到對應的 /vendor/lib64/hw 目錄下即可,

接下來執行了 open 函數,module->methods->open,這裡就會執行 gps module 裡面的 open_gps 函數,

hardware/libhardware/modules/gps/gps.c

在之後,使用 hw_device_t 結構體構建出 gnss 服務對象,gnss 的初始化方法中會調用 dev 的 get_gps_interface 方法,獲取 hal 的方法接口對象,

hardware/interfaces/gnss/1.0/default/Gnss.cpp

到這裡,GnssLocationProvider.isSupported 函數就已經執行完畢,我們獲取到了 GPS 的接口,如果找到 GPS 硬體,那麼就會繼續往下執行 GnssLocationProvider 函數

在構造完 GpsLocationProvider 之後將其 add 到全局變量 ArrayList mProviders 中,備以後調用。

然後啟動了 Geocoder Provider, Network Location Provider 和 Fused Location Provider 三個 service。

執行完 loadProvidersLocked 函數之後回到 systemRunning 函數繼續執行 updateProvidersLocked 函數,

frameworks/base/services/core/java/com/android/server/LocationManagerService.java

依靠前面的代碼我們可以推測在 mProviders 裡面應該存在一個 gpsProvider 和 PassiveProvider,而 gpsProvider 是未被 enable 的。而 passiveProvider 是 enable 的。

這邊我們對 gpsProvider 進行討論,他執行的是 updateProviderListenersLocked(name,true) 然後當有發生改變,就是 changesMade=true 時,它發送了廣播,內容是告訴大家 LocationManager 發生了變化,讓需要的接收者自己接收。

繼續跟進 updateProviderListenersLocked(name,true)函數

這邊我們看 if(enable)內的主題部分。enable 為真, 則啟動了 GPS 服務。然後執行 p.enable() 函數。

frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java

我們看到 enable 函數中只是調用了 sendMessage。跟進函數,可看到 sendMessage 函數獲取 mWakeLock,然後發送給 mHandler。

收到消息後,Hnadler 會自動去調用 handleMessage 去處理收到的消息。

根據構造的消息,這裡將執行 hanleEnable()

這邊 handleEnable 函數主要做了兩件事。

1. 調用 JNI 層的 native_init() 方法去初始化 GPS。

2. 試圖啟動 agps 服務。

native_init() 方法實現如下:

frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp

完成初始化操作之後,gnssHal 的值為非空,通過判斷 gnssHal 的值來確定是否初始化成功。

以上就是關於 i.MX8QM Android 平臺上 GPS 啟動流程分析說明。

接下來我們也會不斷更新更多關於 i.MX8 系列的開發博文,同時我們也會持續推出更多 ADAS 相關(S32V234、Hi3566V100、Hi3559AV100、Hi3518EV300、硬體、軟體、算法等)的技術開發博文,如需更深入的技術交流,歡迎在關注給我留言。

【參考資料】:

1.  GPS 研究二(Android 2.3__gingerbread)

2. Android 2.3 gps 啟動流程

3. hidl

大聯大旗下世平集團  ATU 部門可以提供相關設計方案和技術支持,需要請聯繫 atu.cn@wpi-group.com

相關焦點

  • Android系統啟動流程(四)Launcher啟動過程與系統啟動流程
    :Launcher的啟動流程,並結合本系列的前三篇文章的內容來講解Android系統啟動流程。建議讀這篇文章前要通讀本系列的前三篇文章,否則你可能不會理解我在講什麼。1.Launcher概述Android系統啟動的最後一步是啟動一個Home應用程式,這個應用程式用來顯示系統中已經安裝的應用程式,這個Home應用程式就叫做Launcher。
  • 安卓系統應用啟動流程分析
    本文簡要介紹安卓系統上應用啟動流程,對於應用開發、系統定製以及性能優化人員來說,熟悉應用啟動流程會使得在今後的工作中更加得心應手,做到知其然,知其所以然。本文主要面向開發人員,假定讀者已有一定的安卓基礎。本文以安卓P版本為基礎,不同安卓版本上應用啟動流程略有差異,但核心邏輯仍然一致。
  • 安卓10源碼開發定製(21)GPS定位研究(3)修改GPS定位數據測試app gps定位代碼
    由於室內gps信號被擋住了,所以如果需要測試gps定位的代碼,要麼跑到室外去等待gps定位更新或者使用安卓sdk中提供的"MOCK_LOCATION"功能編寫額外的測試代碼來模擬gps位置更新。如果從系統定製的角度出發,也可以根據gps上報的流程來模擬gps上報的邏輯實現模擬gps 的定位數據。
  • 【移動安全】Android程序分析入門
    前言分析Android程序是開發Android程序的逆過程,要想分析一個Android程序,首先應該了解其開發流程、程序結構、語句分支和解密原理等。xml version="1.0" encoding="utf-8"?
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • android關閉開機啟動 - CSDN
    ,還有就是檢查是否是還在開機階段然後結束開機流程。Message,隨後調用PhoneWindowManager的systemBooted方法,通知keyguard進行相關動作,最後也是我們這次分析的重點,進行performEnableScreen。
  • (第六講)分析你的第一個 Android 程序 3
    1x0 從 AndroidManifest.xml 入手我們已經知道了項目的結構,那麼下一步就按照應用程式運行的流程來分析吧。你在手機上點擊 apk 文件後,會打開軟體包安裝程序。軟體包安裝程序會讀取 apk 中的 AndroidManifest.xml 文件,從裡面分析出軟體的名字 版本還有各種權限,然後展示給用戶,用戶確定安裝後就會交給框架程序來真正完成安裝。
  • 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程
    今天痞子衡給大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程。從外部串行NOR Flash啟動問題是i.MXRT系列開發最高頻的話題,無論是開發調試XIP應用程式階段還是最終產品量產階段都繞不開NOR Flash選型以及為它設計一個匹配的FDCB配置塊。
  • Android.KungFu系列病毒變種深度分析及完全清理方法
    下面,筆者就為大家分析一款目前流行的惡意軟體--Android.KungFu系列變種,並且介紹針對這一病毒的解決方案。  病毒介紹  Android.KungFu最早在6月份被安全廠商截獲,隨後又出現了至少3種不同的變種,截止到發文為止,這款病毒仍然在不斷演化。
  • 深入研究源碼:Android10.0系統啟動流程(三):Zygote
    這些問題我們在接下來的源碼分析中來找找答案具體源碼分析Zygote進程是如何被啟動起來的我們首先來看下,Zygote進程是如何被啟動起來的我們還是首先從init.rc中引用的zygote.rc中入手來看,源碼中是找不到的,我們從編譯好的文件中找
  • Android 8.0 LinearLayout 源碼解析
    measureVertical 方法還是很長的,不過整個過程可以分為三個階段,為了分析的比較清楚,我們也分階段循序漸進的分析1. 聲明變量在 measureVertical 開始之前,需要初始化一些類變量 & 聲明一些重要的局部變量,重要的變量我都有注釋。
  • android 從後臺啟動頁面專題及常見問題 - CSDN
    這三個Tesseract語言包合起來約有70M左右,APK文件中拷貝語言包到手機存儲中需要幾秒時間,所以我們做了一個啟動頁面,在為用戶展示App第一印象的同時,後臺拷貝這三個語言包。經過比較,知乎日報的啟動頁面有從中心點展開逼進用戶的效果,我們決定利用此效果來設計啟動頁面。最終效果如圖所示:
  • Android插件化系列三:技術流派和四大組件支持
    Hello,各位朋友們,我們繼續插件化系列的學習吧。下面是我這個系列文章的行文思路,本篇文章是本系列比較核心的一篇文章,我計劃這篇文章把插件化的大體技術給講清楚。期間會涉及到系列的前兩篇文章的內容,推薦先閱讀前面的兩篇基礎文章Android插件化系列一: 開篇前言,Binder機制,ClassLoader和Android插件化系列二: 資源與打包流程本篇文章預計需要半小時以上時間閱讀。讀完本篇文章,你將會了解:1.插件化的發展和流派2.插件化技術1.發展歷史和流派先稍微介紹一下插件化的發展歷史。
  • Android手機當GPS用,SECTION_GPS V1.1.1228更新
    如果你需要詳細了解section_gps各種功能和下載最新版本,請加人section討論群:SECTION-QQ超級群1: 39465904 未滿,網友建,需要推薦加入SECTION-QQ超級群2: 77607622 已滿,天鷹建,需要推薦加入SECTION-QQ超級群3: 8292866  未滿,網友建,需要推薦加入
  • 某Android模擬器的廣告植入分析
    它是帶反調試的,使用x64dbg啟動,會直接帶調試器一起退出,添加了兩項後,可以繼續:定位到上面的代碼,並且發現它在加載文件launchConfig.data,打開看看內容:看上去是去遠端獲取遊戲資源的配置項(連接可以加載打開看)。先把這部分bypass後再看看功能,發現啟動還是有廣告。
  • Android系統啟動流程(三)解析SyetemServer進程啟動過程
    frameworks/base/core/java/com/android/internal/os/ZygoteInit.java在startSystemServer函數中調用handleSystemServerProcess來啟動SyetemServer進程。2.SyetemServer進程啟動過程handleSystemServerProcess函數的代碼如下所示。
  • 破解第一個Android程序
    在實際分析中,還可以使用IDA Pro直接分析APK文件,使用dex2jar與jd-gui配合進行Java源碼級的分析等。這些分析方法會在本書後面的章節中詳細介紹。反編譯APK文件ApkTool是一款常用的跨平臺APK文件反編譯工具,可以在Windows、macOS和Ubuntu平臺上使用。
  • Android Systrace 基礎知識(9)-MainThread 和 RenderThread 解讀
    文章會從 Systrace 的角度來看 MainThread 和 RenderThread 的工作流程,以及涉及到的相關知識:卡頓、軟體渲染、掉幀計算等本系列的目的是通過 Systrace 這個工具,從另外一個角度來看待 Android 系統整體的運行,同時也從另外一個角度來對 Framework 進行學習。
  • Android深入四大組件(六)Android8.0 根Activity啟動過程(前篇)
    前言在幾個月前我寫了Android深入四大組件(一)應用程式啟動過程這篇文章,它是基於Android 7.0的,當我開始閱讀Android 8.0源碼時發現應用程式(根Activity)啟動過程照Android 7.0有了一些變化,因此又寫下了本篇文章,本篇文章照此前的文章不僅流程發生變化,而且增加了一些分析,算是升級版本。
  • Android自定義View入門及實戰案例分析
    繪製流程函數調用關係如下圖:xml version="1.0" encoding="utf-8"?0;i<n;i++){                        int attr = a.getIndex(i);                        switch (attr) {                        case R.styleable.myView_text:                                break