1.3啟動優化工具
1.3.1 traceview
1.3.2 systrace
2.啟動優化
啟動優化的第一步就是要獲取啟動的時間,整個啟動邏輯的所需要的精確時長。根據各個方法的時長去定位哪些邏輯需要優化。首先我們如何獲取**的執行時間。如下
檢視啟動時間。適合線下模式
注意:使用命令前,adb需要配置環境變數
adb shell am start -w com.example.demo/com.example.demo.mainactivity
this time:最後乙個activity啟動耗時
total time;所有activity啟動耗時,因為有時候程式啟動涉及好幾個介面。
waittime:ams啟動actvity總耗時。
全稱:aspect oriented programming,適用於批量監控,統計等使用。
簡單使用方式:
1.依賴
project裡的build.gradle檔案新增
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'
module裡的build.gradle檔案新增
'android-aspectjx'
implementation 'org.aspectj:aspectjrt:1.8.+'
2.建立監聽類
/**
* 新增aspect註解,且建立方法,來去監聽activity每個方法執行的時間
* 方法名新增註解:
* @around 在被監聽的方法前後都執行邏輯。
* @before 在被監聽的方法執行前執行
* @after 在被監聽的方法後執行
* 語法解釋:call 呼叫
* (* com..)* 返回值
* com..具體的類
* init** init開頭的方法
* (..)任意引數
* */
@aspect
public
class
aopdemo
catch
(throwable throwable)
log.
d(tag, s+
" gettime: "
+(system.
currenttimemillis()
-start));
}}
3.被監聽的類和方法
無侵入 修改方便
圖形展示執行時間,執行緒具體任務。適合線下檢測狀態。
好處:定點埋點,高效快捷。
通過執行**,使用檔案的形式收集**執行邏輯的資訊。
生成檔案在sd卡:android/data/packagename/files/***.trace
debug.
startmethodtracing
("檔名"
)debug.
stopmethodtracing
()
:
wall time **執行時間
thread time cpu執行時間
缺點:執行時開銷嚴重,整體會變慢。
獲取核心資料,生成html報告。需要執行sdk裡systrace命令。
api 18 以上 推薦tracecompat
執行命令:
python /users/..
./sdk/platform-tools/systrace/systrace.py -b 3200
-t 5
tracecompat.
beginsection()
; tracecompat.
endsection()
;
輕量級,開銷小,反映cpu利用率
cputime和walltime 區別非同步優化就是去分擔啟動頁面的其他任務,提高啟動頁的速度。walltime**執行時間
cputime**消耗cpu時間
把程式初始化的載入工作放到子執行緒,是一種直接高效的形式。我們可以建立執行緒池服務物件,執行n個執行緒呼叫每個初始化任務即可;當然這些初始化的任務也有特殊的情況存在。如:需要上下文環境context,需要主線程的looper物件,又或者此任務需要在主線程執行。也就需要特殊處理,如傳入context,looper,handler物件。
缺點:**優雅度不好,閱讀性差。
有一種情況更為特殊,就是子任務之間存在依賴關係,這時候需要我們用到countdownlatch。定時器概念,初始化計數值,當減到為0時,就可以執行下乙個任務。
countdownlatch count=
newcountdownlatch(1
);//執行減一
count.
countdown()
;//如果為count==0,則開始執行下面邏輯
count.
await()
;
自定義一套啟動器,類似於執行緒池的原理,同時新增了任務之間的依賴關係處理,可以實現主線程執行和子執行緒執行,是否等待其他任務。
優點:充分利用cpu的多核,自動梳理執行流程
常規非同步的缺點:**不優雅,不好處理,如子任務有依賴關係。
1.抽取為task任務
2.所有關係生成乙個有向無環圖。
3.多執行緒的優先順序依次執行
**資源:
對於一些不緊急的任務,我我們可以延遲載入。這裡使用idlehandler
原始碼解析:
提前載入sharedprefrencesmultidex之前載入,利用此階段cpu
類載入優化:提前非同步類載入class.forname() 只載入類本身及靜態變數的引用類
new 可以額外載入類成員變數的引用類
啟動階段抑制gc如何進行啟動優化的?cpu 鎖頻 cpu的執行緒全部開啟
從過程進入主題,分析現狀,確認問題。
針對性優化,針對問題 怎麼優化問題
長期保持優化效果。 ci監控 啟動器
非同步問題?演進過程
詳細介紹啟動器
容易忽略的注意點;
cpu time wall time
注意延遲初始化優化
類載入cpu拉高
版本迭代導致啟動變慢的解決方式
結合ci
完善監控
android效能優化之啟動優化
解決方案 null null true drawable bg splash必要且耗時 mutidex 必要不耗時 首頁繪製 非必要耗時 資料上報,外掛程式初始化 非必要不耗時 直接去掉,需要時再載入。其他第三方元件的初始化 檢視日誌 將手機連線到android studio上,開啟logcat,不...
Android效能優化1 啟動優化
1 手機的啟動 開啟電源 通過bootloader將linux系統拉起 配置網路 檔案等等引導頁面 linux啟動 init程序 zygote程序建立jvm 開啟systemserver,開啟binder執行緒池和systemservicemanager 由這些服務開啟activitymanager...
Android效能優化之冷啟動優化
冷啟動 cold start 溫啟動 warm start 熱啟動 hot start adb shell am start w packagename packagename.activity 例如 adb shell am start w com.dateyou.test com.datayou...