百度導航填坑記

為了共產主義事業,我們在項目中增加了導航的需求,讓在路上的土豪不再迷失茫茫霧海中,為了跟上IOS同仁奮斗的腳步,于是乎,我們也選擇了百度導航用在Android機子上。

百度一下百度導航,我在百度家茫茫產品中找到了LBS。人家提示你需要一個AK,于是拿著簽名獲取到SHA1值,再用包名,生成了一個AK值。然后呢,我就在公司灰常灰常“快”的網絡中下載百度導航SDK|DOC|DEMO。一天以后,我終于看到了一個完整的壓縮包。說時遲那時快,我右手一頓猛點,解壓到當前文件夾。

二話不說,真奔DOC去,打開一看,全是.html,找到index.html打開,活生生的API文檔映入眼簾,我想說我看不懂。
然后呢,我就老老實實的看Demo。發現就倆Activity,第一個Activity放上四個按鈕,設置下點擊事件,就是各種百度導航的API。時間緊,任務重。代碼一通拷貝到項目中,不看廣告,看療效。是騾子是馬,跑起來看看。我這一看,原本6、7MB的安裝包激增到20多MB,然后看看了IOS那邊,三圍也是不小,我就放心了。

既然沒法改變,于是只能好好享受了。東西按照文檔說明,全丟在了項目里。根據官方文檔,現在只提供了armeabi。既然這樣,我只能把其他目錄比如armeabi-v7a、arm64-v8a目錄給刪掉了,防止比如說64位處理器的機子會在arm64-v8a這個目錄下加載對應的so文件。jniLibs搞定了,繼續往下搞。看到assets目錄下還有三個不知名的文件,倆后綴名.png的文件,一個名曰channel的文件。后來才知道這好幾兆的png文件原來是偽裝過的資源文件。把后綴名改成.zip后見真章。

BaiduNaviSDK_Resource_3.2.0.png

全部搞好后,跑起來看看效果唄。

不管用沒有反應看LOG:library "libgnustl_shared.so" not found .

于是乎百度、Google齊上陣,還有百度導航的論壇,大概的意思就是說jniLibs文件夾只保留armeabi目錄,其余的全刪除。。。這個我最開始就做到了呀!!!還想怎樣~

繼續找,有人說把armeabi改成armeabi-v7a就好了,死馬當活馬醫唄,說改就改。
改完之后奇跡出現了,試了好多臺機器,都可以。。。然后就高興了,興奮了,順手抓過一臺三星s6跑一下,沒反應~看LOG,又是同樣的問題。我想著s6這尼瑪也是高端機器了,我換成arm64-v8a試試,然后,輸出的LOG變了,說libgnustl_shared.so這貨是32位的,不能給64位的用。當時用的是三星s6 系統是6.0,我又考慮是不是系統版本的事,于是拿了一個華為Mate7、系統6.0測試,完全可以用,最后還在一個三星Note5上跑了一下,還是不行。。。

于是我又在想,是不是三星的機子上沒有把這.so文件打到apk中,又是一通搜索這方面的問題,無疾而終,郁郁寡歡,真TM的坑。。。

在這個時候,我突然想起了自帶DEMO,我在三星機器上跑起來,完全沒問題,其余機器上也完全OK。。。人家的DEMO是可以的,問題還是處在自己身上。

既然DEMO沒問題,根據查詢后的種種,比如說會提到極光推送和百度導航沖突的問題。那么,我就把項目中引用的第三方(包括jar包,以及通過gradle引如的)拷貝到DEMO中,然后就是三星機子又不行了,其他機子依然堅挺。

于是可以肯定,這問題和第三方有關。我就一個個的注釋,看一下到底是哪出現的問題。最后發現,我在項目中引入了一個移動端bug管理:bugtags(幸虧不是和極光推送出現沖突)。把bugtags去掉,導航就神奇的好使了。

導航問題已解決。。。新問題接著就來了。。。定位又出幺蛾子了。

順便吐槽一下,百度這SDK,單獨下載導航的SDK和單獨下載定位的SDK,有可能會沖突,最好去平臺上選擇定位和導航,一起下載。

在做定位時,百度api里提供了四種枚舉類型的經緯度,比如GPS,百度墨卡,百度經緯度以及國測。我在糾結使用哪種類型,不如參考下IOS同仁使用的那種。IOS竟然只提供了兩種枚舉,我該如何是好。那就問一下服務端,導航終點的經緯度是使用的哪種類型唄。服務端告訴我,目的地的經緯度是手動維護的。。。最后,多次比較后出發地我選擇了百度經緯度,目的地選擇了GPS。

定位做好了,又在不同的測試機上測試,問題出現了。
試了幾個系統5.0下的機子上,輸出的錯誤日志上一直提示:com.baidu.location.f找不到, NoClassDefFoundError 。

定位Service

測試了幾個都是5.0以下的機子才會出現這個問題。首先想到的Android5.0下方法數超過65535,是不是要做分包。之前沒做過分包,又看了下關于分包的東西,包括google官方推薦的multiDex,以及使用Gradle、Ant做分包。。。看的不夠詳細。。。嘗試著做了下分包,發現完全沒有效果。又去看了下生成的apk文件,里面躺著的有且僅有一個dex文件,并沒有出現第二個Dex。痛定思痛,找到一個Gradle插件,輸出了下項目中目前的方法數,4w多,還有2w多個可用呢。

為什么?

難道還是jar包沒有打入apk。。。

依然不是。

目前這個問題依然沒有頭緒。

官方Demo中設置Option

又是實在沒有辦法里,開始嘗試注釋代碼。把上圖中initLocation()方法注釋掉后,奇跡再次出現,徹底好了。

于是,我就把方法中Option設置逐條注釋,最后發現了兩個罪魁禍首。。。

全劇終。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容