手機(jī)定位折騰記(1):安卓手機(jī)的網(wǎng)絡(luò)定位與NetworkLocation.apk前言 從蘋果、安卓等智能手機(jī)快速普及的那一天起,由于國(guó)內(nèi)各種特別的行情,有關(guān)手機(jī)定位的問題一直困擾著普通用戶和開發(fā)者。比如,安卓手機(jī)為什么總不能使用網(wǎng)絡(luò)定位?NetworkLocation.apk是什么?為什么外國(guó)app的地圖顯示出來的總是偏移的?本文試圖以回答這些問題,給普通用戶和開發(fā)者(尤其是移動(dòng)開發(fā)者)一些指引,并且提出一些自己的思考。由于本人并非GIS從業(yè)者,所以也許會(huì)有錯(cuò)漏,敬請(qǐng)指正。
本文閱讀人群:
================================================ 如果是安卓手機(jī)/平板的深度使用用戶,必定會(huì)對(duì)許多手機(jī)定位(尤其是冷啟動(dòng)定位)的速度不敢恭維、甚至說基本是廢的(除了某些專用于導(dǎo)航的安卓設(shè)備);雪上加霜的是,由于各種行情,手機(jī)中的網(wǎng)絡(luò)定位許多也不能正常工作的。論壇上各種標(biāo)榜“秒定”(秒速定位)的rom隨處可見,究竟是如何做到的? 這系列的第一篇,主要講的是安卓系統(tǒng)中,網(wǎng)絡(luò)定位的那些事情。在此之前,先對(duì)全系列的一些要點(diǎn)提前解讀。 GPS、GLONASS、北斗和GNSS 說起定位,大家第一時(shí)間聯(lián)想到的是美國(guó)的GPS。但實(shí)質(zhì)上,俄羅斯的GLONASS、中國(guó)的北斗、歐盟的Galileo等也在做一樣的事情。其實(shí),他們都同屬GNSS(Global Navigation Satellite System、全球?qū)Ш叫l(wèi)星系統(tǒng))的領(lǐng)域下。
一些GNSS的簡(jiǎn)要介紹如下:
現(xiàn)在集成GPS + GLONASS的雙GNSS定位芯片和設(shè)備已經(jīng)成為了某些設(shè)備的新賣點(diǎn),比如小米手機(jī)2[2]、Garmin eTrex 30[3]等。展望未來,混搭GNSS會(huì)是主流方向(甚至已經(jīng)出現(xiàn)了MT3332/MT3333五合一方案[4]),有GIS從業(yè)者也提出應(yīng)該讓“GNSS”取代“GPS”成為新的定位名詞[5]。 但是…….鑒于當(dāng)前許多設(shè)備還是基于GPS芯片和系統(tǒng)運(yùn)行,許多用戶還是更熟悉“GPS”而不是“GNSS”這個(gè)名詞,故而下面,也就只講述GPS和與之相關(guān)的定位技術(shù)了。 網(wǎng)絡(luò)定位、A-GPS和GPS的關(guān)系 要討論安卓智能手機(jī)的定位,一定離不開三個(gè)詞:網(wǎng)絡(luò)定位、A-GPS和GPS。他們之間的關(guān)系如下:
以上的關(guān)系,后面再展開闡述。現(xiàn)在進(jìn)入本文的主題:網(wǎng)絡(luò)定位。 網(wǎng)絡(luò)定位簡(jiǎn)介 在安卓的設(shè)置中,“網(wǎng)絡(luò)定位”是指利用手機(jī)基站信息、wifi信息等發(fā)送到指定的位置服務(wù)器;位置服務(wù)器接收后,直接返回粗略的經(jīng)緯度和精度信息。整個(gè)過程中其實(shí)就是“根據(jù)IP地址獲取地址”的高級(jí)版,而且手機(jī)端無(wú)需定位衛(wèi)星的信號(hào),做到低耗電定位(所以說,網(wǎng)絡(luò)定位的本質(zhì),其實(shí)和GPS乃至AGPS都沒什么關(guān)系)。 (網(wǎng)絡(luò)定位在HTML5的例子, 手機(jī)點(diǎn)此鏈接訪問該頁(yè)面 ,可測(cè)試網(wǎng)絡(luò)定位是否正常) 從上面可以看到,要實(shí)現(xiàn)網(wǎng)絡(luò)定位,位置服務(wù)器是必須的,但這部分一般都在地圖資源商的手中,手機(jī)/平板制造商不可能有這種資源。他們只能通過和地圖資源商進(jìn)行商務(wù)合作或者取得授權(quán),才能夠合法地放入網(wǎng)絡(luò)定位的相關(guān)底層應(yīng)用和分發(fā)使用權(quán),否則會(huì)被視為侵權(quán)使用。國(guó)內(nèi)常見的網(wǎng)絡(luò)定位目前有兩種: (1)Google GMS(Google Mobile Service)中的網(wǎng)絡(luò)定位服務(wù)(許多人可能更加熟悉NetworkLocation.apk)。但國(guó)內(nèi)行貨由于眾多原因,目前沒有一家通過GMS認(rèn)證,所以一定不會(huì)有這個(gè)服務(wù)(換句話講,也不會(huì)有這個(gè)文件)。即使有,其實(shí)也是在灰色使用狀態(tài),不能太聲張——之前曾有一次,小米放入這個(gè)文件,結(jié)果引發(fā)同行批評(píng)[7]。也有rom制作者與刷機(jī)發(fā)燒友等嘗試自行刷入這個(gè)GMS的網(wǎng)絡(luò)定位,這部分遇到的技術(shù)問題下文再表。 (2)百度地圖的網(wǎng)絡(luò)定位服務(wù)(一般為NetworkLocation_Baidu.apk或者BaiduNetworkLocation.apk)。目前有部分國(guó)行和部分rom采用。這滿足了國(guó)行不能使用GMS、但又希望使用網(wǎng)絡(luò)定位的需求。至于有沒有坐標(biāo)偏移,手頭沒有機(jī)器,沒有測(cè)試。 網(wǎng)絡(luò)定位的開發(fā)與故障 在應(yīng)用開發(fā)上,要使用網(wǎng)絡(luò)定位,必須要在AndroidManifest.xml申明“android.permission.ACCESS_COARSE_LOCATION”的uses-permission;同時(shí)也要求手機(jī)聯(lián)網(wǎng)完成獲取。 但是如果網(wǎng)絡(luò)定位服務(wù)不存在或者異常,則不會(huì)返回任何信息。典型的情況是,使用HTML5的navigator.geolocation.getCurrentPosition,總會(huì)返回PositionError.code為3的Timeout expired(即超時(shí))。 (注意:網(wǎng)絡(luò)定位服務(wù)不可用并不影響HTML5對(duì)GPS設(shè)備的數(shù)據(jù)讀?。蝗绻鸊PS成功獲取當(dāng)前高精度坐標(biāo)并正常運(yùn)行、且html5代碼申請(qǐng)了enableHighAccuracy: true,則HTML5也能正常讀取GPS的數(shù)據(jù)并顯示) 在底層開發(fā)上,要實(shí)現(xiàn)網(wǎng)絡(luò)定位,不同的安卓版本、甚至不同的機(jī)型都有不同的實(shí)現(xiàn)方式。但 歸根到底都要最終實(shí)現(xiàn)“以Provider+Service方式接入LocationProviderProxy”的目標(biāo),而且相關(guān)接入應(yīng)用必須以platform級(jí)別證書簽名,否則不能運(yùn)行。 從大版本來看,有三大實(shí)現(xiàn)模式,有興趣的開發(fā)者可照附錄一的簡(jiǎn)表自行查看源代碼。 “秒定秘籍”之一:恢復(fù)網(wǎng)絡(luò)定位 恢復(fù)網(wǎng)絡(luò)定位功能,的確可以有秒定的良好感覺,只不過問題是這種秒定的精度并不高,而且設(shè)備還必須聯(lián)網(wǎng)才行。但是怎么恢復(fù)確實(shí)不易,尤其是 處理platform簽名 的問題。以在rom中恢復(fù)Google Mobile Service的網(wǎng)絡(luò)定位為例(這里不考慮侵權(quán)問題,僅作技術(shù)交流),要萬(wàn)無(wú)一失,理論上整體的過程如下: (1)確定安卓版本號(hào),和要恢復(fù)的網(wǎng)絡(luò)定位包(com.google.android.maps.jar/com.google.android.maps.xml/features.xml/GoogleServicesFramework.apk/NetworkLocation.apk等;有些安卓版本還需要SetupWizard.apk等)。 (2)準(zhǔn)備platform級(jí)別的證書(platform.x509.pem,platform.pk8)。如果僅是測(cè)試自用,可以從這里下載: https://github.com/android/platform_build/tree/master/target/product/security
(3)確定/system/framework/framework_res.apk是否和公鑰platform.x509.pem一致。方法是:
(C)對(duì)比platform.x509.pem和CERT_framwwork_public.cer文字是否一致。一致的話,恭喜你,后面的工作省心多了。但一般來講,國(guó)行是用了自己的platform證書簽名的,因此,后面的改動(dòng)就比較大了。 (4)反編譯/system/framework/framework_res.apk,根據(jù)附錄一的“網(wǎng)絡(luò)定位配置表”,找到相關(guān)配置。如果是GMS默認(rèn)的值(這里沒法收集到,可參見其他rom),恭喜你,這里不用改了;如果不是,就得改,然后重編譯并用(2)中的證書簽名。 (5)如果(3)中的對(duì)比結(jié)果為不一致,就必須用(2)中的證書重新簽名/system/framework/framework_res.apk。
(6)按照(3)的步驟分別對(duì)GoogleServicesFramework.apk、NetworkLocation.apk的公鑰和platform.x509.pem進(jìn)行對(duì)比,如果不一致,需要重新簽名。
(7)如果(3)中的對(duì)比結(jié)果為不一致,就必須在/system/app/下進(jìn)行如下操作:
(8)將(1)中網(wǎng)絡(luò)定位包的相關(guān)文件放置到相關(guān)位置 (9)重新打包rom,測(cè)試 從以上可以看到,想要簡(jiǎn)單恢復(fù)網(wǎng)絡(luò)定位,對(duì)于普通用戶來講并不容易,也因此有了各種自制rom。但有些rom作者圖省事,直接將所有apk全部給platform簽名,其結(jié)果會(huì)造成一個(gè)隱患:任何應(yīng)用都有權(quán)讀寫系統(tǒng)敏感區(qū)域了。 另一種方法則是利用國(guó)內(nèi)行貨和海外版行貨使用同一個(gè)platform證書簽名的特性,將海外版行貨的GMS給移植回國(guó)內(nèi)行貨。這種情況,需要一定的運(yùn)氣,以及祈求廠商在國(guó)內(nèi)外的版本上核心改動(dòng)不大。 網(wǎng)絡(luò)定位初始化可用性檢查小工具 為了讓各位自查網(wǎng)絡(luò)定位的簽名是否正常,我做了一個(gè) Android_Location_Provider_Test應(yīng)用 。當(dāng)前只能檢查Android 4.0.x及以下版本的網(wǎng)絡(luò)定位是否初始化正常(沒其他機(jī)器啊親)。不能正常初始化的話,則表明網(wǎng)絡(luò)定位設(shè)置不對(duì)或者簽名有異常,則一定不能工作,如果可以正常初始化,那么表明網(wǎng)絡(luò)定位的簽名沒問題,可以用的概率還是很大的。 (初始化異常,網(wǎng)絡(luò)定位不可用) (初始化正常,網(wǎng)絡(luò)定位可用性比較大) 在Google的網(wǎng)絡(luò)定位中,恢復(fù)Google Service Framework是否就一定可以正常工作呢?現(xiàn)在這個(gè)問題變得復(fù)雜了,由于Google Play的出現(xiàn),Play服務(wù)也橫空出世并成為必裝服務(wù)。如果Google Service Framework、Play服務(wù)和GMS其他應(yīng)用之間應(yīng)用不暢,一樣造成無(wú)法使用。遇到這種情況,Android_Location_Provider_Test應(yīng)用就無(wú)能為力測(cè)試了。至于解決方法,暫時(shí)沒找到…… (可以見到,此時(shí)網(wǎng)絡(luò)定位已經(jīng)由google地圖的GoogleLocationService接管了網(wǎng)絡(luò)定位的核心功能;如果Google Service Framework、Play服務(wù)和GMS其他應(yīng)用之間應(yīng)用不暢,這個(gè)對(duì)話框也無(wú)法出現(xiàn),導(dǎo)致網(wǎng)絡(luò)定位也實(shí)質(zhì)無(wú)法使用) (本文完,下文預(yù)告:《手機(jī)定位折騰記(2):AGPS和GPS》) 附錄一:網(wǎng)絡(luò)定位的底層開發(fā)簡(jiǎn)表 LocationManagerService類重要關(guān)注方法:
網(wǎng)絡(luò)定位配置:
從4.1.x開始,網(wǎng)絡(luò)定位還必須實(shí)現(xiàn)統(tǒng)一指定的Intent Action,否則不予運(yùn)行:
============
[2]小米手機(jī)2: http://www./mi2 [3]Garmin eTrex 30: http://www./products/onthetrail/etrex301Outdoor/ [4]聯(lián)發(fā)科技發(fā)布全球首顆支持中國(guó)北斗衛(wèi)星的五合一全球?qū)Ш叫l(wèi)星系統(tǒng)接收器SoC解決方案(2013-01-28): http://www./_cn/03_news/01-2_newsDetail.php?sn=1094 [5]“應(yīng)該用GNSS全面代替GPS名詞”: http://weibo.com/2154494070/ztN2ZjrsG [6]利用Google接口實(shí)現(xiàn)網(wǎng)絡(luò)定位NetworkLocation(基站定位、WiFi定位): http://my.oschina.net/u/617626/blog/71043
[7]全過程見:
分享
|
|