文章目錄
Android 性能優化–APP啓動、UI優化
安卓系統啓動流程
- 打開電源 引導芯片代碼加載引導程序Boot Loader到RAM中去執行
- BootLoader把操作系統拉起來
- Linux 內核啓動開始系統設置,找到一個init.rc文件啓動初始化進程
- init進程初始化和啓動屬性服務,之後開啓Zygote進程
- Zygote開始創建JVM並註冊JNI方法,開啓SystemServer
- 啓動Binder線程沲和SystemServiceManager,並啓動各種服務
- AMS啓動Launcher
Activity啓動流程
大致流程如下
詳細可以參考 Activity啓動流程源碼分析
優化啓動的Activity
Activity的Theme優化
在老的系統版本採用以下主題,會引起黑白屏問題,現在的版本默認使用透明處理
文件 res/values/styles.xml
白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">
解決辦法:自定義啓動Activity的主題,比如
<style name="AppTheme.Launcher">
<item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@null</item>
</style>
Activity的佈局優化
Button(View)的顯示過程
- LayoutInflater加載佈局文件到內存,轉化爲包含大小位置等信息的Button對象
- CPU經過計算,處理成多爲矢量圖
- GPU格柵化(參考’圖像渲染機制’)進行像素填充顯示
佈局優化方案
-
減少過度繪製,我應該減少紅色的顯示,比如:
減少背景重複,如“Activity的Theme優化”;
使用裁減減少控件之間的重合部分;
Android7.0之後invalidate()不再執行測量和佈局動作。
-
減少佈局層級嵌套,採用
ConstraintLayout
、<merge>
-
採用
<include>
複用佈局,可以減少GPU重複工作 -
採用
ViewStub
按需加載
常用優化工具
-
GPU過度繪製查看
手機開發者模式–>調試GPU過度繪製–>顯示過度繪製區域。 -
查看UI層級
sdk\tools\bin\uiautomatorviewer.bat
-
查看UI層級嵌套及性能
sdk\tools\monitor.bat
點擊下圖三色圓疊加地方後,可以分別顯示頁面measure、layout、draw的時間,紅色性能最差,綠色最快。
Activity的代碼優化
- 開啓混淆
- 生命週期內方法避免耗時操作
優化Application初始化
一般我們會在onCreate()中放一些初始化,如果初始化耗時,就會引起應用啓動慢
優化方案:
- 不放耗時初始化
- 異步初始化非必須業務
- 將部分初始放啓動頁(不僅僅是爲了顯示廣告)
Java代碼性能分析方法
logcat查看啓動時間
adb logcat -v time |grep com.xxx.xxx
查看logcat中包名"com.xxx.xxx"的相關日誌
Profiler查看啓動時間
- 在要調試的代碼前後添加如下代碼,啓動應用,會在
data/data/com.xxx.xx/files/app.trace
中生成調試的trace信息
val file = File(filesDir, "app.trace")
Debug.startMethodTracing(file.absolutePath)
.....//要監控的代碼塊
Debug.stopMethodTracing()
- 將以上文件導出,並用AS打開,可以進一步分析耗時信息
adb pull data/data/com.xxx.xxxx/files/app.trace