工具
-
BlockCanary, 通過記錄UI線程的事件分發(fā),找到UI線程卡頓的操作,最后更新2017-08-17,參考
-
ANRWatchDog
,向UI線程發(fā)消息,5秒收不到回復(fù)認為卡頓,不精準(zhǔn),最后更新2019-05
-
TraceCanary
,微信開源,功能齊全,檢測FPS,精準(zhǔn)度高,分析時主要使用
- Method Tracing,可以很直觀的看到某個時間段內(nèi)哪個方法花了多少時間,
- DDMS,Google推薦不再使用
- 統(tǒng)計activity啟動的時間,其中-S表示每次啟動前先強行停止,-R表示重復(fù)測試次數(shù),
,命令為
adb shell am start -S -R 10 -W com.mahjong.sichuang3d/com.xianlai.protostar.common.activity.SplashActivity
WaitTime 就是總的耗時,包括前一個應(yīng)用 Activity pause 的時間和新應(yīng)用啟動的時間
TotalTime 表示新應(yīng)用啟動的耗時,包括新進程的啟動和 Activity 的啟動,但不包括前一個應(yīng)用 Activity pause 的耗時
優(yōu)化前測試結(jié)果
- 移除了廣告的延遲
- 測試時間:2019-11-11,機型:Pixel
SplashActivity |
TotalTime |
WaitTime |
第0次 |
6613 |
6618 |
第1次 |
7152 |
7154 |
第2次 |
8188 |
8190 |
第3次 |
8403 |
8405 |
第4次 |
8364 |
8366 |
平均 |
7744 |
7746 |
分析時間消耗(非嚴(yán)格對應(yīng))
- MyApp.onCreate()耗時5.01
- SplashActivity.loadAd()耗時2.09
- com.hao.ad 耗時3.47
- splash中g(shù)etOpenUdid耗時1
- 首頁布局過于復(fù)雜,占耗時的19.9%
Step1:MyApp.onCreate
里面初始化移動到單獨的線程中
-
X5Webview.init
-- 另外一個
中初始化去了
騰訊的WebView
嘗試把X5WebView的初始化移動到其他進程處理
-
Logger.init
--線程兼容,Executors.newSingleThreadExecutor()
作為替換
開啟上傳log文件的線程池
需要放在前面,喝多使用logger的地方都需要
-
initJSONConfig
--
讀取json的配置文件,有些請求是需要先獲取到配置的
-
initChannelConfig
--
從apk中獲取渠道信息(文件IO),獲取channelID
&&subChannelID
-
initAppInfo
--
獲取包名
-
GlobalRequests.startWithAppLaunch();
--線程兼容,可以用rxjava優(yōu)化
開啟Annunciate
線程,每0.3s請求一次大廳輪播數(shù)據(jù)(/psnotice/v1/scroll/hall
)
-
AbstractAllPush.init
--線程兼容,可以用gradle優(yōu)化
初始化小米、魅族、華為或者友盟的推送
-
AbstractMainSDK.init
--線程兼容
請求配置noesdkf
,只有拿到1
,才初始化NoeSdk`
-
ObjectBoxManager.init
--線程兼容
數(shù)據(jù)庫初始化,需要權(quán)限
-
GDTAction.init
-- 
廣點通初始化,需要配置了!!!
-
requestAdverMid
-- 
請求配置adverMidConfig
, 回調(diào)用了channelID
&&subChannelID
-
initBugly
-- 
讀取配置projectName
, 必須事前獲取到
-
ShareManager.getInstance()
--用到了userID,注意數(shù)據(jù)不能出錯
- 延遲800ms,在io線程中執(zhí)行
- 從
SF
中獲取UserID
- 請求配置
channelShareConfig
|shareConfig
- 請求
/xlhy-activity-external/baseshare/getconfig
- 使用
GlideLoader
下載圖片
- 請求
/psgrowth/v1/friend/commonreward/base
分享的收益配置
- 請求
/psgrowth/v1/friend/config/commonreward
配置的分享收益
-
getOk
--線程兼容,重復(fù)初始化ImageLoader
初始化okhttp
-
initShuMengSdk
--
,init
方法開啟looper,這里把開啟looper前置了,觀察下會有什么問題
-
MyNotificationManager.initNotificationChannel
-- 線程兼容
-
initRx
-- 線程兼容
捕獲錯誤
-
CrashHandlerToServer.getInstance().init()
--線程兼容
上傳異常
-
initDebugConfig
線程兼容
設(shè)置debug
-
initADSDKConfig
-- 線程兼容,可以和log合并
設(shè)置了是否開啟LogUtils
-
registerHomeKeyReceiver
&&startScreenBroadcastReceiver
--線程兼容
注冊廣播接收
優(yōu)化MyApp測試結(jié)果
- 移除了廣告的延遲
- 測試時間:2019-11-11,機型:Pixel
SplashActivity |
TotalTime |
WaitTime |
提升 |
 |
第0次 |
3219 |
3220 |
3398 |
 |
第1次 |
3138 |
3141 |
4013 |
 |
第2次 |
3958 |
3962 |
4228 |
 |
第3次 |
4054 |
4055 |
4350 |
 |
第4次 |
3656 |
3658 |
4708 |
 |
平均 |
3605 |
3607 |
4139 |
 |
Step2: SplashActivity.onCreate
里面初始化移動到單獨的線程中
-
PushAgent.getInstance(this).onAppStart()
-- 移動到APP線程中初始化
友盟推送的初始化,需要在友盟初始化之后完成,參考友盟開發(fā)者中心
額外發(fā)現(xiàn):
* UmengAnalytics.init
和AbstractUmengPush.initUmeng
基本一致,可以去掉一個調(diào)用,根據(jù)名稱的意思,決定去掉AbstractUmengPush.initUmeng
里面umeng的初始化
-
initApi
-- 線程兼容
通過訪問配置dynamicApiDomains
,重新設(shè)定APP和游戲請求的服務(wù)器地址,可以放在Application
中,作為第一個范圍配置的請求
-
AppUtil.dataLog
, AppUtil.StartUpDataLog
--線程兼容
訪問/clientinfo/v1/private
,發(fā)送客戶端數(shù)據(jù)打點統(tǒng)計
,可以直接挪到線程里面跑完
-
requestNotificationConfig
,線程兼容
訪問配置messagebuilderconfig
,獲取通知配置
-
requestCashCatConfig
, requestDouMengConfig
,requestTuiAConfig
訪問配置cashCatAndDouMengConfig
, cashCatAndDouMengConfig
, tuiAConfig
,獲取相關(guān)配置
并且如果是第一次啟動APP,調(diào)用上傳接口
/adserving/v1/bianxianmao/feedback/click
-
isFirstAppRun
作為獨立的功能提出來
-
requestVisitorAndGuiderModeConfig
--線程兼容
訪問配置visitorAndGuiderMode
-
initPrivacyPolicyDialog
--
方法里做了和廣告相關(guān)的業(yè)務(wù),需要剝離
-
adverSDK
放在線程中初始化
-
DataMgr
在APP中初始化
-
DataMgr
初始化完成才可以進行AdverSDK
在SplashActivity線程中實例化
-
AdverSDK
在使用的地方必須有值
-
AdverSDK
回調(diào)會再一次走到onResume
里面
-
onRequestPermissionsResult
可以使用三方庫
-
show
在UI線程中執(zhí)行g(shù)son的init和解析,可以放在線程中執(zhí)行
注意多次執(zhí)行這個方法
優(yōu)化SplashActivity測試結(jié)果
SplashActivity |
TotalTime |
WaitTime |
提升 |
 |
第0次 |
726 |
734 |
5884 |
 |
第1次 |
701 |
703 |
6451 |
 |
第2次 |
669 |
672 |
7518 |
 |
第3次 |
681 |
686 |
7719 |
 |
第4次 |
692 |
696 |
7670 |
 |
平均 |
693 |
698 |
7048 |
 |
Step3: HomeActivity.onCreate
里面初始化移動到單獨的線程中
優(yōu)化前測試結(jié)果
HomeActivity |
TotalTime |
WaitTime |
第0次 |
7435 |
7439 |
第1次 |
7750 |
7787 |
第2次 |
7816 |
7827 |
第3次 |
8376 |
8380 |
第4次 |
8781 |
8792 |
平均 |
8031 |
8045 |
-
FunWebView extend X5WebView
目前沒找到方法
- 七魚
使用了ImageLoader,可以替換為其他的image控件
找相關(guān)人員溝通,微信聯(lián)系中
- 頁面繪制超級復(fù)雜
只能一點點的優(yōu)化了
- 在頁面繪制中又使用到
FunWebView
不好改,耦合太嚴(yán)重了
-
huyusdk.videoad
找廣告項目組解決問題
-
loginForProtoStarSuccess
全部放到single線程中執(zhí)行
優(yōu)化后測試結(jié)果
HomeActivity |
TotalTime |
WaitTime |
提升 |
提升率 |
第0次 |
5292 |
5302 |
2137 |
 |
第1次 |
5819 |
5830 |
1957 |
 |
第2次 |
6351 |
6356 |
1471 |
 |
第3次 |
6543 |
6552 |
1828 |
 |
第4次 |
7249 |
7254 |
1538 |
 |
平均 |
8031 |
8045 |
1786 |
 |
TODO:驗證問題:
把init函數(shù)做個延遲,看下哪些地方會出錯
出現(xiàn)的問題:
- E/MyApp: get ChannelID fail
- E/gdt_action: GDTAction初始化失敗,init方法的userActionSetId參數(shù)不能為空
- CrashReport: addThread fail ,this thread has been added in monitor queue
- E/sichuang3d:cor: Unknown bits set in runtime_flags: 0x8000
- E/ResolverController: No valid NAT64 prefix (100, <unspecified>/0)
- E/TBSResources: Note:TbsResorce is Reinited,current Thread is 29278
- E/memtrack: Couldn't load memtrack module
- Note:TbsResorce is Reinited
- org.json.JSONException: No value for guangDianTongAppID
改進:
X5webview在app和homeactivity中都進行了初始化
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。