Android开发之Android性能优化记录
Android 性能優(yōu)化
Android 中的性能優(yōu)化在我看來分為以下幾個(gè)方面:內(nèi)存優(yōu)化、布局優(yōu)化、網(wǎng)絡(luò)優(yōu)化、安裝包優(yōu)化;
內(nèi)存優(yōu)化:?下一個(gè)問題就是;
布局優(yōu)化:?布局優(yōu)化的本質(zhì)就是減少 View 的層級(jí)。常見的布局優(yōu)化方案如下
o?在 LinearLayout 和 RelativeLayout 都可以完成布局的情況下優(yōu)先選擇 RelativeLayout,可以減少 View 的層級(jí)
o?將常用的布局組件抽取出來使用 < include > 標(biāo)簽
o?通過 < ViewStub > 標(biāo)簽來加載不常用的布局
o?使用 \< Merge \> 標(biāo)簽來減少布局的嵌套層次
網(wǎng)絡(luò)優(yōu)化:?常見的網(wǎng)絡(luò)優(yōu)化方案如下
o?盡量減少網(wǎng)絡(luò)請(qǐng)求,能夠合并的就盡量合并
o?避免 DNS 解析,根據(jù)域名查詢可能會(huì)耗費(fèi)上百毫秒的時(shí)間,也可能存在DNS劫持的風(fēng)險(xiǎn)。可以根據(jù)業(yè)務(wù)需求采用增加動(dòng)態(tài)更新 IP 的方式,或者在 IP 方式訪問失敗時(shí)切換到域名訪問方式。
o?大量數(shù)據(jù)的加載采用分頁(yè)的方式
o?網(wǎng)絡(luò)數(shù)據(jù)傳輸采用 GZIP 壓縮
o?加入網(wǎng)絡(luò)數(shù)據(jù)的緩存,避免頻繁請(qǐng)求網(wǎng)絡(luò)
o?上傳圖片時(shí),在必要的時(shí)候壓縮圖片
安裝包優(yōu)化:?安裝包優(yōu)化的核心就是減少 apk 的體積,常見的方案如下
o?使用混淆,可以在一定程度上減少 apk 體積,但實(shí)際效果微乎其微
o?減少應(yīng)用中不必要的資源文件,比如圖片,在不影響 APP 效果的情況下盡量壓縮圖片,有一定的效果
o?在使用了 SO 庫(kù)的時(shí)候優(yōu)先保留 v7 版本的 SO 庫(kù),刪掉其他版本的SO庫(kù)。原因是在 2018 年,v7 版本的 SO 庫(kù)可以滿足市面上絕大多數(shù)的要求,可能八九年前的手機(jī)滿足不了,但我們也沒必要去適配老掉牙的手機(jī)。實(shí)際開發(fā)中減少 apk 體積的效果是十分顯著的,如果你使用了很多 SO 庫(kù),比方說一個(gè)版本的SO庫(kù)一共 10M,那么只保留 v7 版本,刪掉 armeabi 和 v8 版本的 SO 庫(kù),一共可以減少 20M 的體積。
3、Android 內(nèi)存優(yōu)化
Android的內(nèi)存優(yōu)化在我看來分為兩點(diǎn):避免內(nèi)存泄漏、擴(kuò)大內(nèi)存,其實(shí)就是開源節(jié)流;
其實(shí)內(nèi)存泄漏的本質(zhì)就是較長(zhǎng)生命周期的對(duì)象引用了較短生命周期的對(duì)象;
常見的內(nèi)存泄漏
·?單例模式導(dǎo)致的內(nèi)存泄漏。?最常見的例子就是創(chuàng)建這個(gè)單例對(duì)象需要傳入一個(gè) Context,這時(shí)候傳入了一個(gè) Activity 類型的 Context,由于單例對(duì)象的靜態(tài)屬性,導(dǎo)致它的生命周期是從單例類加載到應(yīng)用程序結(jié)束為止,所以即使已經(jīng) finish 掉了傳入的 Activity,由于我們的單例對(duì)象依然持有 Activity 的引用,所以導(dǎo)致了內(nèi)存泄漏。解決辦法也很簡(jiǎn)單,不要使用 Activity 類型的 Context,使用 Application 類型的 Context 可以避免內(nèi)存泄漏;
·?靜態(tài)變量導(dǎo)致的內(nèi)存泄漏。?靜態(tài)變量是放在方法區(qū)中的,它的生命周期是從類加載到程序結(jié)束,可以看到靜態(tài)變量生命周期是非常久的。最常見的因靜態(tài)變量導(dǎo)致內(nèi)存泄漏的例子是我們?cè)?Activity 中創(chuàng)建了一個(gè)靜態(tài)變量,而這個(gè)靜態(tài)變量的創(chuàng)建需要傳入 Activity 的引用 this。在這種情況下即使 Activity 調(diào)用了 finish 也會(huì)導(dǎo)致內(nèi)存泄漏。原因就是因?yàn)檫@個(gè)靜態(tài)變量的生命周期幾乎和整個(gè)應(yīng)用程序的生命周期一致,它一直持有 Activity 的引用,從而導(dǎo)致了內(nèi)存泄漏;
·?**非靜態(tài)內(nèi)部類導(dǎo)致的內(nèi)存泄漏。**非靜態(tài)內(nèi)部類導(dǎo)致內(nèi)存泄漏的原因是非靜態(tài)內(nèi)部類持有外部類的引用,最常見的例子就是在 Activity 中使用 Handler 和 Thread 了。使用非靜態(tài)內(nèi)部類創(chuàng)建的 Handler 和 Thread 在執(zhí)行延時(shí)操作的時(shí)候會(huì)一直持有當(dāng)前Activity的引用,如果在執(zhí)行延時(shí)操作的時(shí)候就結(jié)束 Activity,這樣就會(huì)導(dǎo)致內(nèi)存泄漏。解決辦法有兩種:第一種是使用靜態(tài)內(nèi)部類,在靜態(tài)內(nèi)部類中使用弱引用調(diào)用Activity。第二種方法是在 Activity 的 onDestroy 中調(diào)用 handler.removeCallbacksAndMessages?來取消延時(shí)事件;
·?使用資源未及時(shí)關(guān)閉導(dǎo)致的內(nèi)存泄漏。常見的例子有:操作各種數(shù)據(jù)流未及時(shí)關(guān)閉,操作 Bitmap 未及時(shí) recycle 等等;
·?使用第三方庫(kù)未能及時(shí)解綁。有的三方庫(kù)提供了注冊(cè)和解綁的功能,最常見的就 EventBus 了,我們都知道使用 EventBus 要在 onCreate 中注冊(cè),在 onDestroy 中解綁。如果沒有解綁的話,EventBus 其實(shí)是一個(gè)單例模式,他會(huì)一直持有 Activity 的引用,導(dǎo)致內(nèi)存泄漏。同樣常見的還有 RxJava,在使用 Timer 操作符做了一些延時(shí)操作后也要注意在 onDestroy 方法中調(diào)用 disposable.dispose()來取消操作;
·?屬性動(dòng)畫導(dǎo)致的內(nèi)存泄漏。常見的例子就是在屬性動(dòng)畫執(zhí)行的過程中退出了 Activity,這時(shí) View 對(duì)象依然持有 Activity 的引用從而導(dǎo)致了內(nèi)存泄漏。解決辦法就是在 onDestroy 中調(diào)用動(dòng)畫的 cancel 方法取消屬性動(dòng)畫;
·?WebView 導(dǎo)致的內(nèi)存泄漏。WebView 比較特殊,即使是調(diào)用了它的 destroy 方法,依然會(huì)導(dǎo)致內(nèi)存泄漏。其實(shí)避免WebView導(dǎo)致內(nèi)存泄漏的最好方法就是讓W(xué)ebView所在的Activity處于另一個(gè)進(jìn)程中,當(dāng)這個(gè) Activity 結(jié)束時(shí)殺死當(dāng)前 WebView 所處的進(jìn)程即可,我記得阿里釘釘?shù)?WebView 就是另外開啟的一個(gè)進(jìn)程,應(yīng)該也是采用這種方法避免內(nèi)存泄漏;
擴(kuò)大內(nèi)存
為什么要擴(kuò)大我們的內(nèi)存呢?有時(shí)候我們實(shí)際開發(fā)中不可避免的要使用很多第三方商業(yè)的 SDK,這些 SDK 其實(shí)有好有壞,大廠的 SDK 可能內(nèi)存泄漏會(huì)少一些,但一些小廠的 SDK 質(zhì)量也就不太靠譜一些。那應(yīng)對(duì)這種我們無法改變的情況,最好的辦法就是擴(kuò)大內(nèi)存。
擴(kuò)大內(nèi)存通常有兩種方法:一個(gè)是在清單文件中的 Application 下添加largeHeap="true"這個(gè)屬性,另一個(gè)就是同一個(gè)應(yīng)用開啟多個(gè)進(jìn)程來擴(kuò)大一個(gè)應(yīng)用的總內(nèi)存空間。第二種方法其實(shí)就很常見了,比方說我使用過個(gè)推的 S DK,個(gè)推的 Service 其實(shí)就是處在另外一個(gè)單獨(dú)的進(jìn)程中。
Android 中的內(nèi)存優(yōu)化總的來說就是開源和節(jié)流,開源就是擴(kuò)大內(nèi)存,節(jié)流就是避免內(nèi)存泄漏;
總結(jié)
以上是生活随笔為你收集整理的Android开发之Android性能优化记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟手游阿木木装备怎么出 lol手游
- 下一篇: 股票尾盘炸板了第二天怎么走,分以下两种情