本著針對(duì)面試玩徊,不負(fù)責(zé)任的態(tài)度的榛,寫下《面試總結(jié)》系列琼了。本系列記錄面試過程中各個(gè)知識(shí)點(diǎn),而不是入門系列夫晌,如果有不懂的自行學(xué)習(xí)雕薪。
內(nèi)存泄露
- 什么是內(nèi)存泄露,為什么會(huì)引發(fā)
- Android垃圾回收機(jī)制
頻繁GC
耗電問題
OOM問題
原因
- UI線程做輕微耗時(shí)操作晓淀,導(dǎo)致UI線程卡頓
- 布局layout過于復(fù)雜所袁,無法在16ms內(nèi)完成渲染
- 同一時(shí)間段內(nèi)執(zhí)行動(dòng)畫過多,導(dǎo)致cpu或gpu負(fù)載過重
- 復(fù)雜的布局凶掰,頻繁觸發(fā)measure燥爷,layout,導(dǎo)致整個(gè)view從新渲染
- 內(nèi)存頻繁gc
- 冗余資源及邏輯導(dǎo)致加載緩慢
- 工作線程設(shè)置位background懦窘,導(dǎo)致后臺(tái)線程搶占UI線程前翎,阻塞渲染操作
- 排查靜態(tài)變量
手段
- gpu過渡重繪,開發(fā)者選項(xiàng)打開顯示重繪區(qū)域畅涂,定位到過去港华,解布局
- 打開嚴(yán)格模式,解決主線程耗時(shí)的操作午衰,讀寫文件等
- traceView立宜,檢查可能是ui線程操作的耗時(shí)問題冒萄,view的measure、layout是不是耗時(shí)過多
- leakcanary
- forloop/ondraw
- 優(yōu)化gson的序列化赘理、反序列化宦言,使用流配合gson序列化、提高性能20%
- viewstub商模、merge
- 加載優(yōu)化
a. 分步加載
b. 異步加載
c. 延時(shí)加載 - 刷新優(yōu)化
a. 縮小刷新區(qū)域
b. 減少刷新次數(shù) - 動(dòng)畫優(yōu)化奠旺、硬件加速
- 耗電優(yōu)化、batteryhistorian
性能優(yōu)化最佳實(shí)踐
1.布局優(yōu)化
優(yōu)化細(xì)節(jié)
- 如果父控件有顏色施流,也是自己需要的顏色响疚,那么就不必在子控件加背景顏色
- 如果每個(gè)自控件的顏色不太一樣,而且可以完全覆蓋父控件瞪醋,那么就不需要再父控
件上加背景顏色 - 盡量減少不必要的嵌套
- 能用LinearLayout和FrameLayout忿晕,就不要用RelativeLayout,因?yàn)镽elativeLayout控
件相對(duì)比較復(fù)雜银受,測(cè)繪也想要耗時(shí)践盼。
優(yōu)化細(xì)節(jié)
- 使用include和merge增加復(fù)用,減少層級(jí)
- ViewStub 按需加載宾巍,更加輕便
優(yōu)化細(xì)節(jié)
- 復(fù)雜界面可選擇ConstraintLayout咕幻,可有效減少層級(jí)
2.繪制優(yōu)化
優(yōu)化細(xì)節(jié)
- onDraw 中不要?jiǎng)?chuàng)建新的局部對(duì)象
- onDraw 方法中不要做耗時(shí)的任務(wù)
3.內(nèi)存優(yōu)化
基本可以分為以下四大類: 1、集合類 泄漏 2顶霞、單例/靜態(tài)變量造成的內(nèi)存泄漏 3肄程、匿名內(nèi)部類/非靜態(tài)內(nèi)部類 4、資源 未關(guān)閉造成的內(nèi)存泄漏
優(yōu)化細(xì)節(jié)
- 集合類泄漏
- 單例/靜態(tài)變量造成的內(nèi)存泄漏
- 匿名內(nèi)部類/非靜態(tài)內(nèi)部類
- 資源未關(guān)閉造成的內(nèi)存泄漏
優(yōu)化細(xì)節(jié)
- 解決各個(gè)情況下的內(nèi)存泄漏选浑,注意平時(shí)代碼的規(guī)范蓝厌。
4.啟動(dòng)優(yōu)化
官方給建議是: 1、利用提前展示出來的 Window古徒,快速展示出來一個(gè)界 面拓提,給用戶快速反饋的體驗(yàn); 2、避免在啟動(dòng)時(shí)做密集沉重的初始化(Heavy app initialization); 3隧膘、避免 I/O 操作崎苗、反序列化、網(wǎng)絡(luò)操作舀寓、布局嵌套等胆数。
- 利用提前展示出來的 Window,快速展示出來一個(gè)界面
- 避免在啟動(dòng)時(shí)做密集沉重的初始化
- 避免 I/O 操作互墓、反序列化必尼、網(wǎng)絡(luò)操作、布局嵌套等。
優(yōu)化細(xì)節(jié)
- 利用提前展示出來的Window判莉,快速展示出來一個(gè)界面豆挽,給用戶快速反饋的體驗(yàn);
- 避免在啟動(dòng)時(shí)做密集沉重的初始化(Heavy app initialization);
- 避免I/O操作、反序列化券盅、網(wǎng)絡(luò)操作帮哈、布局嵌套等。
5.包體積優(yōu)化
assets 文件夾 存放一些配置文件锰镀、資源文件娘侍,assets 不會(huì)自動(dòng)生成對(duì)應(yīng)的 ID, 而是通過 AssetManager 類的接口獲取泳炉。
res目錄 res 是 resource 的縮寫憾筏,這個(gè)目錄存放資源文件,會(huì)自動(dòng)生成對(duì)應(yīng)的 ID 并映射到 .R 文件中花鹅,訪問直接使用資源 ID氧腰。
META-INF 保存應(yīng)用的簽名信息,簽名信息可以驗(yàn)證 APK 文件的完整性刨肃。 AndroidManifest.xml 這個(gè)文件用來描述 Android 應(yīng)用的配置信息古拴,一些組件的
注冊(cè)信息、可使用權(quán)限等真友。
classes.dex Dalvik 字節(jié)碼程序黄痪,讓 Dalvik 虛擬機(jī)可執(zhí)行,一般情況下锻狗,Android 應(yīng) 用在打包時(shí)通過 Android SDK 中的 dx 工具將 Java 字節(jié)碼轉(zhuǎn)換為 Dalvik 字節(jié) 碼。
resources.arsc 記錄著資源文件和資源 ID 之間的映射關(guān)系焕参,用來根據(jù)資源 ID 尋找資源轻纪。
- lint工具,減小無用資源叠纷,同時(shí)build文件中開啟資源壓縮
- xml刻帚,drawable單色圖像
- 重用資源
- 壓縮png、jpg等圖像
- 使用webp
- 使用矢量圖
- 代碼混淆涩嚣、proguard工具
- 插件化
優(yōu)化細(xì)節(jié)
- 代碼混淆
- 插件化
- 資源優(yōu)化
6.耗電優(yōu)化
優(yōu)化細(xì)節(jié)
- 使用JobScheduler調(diào)度任務(wù)
- 使用懶惰法則(減小崇众、退出、合并)
7.ListView 和 Bitmap 優(yōu)化
- 圖片質(zhì)量壓縮
- 圖片尺寸壓縮
- libjpeg.so壓縮
優(yōu)化細(xì)節(jié)
- ListView 使用 ViewHolder航厚,分段顷歌,分頁加載
- 壓縮Bitmap
8.響應(yīng)速度優(yōu)化
9.線程優(yōu)化
10.未優(yōu)化
編寫高效代碼有兩個(gè)基本規(guī)則: 1、不要做你不需要做的工作 2幔睬、如果可以避免眯漩,請(qǐng)不要分配內(nèi)存
- 避免創(chuàng)建不必要的對(duì)象
- 首選靜態(tài)
- 常量使用static final
- 使用增強(qiáng)for
- 避免使用浮點(diǎn)類型