摘要:性能測(cè)試除了需要監(jiān)控內(nèi)存占用流量等,還需要獲取的電量數(shù)據(jù),測(cè)試在可接受范圍內(nèi),避免出現(xiàn)過(guò)度消耗電量的現(xiàn)象。這一欄顯示了不同的充電方式對(duì)電量使用的影響。
本文由作者張迎貞授權(quán)網(wǎng)易云社區(qū)發(fā)布。
APP性能測(cè)試除了需要監(jiān)控PCU、內(nèi)存占用、流量等,還需要獲取APP的電量數(shù)據(jù),測(cè)試在可接受范圍內(nèi),避免APP出現(xiàn)過(guò)度消耗電量的現(xiàn)象。
手機(jī)有很多硬件模塊:CPU,藍(lán)牙,GPS,顯示屏,Wifi,射頻(Cellular Radio)等,在手機(jī)使用過(guò)程中,這些硬件模塊可能處于不同的狀態(tài),譬如WIFI打開(kāi)或關(guān)閉,屏幕是亮還是暗,CPU運(yùn)行或休眠。 硬件模塊在不同的狀態(tài)下的耗電量是不同的。Android在進(jìn)行電量統(tǒng)計(jì)時(shí),并不是采用直接記錄電流消耗量的方式,而是跟蹤硬件模塊在不同狀態(tài)下的使用時(shí)間,收集一些可用信息,用來(lái)近似的計(jì)算出電池消耗量。
從用戶使用層面來(lái)看,Android需要統(tǒng)計(jì)出應(yīng)用程序的耗電量。應(yīng)用程序的耗電量由很多部分組成,可能使用了GPS,藍(lán)牙等模塊,可能應(yīng)用程序要求長(zhǎng)時(shí)間亮屏(譬如游戲、視頻類(lèi)應(yīng)用)。 一個(gè)應(yīng)用程序的電量統(tǒng)計(jì),可以采用累計(jì)應(yīng)用程序使用所有硬件模塊時(shí)間這種方式近似計(jì)算出來(lái)。
舉一個(gè)例子,假定某個(gè)APP使用了GPS,使用時(shí)間用 t 表示。GPS模塊單位時(shí)間的耗電量用 w 表示,那么,這個(gè)APK使用GPS的耗電量就可以按照如下方式計(jì)算:
耗電量 = 單位時(shí)間耗電量(w) × 使用時(shí)間(t)
測(cè)試方法多種多樣:
1、CPU空閑時(shí),停留在主界面不退出,打開(kāi)網(wǎng)絡(luò)然后鎖屏,12小時(shí)后查看電量、流量變化
2、APP在操作運(yùn)行時(shí)(此過(guò)程可借助使用monkey進(jìn)行壓力測(cè)試),1小時(shí)后查看電量、流量變化
3、第三方APP進(jìn)行步驟1、2相同的場(chǎng)景測(cè)試
4、對(duì)比競(jìng)品APP的耗電量。
期望結(jié)果:APP在靜止?fàn)顟B(tài)時(shí)無(wú)沒(méi)有明顯的耗電情況,在運(yùn)行狀態(tài)時(shí)耗電量在可接受范圍內(nèi)。
方法1——手機(jī)自帶
有的手機(jī)設(shè)置菜單里面會(huì)有流量和電量統(tǒng)計(jì)類(lèi),只需在測(cè)試前后記錄下電量值,便可獲取消耗電量數(shù)值。
方法2——使用第三方工具
已知公式 : 耗電量 = 電流 * 時(shí)間
例:平均電流為150mA,測(cè)試時(shí)間30min,則,30min內(nèi)耗電量為:150 * 30 /60=75mAh(毫安小時(shí))。
通過(guò)耗電量和使用手機(jī)電量的百分比,可得出手機(jī)電池容量(理論值)。
一個(gè)系統(tǒng)走一遍基礎(chǔ)功能耗電不應(yīng)超過(guò)20%。
1、Emmagee
https://github.com/NetEase/Em...
Emmagee是網(wǎng)易杭州研究院QA團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)簡(jiǎn)單易上手的Android性能監(jiān)測(cè)小工具,主要用于監(jiān)控單個(gè)App的CPU,內(nèi)存,流量,啟動(dòng)耗時(shí),電量,電流等性能狀態(tài)的變化,且用戶可自定義配置監(jiān)控的頻率以及性能的實(shí)時(shí)顯示,并最終生成一份性能統(tǒng)計(jì)文件。
2、騰訊GT
http://gt.tencent.com/downloa...
此apk是一款可以對(duì)APP進(jìn)行測(cè)試的軟件,可以在任何情況下快速測(cè)試手機(jī)app的CPU、內(nèi)存、流量、電量、幀率/流暢度等性能測(cè)試。
使用方法:
打開(kāi)GT,點(diǎn)擊選擇被測(cè)應(yīng)用,選中自己要測(cè)的app,選擇關(guān)注的測(cè)試點(diǎn),cup、net(流量)、內(nèi)存(pss)等,點(diǎn)擊“啟動(dòng)”,在gt的插件標(biāo)簽里有耗電測(cè)試,導(dǎo)出文件查看電量使用。
3、其他各種常見(jiàn)耗電量監(jiān)控工具
金山電池醫(yī)生:能夠記錄CPU耗時(shí)、流量消耗隨時(shí)間的變化曲線,這樣可以查看app耗電在哪些時(shí)間點(diǎn).
GSam Battery Pro:耗電量信息顯示詳細(xì),包括了喚醒鎖數(shù),前后臺(tái)占用cpu的時(shí)間,可以導(dǎo)出數(shù)據(jù),支持多種監(jiān)控起始時(shí)間點(diǎn)設(shè)置
PowerTutor:1.顯示系統(tǒng)電量消耗水平,記錄耗電量的焦耳值,不是百分比,包括LCD/OLED,CPU,WiFi,3G,GPS和Audio;2.查看某段時(shí)間內(nèi)所有運(yùn)行中的應(yīng)用程序的耗電量
Battery Monitor Widget:高度可定制化的電量監(jiān)控小工具,不僅可以顯示當(dāng)前電量,估算剩余電量支撐時(shí)間,還可以一目了然地檢測(cè)出各個(gè)APP的耗電歷史,從而方便進(jìn)行比較。
Smart Battery Monitor:除了可以在狀態(tài)欄顯示電池消耗百分比外,還可以顯示電池的溫度,以及已充電時(shí)間。
Battery Indicator:亮點(diǎn)是輕便、小巧,甚至使用它時(shí)不會(huì)消耗電池。當(dāng)然,它可以顯示電池的電量百分比、電池的溫度、以及電池的健康信息。
Battery Widget:這個(gè)工具不僅是一個(gè)電池Widget,還可以作為顯示選項(xiàng),GPS,WiFi,藍(lán)牙選項(xiàng)等的快捷方式。
Battery Saver:被稱(chēng)為管理電池的最強(qiáng)大應(yīng)用之一。除了顯示電量信息,電池溫度和健康信息外,它還可以快速管理一些耗電量大的應(yīng)用如:GPS,WiFi,藍(lán)牙等。另外:該工具可以查看一天之內(nèi)的哪個(gè)時(shí)間點(diǎn)電池的耗電量最大。|
等等等等
方法3——Battery Historian
Android框架層通過(guò)一個(gè)名為batterystats的系統(tǒng)服務(wù),電池的信息,電壓,溫度,充電狀態(tài)等等,都是由BatteryService來(lái)提供的。電池的這些信息是BatteryService通過(guò)廣播主動(dòng)把數(shù)據(jù)傳送給所關(guān)心的應(yīng)用程序。實(shí)現(xiàn)了電量統(tǒng)計(jì)的功能,batterystats實(shí)現(xiàn)原理可以查閱電量統(tǒng)計(jì)服務(wù)
Android提供的dumpsys命令用于查看系統(tǒng)服務(wù)的信息(實(shí)現(xiàn)原理可以查閱dumpsys介紹), 將batterystats作為參數(shù),就能輸出完整的電量統(tǒng)計(jì)信息。
執(zhí)行:
手機(jī)連接usb執(zhí)行:
adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats –reset //清空電池的歷史狀態(tài)
斷開(kāi)USB,打開(kāi)目標(biāo)應(yīng)用,執(zhí)行monkey,正常使用5分鐘左右。
連接USB,執(zhí)行:
adb bugreport > bugreport.txt
也可以用adb shell dumpsys batterystats > com.nt.topline > toplinepower1.txt //得到指定app相關(guān)的電量消耗信息。
python historian.py -a bugreport.txt > batterystats.html
上面的historian.py腳本是python寫(xiě)的,所以需要python環(huán)境,從github上下載這個(gè)腳本。Chrome瀏覽器打開(kāi)生成的battery.html文件,打開(kāi)查看。
html中信息都能從bugreport.txt中找到相應(yīng)的信息。
分析各個(gè)指標(biāo)代表的意義:
上面的10,20代表的就是秒的意思,它是以一分鐘為周期,到第60秒的時(shí)候變?yōu)?。橫坐標(biāo)就是一個(gè)時(shí)間范圍,咱們的例子中統(tǒng)計(jì)的數(shù)據(jù)是以重置為起點(diǎn),獲取bugreport內(nèi)容時(shí)刻為終點(diǎn)。我們一共采集了多長(zhǎng)時(shí)間的數(shù)據(jù),圖表下也有信息說(shuō)明。(經(jīng)其他人的反饋,這個(gè)坐標(biāo)間隔是會(huì)隨著時(shí)間的長(zhǎng)度發(fā)生改變,所以要以你的實(shí)際情況為準(zhǔn))
battery_level:電量,可以看出電量的變化。比如上圖中的數(shù)據(jù)顯示剛開(kāi)始電量是100%,然后在第11秒-12秒中間的某個(gè)時(shí)刻降到了99%。
plugged: 充電狀態(tài),這一欄顯示是否進(jìn)行了充電,以及充電的時(shí)間范圍。例如上圖反映了我們?cè)诘?2s插入了數(shù)據(jù)線,然后一直持續(xù)了數(shù)據(jù)采集結(jié)束。
screen: 屏幕是否點(diǎn)亮,這一點(diǎn)可以考慮到睡眠狀態(tài)和點(diǎn)亮狀態(tài)下電量的使用信息。
top:該欄顯示當(dāng)前時(shí)刻哪個(gè)app處于最上層,就是當(dāng)前手機(jī)運(yùn)行的app,用來(lái)判斷某個(gè)app對(duì)手機(jī)電量的影響,這樣也能判斷出該app的耗電量信息。該欄記錄了應(yīng)用在某一個(gè)時(shí)刻啟動(dòng),以及運(yùn)行的時(shí)間,這對(duì)我們比對(duì)不同應(yīng)用對(duì)性能的影響有很大的幫助。
wake_lock*: wake_lock 該屬性是記錄wake_lock模塊的工作時(shí)間。是否有停止的時(shí)候等。Android的休眠喚醒主要基于wake_lock機(jī)制,只要系統(tǒng)中存在任一有效的wake_lock,系統(tǒng)就不能進(jìn)入深度休眠,但可以進(jìn)行設(shè)備的淺度休眠操作。wake_lock一般在關(guān)閉lcd、tp但系統(tǒng)仍然需要正常運(yùn)行的情況下使用,比如聽(tīng)歌、傳輸很大的文件等。
running:界面的狀態(tài),主要判斷是否處于idle的狀態(tài)。用來(lái)判斷無(wú)操作狀態(tài)下電量的消耗。
wake_lock_in:wake_lock有不同的組件,這個(gè)地方記錄在某一個(gè)時(shí)刻,有哪些部件開(kāi)始工作,以及工作的時(shí)間。
data_conn:數(shù)據(jù)連接方式的改變,上面的edge是說(shuō)明采用的gprs的方式連接網(wǎng)絡(luò)的。此數(shù)據(jù)可以看出手機(jī)是使用2g,3g,4g還是wifi進(jìn)行數(shù)據(jù)交換的。這一欄可以看出不同的連接方式對(duì)電量使用的影響。
status:電池狀態(tài)信息,有充電,放電,未充電,已充滿,未知等不同狀態(tài)。 這一欄記錄了電池狀態(tài)的改變信息。
phone_signal_strength:手機(jī)信號(hào)狀態(tài)的改變。 這一欄記錄手機(jī)信號(hào)的強(qiáng)弱變化圖,依次來(lái)判斷手機(jī)信號(hào)對(duì)電量的影響。
health:電池健康狀態(tài)的信息,這個(gè)信息一定程度上反映了這塊電池使用了多長(zhǎng)時(shí)間。 這一欄記錄電池狀態(tài)在何時(shí)發(fā)生改變,上面的圖中電池狀態(tài)一直處于good狀態(tài)。
plug:充電方式,usb或者插座,以及顯示連接的時(shí)間。 這一欄顯示了不同的充電方式對(duì)電量使用的影響。
gps:gps是否開(kāi)啟
phone_in_call :是否進(jìn)行通話
Sync :是否跟后臺(tái)同步,可以把鼠標(biāo)停在某一項(xiàng)上面。可以看到何時(shí)sync同步 啟動(dòng)的,持續(xù)時(shí)間Duration多久。電池容量不會(huì)顯示單一行為消耗的具體電量,這里只能顯示使用電池的頻率和時(shí)長(zhǎng),你可以看分時(shí)段的剩余電量來(lái)了解具體消耗了多少電量。
Job :后臺(tái)的工作,比如服務(wù)service的運(yùn)行。從下面圖中可以看到qihoo的AppStore和魯大師都在運(yùn)行后臺(tái)服務(wù)。
data_conn:數(shù)據(jù)連接方式的改變,上面的edge是說(shuō)明采用的gprs的方式連接網(wǎng)絡(luò)的。此數(shù)據(jù)可以看出手機(jī)是使用2g,3g,4g還是wifi進(jìn)行數(shù)據(jù)交換的。這一欄可以看出不同的連接方式對(duì)電量使用的影響。
status :電池狀態(tài)信息,有充電,放電,未充電,已充滿,未知等不同狀態(tài)。 這一欄記錄了電池狀態(tài)的改變信息。
phone_signal_strength :手機(jī)信號(hào)狀態(tài)的改變。 這一欄記錄手機(jī)信號(hào)的強(qiáng)弱變化圖,依次來(lái)判斷手機(jī)信號(hào)對(duì)電量的影響。
結(jié)果分析:
通過(guò)前面學(xué)習(xí)到的Battery Historian我們可以得到設(shè)備的電量消耗數(shù)據(jù).
例如拿移動(dòng)網(wǎng)絡(luò)舉例,如果數(shù)據(jù)中的移動(dòng)蜂窩網(wǎng)絡(luò)(Mobile Radio)電量消耗呈現(xiàn)下面的情況,間隔很小,又頻繁斷斷續(xù)續(xù)的出現(xiàn),說(shuō)明電量消耗性能很不好:
經(jīng)過(guò)優(yōu)化之后,如果呈現(xiàn)下面的圖示,說(shuō)明電量消耗的性能是良好的:
另外WiFi連接下,網(wǎng)絡(luò)傳輸?shù)碾娏肯囊纫苿?dòng)網(wǎng)絡(luò)少很多,應(yīng)該盡量減少移動(dòng)網(wǎng)絡(luò)下的數(shù)據(jù)傳輸,多在WiFi環(huán)境下傳輸數(shù)據(jù)。
耗電原因分析
主要造成耗電的幾大原因:
屏幕喚醒
CPU喚醒
蜂窩數(shù)據(jù)
傳感器
可能造成耗電的原因
網(wǎng)絡(luò)請(qǐng)求耗電,而且手機(jī)數(shù)據(jù)網(wǎng)絡(luò)進(jìn)行http請(qǐng)求比無(wú)線網(wǎng)進(jìn)行http請(qǐng)求更加耗電,因?yàn)閿?shù)據(jù)網(wǎng)絡(luò)調(diào)用到一些底層的硬件模塊,就如GPS一樣,當(dāng)手機(jī)打開(kāi)GPS功能后,也是啟動(dòng)了一些硬件模塊就會(huì)明顯增加耗電
高頻的刷新UI界面,刷新UI界面其實(shí)就是進(jìn)行l(wèi)ayout的繪制,如果一個(gè)Activity的布局嵌套太多層,那么每一層layout都會(huì)刷新一次,例如動(dòng)畫(huà)等等這些都會(huì)造成耗電
數(shù)據(jù)庫(kù),SD卡文件操作,這些都是屬于耗時(shí)操作,當(dāng)操作次數(shù)很少的時(shí)候基本不會(huì)有耗電問(wèn)題,但是當(dāng)短時(shí)間內(nèi)操作次數(shù)很多的話,也會(huì)明顯的增加耗電,同時(shí)也有可能造成頁(yè)面卡頓
AlarmManager,例如一些推送的心跳包實(shí)現(xiàn),AlarmManager會(huì)定時(shí)喚醒CPU去執(zhí)行一些任務(wù),也是造成耗電的一大源頭
手機(jī)網(wǎng)絡(luò)環(huán)境不好的時(shí)候會(huì)頻繁的切換網(wǎng)絡(luò),因?yàn)榫W(wǎng)絡(luò)數(shù)據(jù)交互的時(shí)候,系統(tǒng)也是會(huì)被喚醒的,所以APP如果在監(jiān)聽(tīng)了網(wǎng)絡(luò)切換廣播后做了大量的操作,一樣會(huì)增加耗電
針對(duì)一些任務(wù)隊(duì)列的處理,如果隊(duì)列堆積的任務(wù)太多,導(dǎo)致循環(huán)執(zhí)行太久也會(huì)造成耗電,因?yàn)檎加昧薈PU資源去執(zhí)行代碼,我們的log日志工具保存到文件就是用任務(wù)隊(duì)列實(shí)現(xiàn)的,當(dāng)壓力測(cè)試SDK一次性接受1萬(wàn)條消息的時(shí)候,那內(nèi)存就表上來(lái)了,跟了下發(fā)現(xiàn)日志保存隊(duì)列里面積壓了4千多個(gè)任務(wù),這時(shí)候即使手機(jī)鎖屏,也還會(huì)不斷的把隊(duì)列中的任務(wù)執(zhí)行完然后CPU才會(huì)休眠下去的,同樣會(huì)造成嚴(yán)重的耗電,耗內(nèi)存,好在release版本的日志都是關(guān)閉的
執(zhí)行一些高運(yùn)算量的代碼,例如json數(shù)據(jù)解析,一些二進(jìn)制協(xié)議的數(shù)據(jù)編碼和解碼
接收系統(tǒng)的一分鐘廣播,然后做一些程序邏輯處理,其實(shí)接收一分鐘廣播不耗電,耗電的是一分鐘執(zhí)行一次程序處理
Wake Lock使用不當(dāng)導(dǎo)致沒(méi)有及時(shí)的釋放,Wake Lock可以阻止cpu進(jìn)入休眠的,如果沒(méi)有及時(shí)的release會(huì)造成cpu無(wú)法休眠,程序耗電嚴(yán)重
如果程序中有定時(shí)任務(wù),在cpu休眠之后,定時(shí)任務(wù)就會(huì)被掛起不執(zhí)行,這時(shí)候并不會(huì)造成太大的耗電,但是如果這個(gè)定時(shí)任務(wù)的時(shí)間間隔很短,1秒執(zhí)行一次,那么當(dāng)手機(jī)app集成了推送,推送就會(huì)有心跳包通過(guò)AlarmManager來(lái)喚醒,每次喚醒的時(shí)候就會(huì)再去執(zhí)行掛起的定時(shí)任務(wù),雖然執(zhí)行定時(shí)任務(wù)的耗電量可能比心跳包的耗電量少很多,不過(guò)還是需要注意的,積少成多
其實(shí)android中的Log日志的打印也會(huì)耗電的,在日常開(kāi)發(fā)中,我們可能不僅會(huì)把log打印到AndroidStudio里面,有可能還會(huì)保存起來(lái),而且可能在打印對(duì)象信息數(shù)據(jù)的時(shí)候會(huì)用到j(luò)son格式轉(zhuǎn)換,這些都會(huì)增加耗電,但是在正式發(fā)布的apk包中日志管理一般都是關(guān)閉的
在手機(jī)鎖屏后,CPU會(huì)過(guò)一段時(shí)間才休眠,如果程序中有定時(shí)任務(wù),在CPU休眠后會(huì)被掛起不執(zhí)行,但是在CPU休眠之前,定時(shí)任務(wù)還是會(huì)一直的執(zhí)行的,之前遇到過(guò)這么一個(gè)問(wèn)題,我們采用Picasso庫(kù):Picasso.with(context)
優(yōu)化建議:
針對(duì)主要耗電原因的優(yōu)化:
o 傳感器的使用,比如gps,如果業(yè)務(wù)上非頻繁使用并且要求精度不高,那么就在業(yè)務(wù)上優(yōu)化定位時(shí)機(jī)和精度.
o 如果業(yè)務(wù)上需要有長(zhǎng)時(shí)間的service,那么要考慮到CPU weak lock,防止后臺(tái)任務(wù)沒(méi)有完成,但是cpu睡眠,或者任務(wù)已經(jīng)完成,仍然持有weak lock
o 我們也許會(huì)在手機(jī)充電時(shí),做一些日志上傳操作的定時(shí)任務(wù),那么注意重試次數(shù)和成功后處理,防止用戶一夜充電不到80%,然后手機(jī)廠商為我們背鍋的情況
o 已知屏幕喚醒是耗電大戶,原因是屏幕渲染,繪制消耗資源,所以我們?cè)谧远x視圖,布局的時(shí)候,要盡量做到Android性能優(yōu)化里要求
o 同理,各種優(yōu)化,平時(shí)編碼的習(xí)慣,都會(huì)影響我們脆弱的電量
o 為了減少電量的消耗,在蜂窩移動(dòng)網(wǎng)絡(luò)下,最好做到批量執(zhí)行網(wǎng)絡(luò)請(qǐng)求,盡量避免頻繁的間隔網(wǎng)絡(luò)請(qǐng)求。
針對(duì)Http請(qǐng)求優(yōu)化:
o 對(duì)http請(qǐng)求數(shù)據(jù)做GZIP壓縮,當(dāng)前流行的http第三方看默認(rèn)都支持GZIP壓縮
o Http緩存,Http協(xié)議有一個(gè)Cache機(jī)制,當(dāng)發(fā)出http請(qǐng)求的時(shí)候會(huì)先到指定目錄下檢查是否已經(jīng)存在這個(gè)請(qǐng)求的數(shù)據(jù),如果存在并且還沒(méi)過(guò)時(shí),那么就會(huì)直接返回;而一些第三方例如OkHttp也有有自己的緩存 機(jī)制OKHTTP緩存
o 合并Http請(qǐng)求來(lái)減少Http請(qǐng)求次數(shù),因?yàn)镠ttp底層也是TCP連接,對(duì)于每個(gè)Http請(qǐng)求,發(fā)出請(qǐng)求的時(shí)候都會(huì)創(chuàng)建TCP連接,請(qǐng)求結(jié)束后會(huì)斷開(kāi)TCP連接,那么當(dāng)Http請(qǐng)求次數(shù)很多的時(shí)候就會(huì)頻繁的創(chuàng)建和斷開(kāi)TCP連接,如果把當(dāng)中一些請(qǐng)求進(jìn)行合理的合并,那么就會(huì)減少Http請(qǐng)求次數(shù)
o 制定合理的Http請(qǐng)求數(shù)據(jù)格式和返回?cái)?shù)據(jù)格式,做到請(qǐng)求數(shù)據(jù)中沒(méi)有冗余字
o 可以在Http請(qǐng)求數(shù)據(jù)格式里面加一個(gè)字段dataVersion代表本地已有數(shù)據(jù)的版本號(hào),然后傳到服務(wù)器,服務(wù)器的數(shù)據(jù)表中也有一個(gè)字段是dataVersion,當(dāng)服務(wù)器數(shù)據(jù)被修改的時(shí)候,dataVersion就加一,當(dāng)檢測(cè)到客戶端傳上來(lái)的dataVersion小于服務(wù)器數(shù)據(jù)表中的dataVersion的時(shí)候就返回最新數(shù)據(jù),否則可以直接返回空數(shù)據(jù)代表當(dāng)前本地?cái)?shù)據(jù)已經(jīng)是最新數(shù)據(jù),這樣就不會(huì)每次請(qǐng)求http的時(shí)候都會(huì)返回大量數(shù)據(jù),當(dāng)數(shù)據(jù)沒(méi)有被改變的時(shí)候直接返回空,減少了http請(qǐng)求過(guò)程中的數(shù)據(jù)交互(但是要考慮一點(diǎn),只有一些請(qǐng)求數(shù)據(jù)量比較大的才適合,因?yàn)樵黾恿薲ataVersion字段后無(wú)論給客戶端還是服務(wù)端也都相應(yīng)的增加了維護(hù)的成本)
針對(duì)數(shù)據(jù)庫(kù),SD卡文件操作:
o APP在對(duì)數(shù)據(jù)庫(kù)或者SD卡文件操作的時(shí)候無(wú)非也是涉及到一些數(shù)據(jù)的轉(zhuǎn)換,json轉(zhuǎn)換,可以采用json解析效率高的第三方庫(kù),例如fast json,Jackson,gson
o 可以把一些需要持久化到數(shù)據(jù)庫(kù)或者文件中的數(shù)據(jù)先緩存在內(nèi)存中,然后在一個(gè)時(shí)間點(diǎn)一起觸發(fā)一同更新到數(shù)據(jù)庫(kù)或者文件中;例如,在進(jìn)入Activity的時(shí)候會(huì)首先從數(shù)據(jù)庫(kù)中搜索出帳戶信息并且展示在界面,然后會(huì)再去發(fā)Http請(qǐng)求服務(wù)器的帳戶信息數(shù)據(jù),再把服務(wù)器最新的帳戶信息數(shù)據(jù)刷新到界面中,同時(shí)也存在一個(gè)內(nèi)存對(duì)象中,這時(shí)候先不更新到數(shù)據(jù)庫(kù),當(dāng)退出這個(gè)Activity界面的時(shí)候可以去檢測(cè)帳戶數(shù)據(jù)是否發(fā)生改變,如果改變了就更新到數(shù)據(jù)中;這么做的好處是:如果在Activity界面多次修改數(shù)據(jù),那最新的數(shù)據(jù)都是只更新到內(nèi)存中的,當(dāng)Activity退出后才把最新的帳戶信息數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中,沒(méi)必要更改一次就同時(shí)把數(shù)據(jù)更新一次到數(shù)據(jù)庫(kù)
o SD卡的文件讀寫(xiě)操作比數(shù)據(jù)庫(kù)要快,數(shù)據(jù)庫(kù)也是屬于文件,但是在寫(xiě)數(shù)據(jù)的時(shí)候還要經(jīng)過(guò)sqlite的一些列數(shù)據(jù)庫(kù)操作,但是SD卡在寫(xiě)數(shù)據(jù)的時(shí)候是直接寫(xiě)到文件中的,所以針對(duì)與簡(jiǎn)單數(shù)據(jù),標(biāo)志變量或者數(shù)據(jù)條數(shù)很少的數(shù)據(jù),而且安全性要求也不高的數(shù)據(jù)可以直接存在文件中,例如SharedPreferences中,只有關(guān)系型的數(shù)據(jù),數(shù)據(jù)安全性較高的,數(shù)據(jù)記錄條數(shù)比較多的可以選擇數(shù)據(jù)庫(kù)存儲(chǔ),而且如果數(shù)據(jù)庫(kù)進(jìn)行加密后,對(duì)于數(shù)據(jù)庫(kù)的讀寫(xiě)操作會(huì)更慢了
o 針對(duì)數(shù)據(jù)庫(kù)操作盡量不要直接使用android里面的Sqlite來(lái)手寫(xiě)讀寫(xiě)的那些sql語(yǔ)句,可以選擇一些orm框架庫(kù),例如ormlite,GreenDao等等,我們選擇的是ormlite,因?yàn)閛rmlite數(shù)據(jù)庫(kù)加密已經(jīng)有現(xiàn)成的庫(kù)可以提供使用。
以上!感謝!分析不夠全面的部分歡迎交流補(bǔ)充!
參考:
http://blog.csdn.net/itfootba...
http://blog.csdn.net/itfootba...
http://news.mydrivers.com/1/2...
https://github.com/google/bat...
http://hukai.me/android-perfo...
https://juejin.im/entry/589d6...
http://xusx1024.com/2018/01/0...
http://gityuan.com/2016/01/10...
http://hukai.me/android-perfo...
http://duanqz.github.io/2015-...
http://duanqz.github.io/2015-...
免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。
文章來(lái)源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25343.html
摘要:被電子束轟擊的每個(gè)位置,熒光層都會(huì)產(chǎn)生一個(gè)小亮點(diǎn),最終小亮點(diǎn)們將會(huì)組成一幅幅影像,顯示在電視屏幕上。下圖展示的是攝像機(jī)慢放后,電子束的繪制過(guò)程。未來(lái),個(gè)推技術(shù)團(tuán)隊(duì)將繼續(xù)關(guān)注移動(dòng)端的性能優(yōu)化,為大家分享相關(guān)的技術(shù)干貨。 作者:個(gè)推安卓開(kāi)發(fā)工程師 一七 隨著科技的發(fā)展,各種移動(dòng)端早已成為人們?nèi)粘I钪胁豢苫蛉钡牟糠郑藗兪褂靡苿?dòng)端產(chǎn)品工作、社交、娛樂(lè)……移動(dòng)端界面的流暢性已經(jīng)成為影響用戶...
閱讀 3672·2021-11-15 11:37
閱讀 2322·2021-09-24 10:39
閱讀 2460·2021-07-25 21:37
閱讀 1446·2019-08-30 15:56
閱讀 2588·2019-08-30 15:55
閱讀 957·2019-08-30 15:54
閱讀 2129·2019-08-30 14:21
閱讀 858·2019-08-30 11:24