http://blog.csdn.net/myfriend0/article/details/54970455
目前在公司接觸的項(xiàng)目,已經(jīng)趨于穩(wěn)定,即需求已經(jīng)不是那么頻繁變更。之前因?yàn)榭焖俚_發(fā)的模塊
暴露出一些問題來(lái)。優(yōu)化是目前最重要的任務(wù)了。自己挖的坑,含著淚也要填完。因?yàn)殚_發(fā)的是系統(tǒng)app,
公司對(duì)所有app的性能要求極為嚴(yán)格。畢竟品質(zhì)是公司的生命線。經(jīng)歷了一個(gè)多月的優(yōu)化工作,總結(jié)下都
做了那些事情。
一 代碼方面:
1.1 清除所有不用的組件
service,activity,receiver,雖然這些不用的組件占用不了多少存儲(chǔ),但是讓代碼整體結(jié)構(gòu)更加清晰。
如果不做這樣的清理,會(huì)讓后面維護(hù)的同事維護(hù)成本變大,后面同事只敢添加代碼,不敢輕易刪除,最后代碼結(jié)構(gòu)變得越來(lái)越復(fù)雜。
1.2 apk瘦身
因?yàn)閍pk經(jīng)歷了好幾次改版,每次改版都會(huì)添加不同的資源文件,適配不同分辨率,每次都是往res文件夾下添加各種資源文件,之前幾版廢棄的資源
都沒有刪除,有時(shí)候因?yàn)椴恢榔渌胤绞欠裾{(diào)用,就不輕易刪了,結(jié)果導(dǎo)致整個(gè)apk的體積變得非常大。當(dāng)清理了這些不用資源后,結(jié)果發(fā)下整個(gè)
apk體積減少了三分之一,非常吃驚。一個(gè)apk里面占用存儲(chǔ)最多的就是這些資源文件了。。。
二 業(yè)務(wù)方面
1.病毒掃描每次掃描時(shí)會(huì)從進(jìn)程A中的settingsprovider中讀取一些配置信息,之前的邏輯是每次掃描時(shí)都會(huì)跨進(jìn)程訪問,現(xiàn)在改為一天訪問一次
既滿足當(dāng)前功能模塊的需求,也避免了頻繁跨進(jìn)程訪問進(jìn)程A.做到按需訪問。
2.病毒掃描UI模塊和功能模塊分別運(yùn)行在兩個(gè)進(jìn)程中,UI模塊跨進(jìn)程調(diào)用功能模塊,功能模塊會(huì)返回結(jié)果到UI模塊。設(shè)計(jì)兩個(gè)進(jìn)程相互通信,
這兩個(gè)進(jìn)程各自掛了都會(huì)對(duì)方有影響,所以在UI進(jìn)程中對(duì)功能進(jìn)程掛了做了處理,即在onServiceDisConnected()中注冊(cè)了對(duì)功能進(jìn)程的死亡監(jiān)聽
同時(shí)在功能進(jìn)程也注冊(cè)了了UI進(jìn)程的死亡監(jiān)聽,即實(shí)現(xiàn)了DeathRecipient接口。這個(gè)通信進(jìn)程彼此監(jiān)聽對(duì)方的狀態(tài),做好異常情況的處理。
3.SharedPreferences優(yōu)化
阻塞UI進(jìn)程,引起ANR
4.PackageInfo緩存優(yōu)化
提高讀取PackageInfo信息速度
三 性能方面
1.App啟動(dòng)優(yōu)化
App啟動(dòng)的三種方式:
冷啟動(dòng)
App沒有啟動(dòng)過(guò)或App進(jìn)程被killed, 系統(tǒng)中不存在該App進(jìn)程, 此時(shí)啟動(dòng)App即為冷啟動(dòng).
冷啟動(dòng)的流程即為第2節(jié)所描述的App啟動(dòng)流程的全過(guò)程, 需要?jiǎng)?chuàng)建App進(jìn)程, 加載相關(guān)資源, 啟動(dòng)Main Thread, 初始化首屏Activity等.
熱啟動(dòng)
熱啟動(dòng)意味著你的App進(jìn)程只是處于后臺(tái), 系統(tǒng)只是將其從后臺(tái)帶到前臺(tái), 展示給用戶.
溫啟動(dòng)
介于冷啟動(dòng)和熱啟動(dòng)之間, 一般來(lái)說(shuō)在以下兩種情況下發(fā)生:
用戶back退出了App, 然后又啟動(dòng). App進(jìn)程可能還在運(yùn)行, 但是activity需要重建.
用戶退出App后, 系統(tǒng)可能由于內(nèi)存原因?qū)pp殺死, 進(jìn)程和activity都需要重啟, 但是可以在onCreate中將被動(dòng)殺死鎖保存的狀態(tài)(saved instance state)恢復(fù).
2.優(yōu)化點(diǎn)
根據(jù)冷啟動(dòng)的時(shí)間圖, 可以看出, 對(duì)于App來(lái)說(shuō), 我們可以控制的啟動(dòng)時(shí)間線的點(diǎn)無(wú)外乎:
(1)Application的onCreate
(2)首屏Activity的渲染
而我們現(xiàn)在的App動(dòng)不動(dòng)集成了很多第三方服務(wù), 啟動(dòng)時(shí)需要檢查廣告, 注冊(cè)狀態(tài)等等一系列接口都是在Application的onCreate或是首屏Activity的onCreate中做的.
3.如何定位問題
1.在onCreate開始和結(jié)尾打上trace
Debug.startMethodTracing("GithubApp");...Debug.stopMethodTracing();
生成trace文件,使用DDMS去分析耗時(shí)的方法
2.最笨的方法,給可疑的方法打印時(shí)間戳,定位是那個(gè)方法比較耗時(shí)
4.怎么優(yōu)化
拆分onCreate中那些比較耗時(shí)但是在onCreate后面不用的初始化工作,放在工作線程中去做。
布局優(yōu)化
1.問題
布局中經(jīng)常出現(xiàn)層級(jí)較深的問題,這樣會(huì)導(dǎo)致出現(xiàn)一些過(guò)度繪制的問題,從而導(dǎo)致卡頓等
2.問題檢測(cè)
2.1 Hierarchy Viewer
2.2 Lint tool
Lint tool可以對(duì)布局文件中的字體大小,過(guò)度使用的布局,contentDescription等等進(jìn)行檢查,然后指導(dǎo)優(yōu)化
3.問題優(yōu)化
基本原則:
盡量減少布局層級(jí)和復(fù)雜度
盡量不要嵌套使用RelativeLayout.(RelativeLayout會(huì)讓子View調(diào)用2次onMeasure)
盡量不要在嵌套的LinearLayout中都使用weight屬性.(LinearLayout 在有weight時(shí),也會(huì)調(diào)用子View2次onMeasure)
Layout的選擇, 以盡量減少View樹的層級(jí)為主.
去除不必要的父布局.
善用TextView的Drawable減少布局層級(jí)
如果H Viewer查看層級(jí)超過(guò)5層, 你就需要考慮優(yōu)化下布局了~
善用Tag
1. 使用include來(lái)重用布局.
標(biāo)簽可以允許在一個(gè)布局當(dāng)中引入另外一個(gè)布局,那么比如說(shuō)我們程序的所有界面都有一個(gè)公共的部分,這個(gè)時(shí)候最好的做法就是將這個(gè)公共的部分提取到一個(gè)獨(dú)立的布局文件當(dāng)中,
然后在每個(gè)界面的布局文件當(dāng)中來(lái)引用這個(gè)公共的布局。同時(shí)在標(biāo)簽當(dāng)中,我們是可以覆寫所有l(wèi)ayout屬性的,即include中指定的layout屬性將會(huì)覆蓋掉titlebar中指定的layout屬性。
2.
標(biāo)簽是作為標(biāo)簽的一種輔助擴(kuò)展來(lái)使用的,它的主要作用是為了防止在引用布局文件時(shí)產(chǎn)生多余的布局嵌套。
android:id="@+id/ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="OK" />
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:text="Cancel" />
使用merge引入的布局不會(huì)增加新的冗余布局
3. 按需加載布局
一個(gè)布局中的部分UI是按照特定的場(chǎng)景需求加載出來(lái)的,我們雖然可以將不常用的元素使用INVISIBLE或者GONE進(jìn)行隱藏來(lái)實(shí)現(xiàn)相關(guān)布局
但是這種實(shí)現(xiàn)是會(huì)影響性能的,因?yàn)樵诮馕霾季值臅r(shí)候也會(huì)將這些隱藏的元素一一解析出來(lái)。使用ViewStub可以按需加載
4.ListView優(yōu)化,adapter中常用的基本原則:
contentView復(fù)用
引入holder來(lái)避免重復(fù)的findViewById.
分頁(yè)加載
二 性能方面
一般來(lái)說(shuō), 有以下幾個(gè)方面:
App啟動(dòng)優(yōu)化
布局優(yōu)化
響應(yīng)優(yōu)化
內(nèi)存優(yōu)化
電池使用優(yōu)化
網(wǎng)絡(luò)優(yōu)化
1.App啟動(dòng)優(yōu)化
App啟動(dòng)方式:leng