◆陳俁男 曾海杰 莊鎮(zhèn)濤 溫漢清
關(guān)于車輛疏導(dǎo)系統(tǒng)搭建及優(yōu)化研究
◆陳俁男 曾海杰 莊鎮(zhèn)濤 溫漢清
(廣東石油化工學(xué)院 廣東 525000)
隨著社會經(jīng)濟(jì)的發(fā)展,人民生活水平的提高,車輛扎堆寸步難行,這是我國“城市病”的典型癥狀。堵車很大原因是車輛行駛沒有全局規(guī)劃,本項(xiàng)目在高德API下二次開發(fā),設(shè)計并搭建了基于SMM架構(gòu)的車輛疏導(dǎo)系統(tǒng)。本文從軟件技術(shù)出發(fā),完成車輛管理服務(wù)器端的設(shè)計和終端APP開發(fā),再使用相應(yīng)指標(biāo)對該系統(tǒng)進(jìn)行了效率分析與性能檢測。
車輛疏導(dǎo);系統(tǒng)搭建;效率分析
Spring Boot是一個基于Spring框架,可供快速開發(fā),特別適合構(gòu)建微服務(wù)系統(tǒng)。其另外還封裝了各類套件,比如mybatis、hibernate、redis、mongodb等。該框架搭建起來的應(yīng)用,它會嵌入Tomcat、Jetty或者Undertow等服務(wù)器,并且不需要傳統(tǒng)的WAR文件進(jìn)行部署,也就是說搭建SpringBoot項(xiàng)目并不需要單獨(dú)下載Tomcat等傳統(tǒng)的服務(wù)器;同時提供通過 Maven(或者Grandle)依賴的starter,這些starter可以直接獲取開發(fā)所需的相關(guān)包,通過這些starter項(xiàng)目就能JavaApplication的形式運(yùn)行Spring Boot的項(xiàng)目,而無須其他服務(wù)器配置;對于配置,Spring Boot提供Spring框架的最大自動化配置,大量使用自動配置,使得開發(fā)者對Spring的配置盡量減少;此外還提供了一些監(jiān)測、自動檢測的功能和外部配置,與此同時沒有附加代碼和XML的配置要求。
本項(xiàng)目在高德API下二次開發(fā),設(shè)計并搭建了基于SMM架構(gòu)的車輛疏導(dǎo)系統(tǒng),本次設(shè)計是在Windows 平臺下,使用 Spring Boot作為系統(tǒng)的后臺整體基礎(chǔ)架構(gòu),使用Java語言完成終端安卓APP的編寫,項(xiàng)目使用阿里云服務(wù)器部署并上線。系統(tǒng)功能包括車輛報備、車輛定位、路線規(guī)劃、路程反饋等,疏導(dǎo)系統(tǒng)會根據(jù)目的地、出發(fā)地以及路徑策略設(shè)置,為用戶量身設(shè)計出行方案。同時可結(jié)合實(shí)時交通,幫助用戶繞開擁堵路段,提供更貼心、更人性化的出行體驗(yàn)。
后臺采取stringboot+mysql+mybatis搭建服務(wù)器接口,實(shí)現(xiàn)數(shù)據(jù)傳輸及存儲。stringboot來管理整個應(yīng)用中所有對象的創(chuàng)建、初始化、銷毀,及對象間關(guān)聯(lián)關(guān)系的維護(hù)。同時作為 View 層的實(shí)現(xiàn)者,完成用戶的請求接收功能,完成用戶請求的轉(zhuǎn)發(fā)及對用戶的響應(yīng)。mysql是服務(wù)器數(shù)據(jù)庫,MyBatis作為 Dao 層的實(shí)現(xiàn)者實(shí)現(xiàn)對用戶車輛信息、車輛軌跡、信息推送等數(shù)據(jù)庫的增刪改查功能。
APP由主應(yīng)用服務(wù)中間層以及后臺管理系統(tǒng)相配合,通過app、數(shù)據(jù)庫的設(shè)計,以及對服務(wù)器和支付api的引用,實(shí)現(xiàn)一套完整的車輛疏導(dǎo)。終端采取MVP架構(gòu)搭建app框架,使用面向接口編程思想將View層與Model層進(jìn)行完全分離,業(yè)務(wù)代碼和邏輯代碼解耦;主界面UI采用View Pager 嵌套Fragment的方式,進(jìn)行完全lazyLoad,根據(jù)Fragment生命周期的可見性來判斷界面的可見性來加載網(wǎng)絡(luò)數(shù)據(jù),優(yōu)化網(wǎng)絡(luò)api的設(shè)置,減少數(shù)據(jù)解析時間和網(wǎng)絡(luò)訪問時間,提高性能;界面內(nèi)的通信均采用jetpack liveData,以及l(fā)ifecycleHandler進(jìn)行通信,有效防止數(shù)據(jù)丟失及不必要的內(nèi)存泄露;網(wǎng)絡(luò)模塊使用Retrofit加載網(wǎng)絡(luò)數(shù)據(jù),對獲取到的數(shù)據(jù)進(jìn)行解析并序列化,結(jié)合DiskLruCache實(shí)現(xiàn)二級緩存,達(dá)到節(jié)省流量的同時,也能免去重復(fù)地解析數(shù)據(jù)的步驟,提高APP整體的瀏覽流暢度。圖片顯示基于glide做了圖片顯示的優(yōu)化,尤其對gif圖片的優(yōu)化,在原生基礎(chǔ)上進(jìn)行了NDK層面優(yōu)化,提升了glide性能,配合 PhotoView 實(shí)現(xiàn)圖片緩存同時,也實(shí)現(xiàn)圖片的放大縮小,防止OOM現(xiàn)象。
全類型消息:支持文字、表情、圖片、語音、視頻、附件、地理位置、擴(kuò)展消息、透傳消息、自定義消息等全類型消息收發(fā);實(shí)時音視頻:支持1對1、多對多音視頻、音視頻連麥等場景。低成本低延時、高品質(zhì)、抗丟包抗抖動、百萬級并發(fā)、全球多節(jié)點(diǎn)覆蓋;推送服務(wù):服務(wù)端支持對接APNS(蘋果)、Google、華為、小米、OPPO、VIVO、魅族等各大消息推送平臺;
多種路線規(guī)劃:駕車路線規(guī)劃、公交路線規(guī)劃、騎行路線規(guī)劃、步行路線規(guī)劃;自定義避讓區(qū)域或道路:想不走哪里就不走哪里;軌跡糾偏:針對定位偏移、定位缺失、定位間隔大等情況造成的軌跡異常,獵鷹提供基于路網(wǎng)和路徑規(guī)劃的軌跡糾偏補(bǔ)路功能,可將偏移點(diǎn)糾正到正確的道路上,呈現(xiàn)連貫、平滑的軌跡;空間檢索:提供多種空間檢索能力,支持檢索圓形、多邊形、行政區(qū)范圍內(nèi)的終端,可實(shí)現(xiàn)搜索當(dāng)前地圖視野內(nèi)終端或指定區(qū)域內(nèi)終端的功能;軌跡存儲:基于成熟穩(wěn)定的阿里云服務(wù),對用戶上傳的軌跡數(shù)據(jù)進(jìn)行存儲,保證數(shù)據(jù)穩(wěn)定;軌跡查詢:針對用戶已經(jīng)上傳成功的軌跡,我們提供高性能的軌跡查詢服務(wù),開發(fā)者可隨時查詢?nèi)我鈺r間段的軌跡。
準(zhǔn)確率高:準(zhǔn)確率高于90%,基于海量大數(shù)據(jù)持續(xù)迭代,不斷優(yōu)化識別精度;適用場景廣:對于道路卡口、出入口、街拍圖片均具有較好的識別效果,同時支持車身正向、側(cè)向等不同角度情況下的識別;交通車輛信息結(jié)構(gòu)化:對于道路、停車場等各種監(jiān)控場景,結(jié)構(gòu)化車輛信息數(shù)據(jù),可用于相關(guān)數(shù)據(jù)檢索或信息挖掘。
系統(tǒng)集成多組件開發(fā),多耗電大戶同時運(yùn)行。電量優(yōu)化程度在一定程度上決定了用戶的體驗(yàn)感。我們需要考慮的是如何優(yōu)化電量使用,讓我們的 App 不會因?yàn)殡娏肯倪^高被用戶排斥,或者被其他安全應(yīng)用報告,以此確保用戶黏性。
問題解析:
(1)優(yōu)化應(yīng)用的后臺耗電:避免后臺長時間獲取 WakeLock、WiFi 和藍(lán)牙的掃描等。
(2)網(wǎng)絡(luò)優(yōu)化:指定三種不同狀態(tài)消耗方案(Full power:高功率狀態(tài),移動網(wǎng)絡(luò)連接被激活,允許設(shè)備以最大的傳輸速率進(jìn)行操作;Low power:低功耗狀態(tài),對電量的消耗差不多是 Full power 狀態(tài)下的 50%;Standby:空閑態(tài),沒有數(shù)據(jù)連接需要傳輸,電量消耗最少。)
(3)計算優(yōu)化(在 native 層開發(fā)時,可以利用 ARM neon 指令集做并行運(yùn)算)
(4)界面優(yōu)化(離開界面后停止相關(guān)活動,例如關(guān)閉動畫,耗電操作判斷前后臺,如果是后臺則不執(zhí)行相關(guān)操作。)
(5)定位優(yōu)化(根據(jù)場景謹(jǐn)慎選擇定位模式:對定位準(zhǔn)確度沒那么高的場景可以選擇低精度模式??梢钥紤]網(wǎng)絡(luò)定位代替GPS。使用后務(wù)必及時關(guān)閉,減少更新頻率,例如定位開啟一定時間后超過某個閾值可以執(zhí)行一個兜底策略:強(qiáng)制關(guān)閉GPS。)
1)確定重點(diǎn):A 確認(rèn)嚴(yán)重程度。B 優(yōu)先解決 Top 崩潰或?qū)I(yè)務(wù)有重大影響的崩潰:如啟動、支付過程的崩潰c Java 崩潰:如果是OOM,需進(jìn)一步查看日志中的內(nèi)存信息和資源信息,下面會分析。C Native 崩潰:查看signal、code、fault addr以及崩潰時的Java堆棧
2)查找共性:機(jī)型、系統(tǒng)、ROM、廠商、ABI 這些信息都可以作為共性參考,對于下一步復(fù)現(xiàn)問題有明確指引。
3)嘗試復(fù)現(xiàn):復(fù)現(xiàn)之后再增加日志或使用 Debugger、GDB 進(jìn)行調(diào)試。
使用以上步驟,我們解決了幾個常見的異常:
異常1:Android 7.0 Toast BadTokenException
解決:代理Toast里的mTN(handler)就可以實(shí)現(xiàn)捕獲異常
異常2:SharedPreference apply引起的ANR問題
解決:拿到 Hook ActivityThrad的Handler變量,給其設(shè)置一個Callback,Handler 的 dispatchMessage中會先處理callback。最后在Callback中調(diào)用隊列的清理工作,注意隊列清理需要反射調(diào)用QueuedWork。
異常3:TimeoutExceptin異常
解決:它是由系統(tǒng)的FinalizerWatchdogDaemon 拋出來的,我們對該異常進(jìn)行了規(guī)避。stop 方法,在 Android 6.0 之前會有線程同步問題。因?yàn)?6.0 之前調(diào)用threadToStop的interrupt方法是沒有加鎖的,所以可能會有線程同步的問題。
需求:在APP中需要加載大量服務(wù)器圖片
難點(diǎn):我們的APP需要申請一塊內(nèi)存來存放圖片的時候,系統(tǒng)認(rèn)為我們的程序需要的內(nèi)存過大,不分配給我們的APP,拋出OOM異常
解決方案:1.異步開啟子線程進(jìn)行耗時的操作,通過Handler+Message在子線程發(fā)送消息到主線程進(jìn)行更新UI;2.對于加載圖片過多時導(dǎo)致的OOM內(nèi)存溢出問題,引入ImageLoader開源框架解決,ImageLoader里的線程使用了線程池,從而避免了過多的線程頻繁的創(chuàng)建和銷毀;3.對圖片采用軟引用,及時進(jìn)行recycle()操作及等比例縮小圖片;4.listview每次僅加載屏幕能顯示的內(nèi)容,其余數(shù)據(jù)處于準(zhǔn)備顯示狀態(tài)。
本文主要研究車輛疏導(dǎo)系統(tǒng)的搭建及優(yōu)化問題。系統(tǒng)搭建完后,在電量優(yōu)化、崩潰分析、內(nèi)存抖動三個方面對系統(tǒng)進(jìn)行了效率測試、異常捕捉及問題分析,并提供解決方案。實(shí)驗(yàn)結(jié)果表明,經(jīng)過我們的優(yōu)化,達(dá)到節(jié)省流量同時,也能免去重復(fù)的解析數(shù)據(jù)的步驟,系統(tǒng)整體的穩(wěn)定性和瀏覽流暢度得到了的很大的提升。
[1]陳鵬.基于Android應(yīng)用的性能監(jiān)控系統(tǒng)的研究與實(shí)現(xiàn)[D].華南理工大學(xué),2015.
[2]李少杰.面向移動智能終端應(yīng)用性能測試平臺的研究[D].華南理工大學(xué),2014.
[3]黃琦.Android智能手機(jī)應(yīng)用軟件自動化測試工具的設(shè)計和開發(fā)[D].安徽大學(xué),2012.
本文為廣東石油化工學(xué)院2021年省級大學(xué)生創(chuàng)新創(chuàng)業(yè)計劃項(xiàng)目“基于Android的校園云拼車系統(tǒng)”(項(xiàng)目編號為733718)階段性研究成果
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2021年11期