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