工具
- BlockCanary, 通过记录UI线程的事件分发,找到UI线程卡顿的操作,最后更新2017-08-17,参考
-
ANRWatchDog
,向UI线程发消息,5秒收不到回复认为卡顿,不精准,最后更新2019-05 -
TraceCanary
,微信开源,功能齐全,检测FPS,精准度高,分析时主要使用 - Method Tracing,可以很直观的看到某个时间段内哪个方法花了多少时间,
- DDMS,Google推荐不再使用
- 统计activity启动的时间,其中-S表示每次启动前先强行停止,-R表示重复测试次数,,命令为
adb shell am start -S -R 10 -W com.mahjong.sichuang3d/com.xianlai.protostar.common.activity.SplashActivity
WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间
TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用 Activity pause 的耗时
优化前测试结果
- 移除了广告的延迟
- 测试时间:2019-11-11,机型:Pixel
SplashActivity | TotalTime | WaitTime |
---|---|---|
第0次 | 6613 | 6618 |
第1次 | 7152 | 7154 |
第2次 | 8188 | 8190 |
第3次 | 8403 | 8405 |
第4次 | 8364 | 8366 |
平均 | 7744 | 7746 |
分析时间消耗(非严格对应)
- MyApp.onCreate()耗时5.01
- SplashActivity.loadAd()耗时2.09
- com.hao.ad 耗时3.47
- splash中getOpenUdid耗时1
- 首页布局过于复杂,占耗时的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优化
开启Annunciate
线程,每0.3s请求一次大厅轮播数据(/psnotice/v1/scroll/hall
) -
AbstractAllPush.init
--线程兼容,可以用gradle优化
初始化小米、魅族、华为或者友盟的推送 -
AbstractMainSDK.init
--线程兼容
请求配置noesdkf
,只有拿到1
,才初始化NoeSdk` -
ObjectBoxManager.init
--线程兼容
数据库初始化,需要权限 -
GDTAction.init
--
广点通初始化,需要配置了!!! -
requestAdverMid
--
请求配置adverMidConfig
, 回调用了channelID
&&subChannelID
-
initBugly
--
读取配置projectName
, 必须事前获取到 -
ShareManager.getInstance()
--用到了userID,注意数据不能出错- 延迟800ms,在io线程中执行
- 从
SF
中获取UserID - 请求配置
channelShareConfig
|shareConfig
- 请求
/xlhy-activity-external/baseshare/getconfig
- 使用
GlideLoader
下载图片 - 请求
/psgrowth/v1/friend/commonreward/base
分享的收益配置 - 请求
/psgrowth/v1/friend/config/commonreward
配置的分享收益
-
getOk
--线程兼容,重复初始化ImageLoader
初始化okhttp -
initShuMengSdk
--,init
方法开启looper,这里把开启looper前置了,观察下会有什么问题 -
MyNotificationManager.initNotificationChannel
-- 线程兼容 -
initRx
-- 线程兼容
捕获错误 -
CrashHandlerToServer.getInstance().init()
--线程兼容
上传异常 -
initDebugConfig
线程兼容
设置debug -
initADSDKConfig
-- 线程兼容,可以和log合并
设置了是否开启LogUtils -
registerHomeKeyReceiver
&&startScreenBroadcastReceiver
--线程兼容
注册广播接收
优化MyApp测试结果
- 移除了广告的延迟
- 测试时间: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线程中初始化
友盟推送的初始化,需要在友盟初始化之后完成,参考友盟开发者中心
额外发现:
*UmengAnalytics.init
和AbstractUmengPush.initUmeng
基本一致,可以去掉一个调用,根据名称的意思,决定去掉AbstractUmengPush.initUmeng
里面umeng的初始化
-
initApi
-- 线程兼容
通过访问配置dynamicApiDomains
,重新设定APP和游戏请求的服务器地址,可以放在Application
中,作为第一个范围配置的请求 -
AppUtil.dataLog
,AppUtil.StartUpDataLog
--线程兼容
访问/clientinfo/v1/private
,发送客户端数据打点统计
,可以直接挪到线程里面跑完 -
requestNotificationConfig
,线程兼容
访问配置messagebuilderconfig
,获取通知配置 -
requestCashCatConfig
,requestDouMengConfig
,requestTuiAConfig
访问配置cashCatAndDouMengConfig
,cashCatAndDouMengConfig
,tuiAConfig
,获取相关配置
并且如果是第一次启动APP,调用上传接口/adserving/v1/bianxianmao/feedback/click
-
isFirstAppRun
作为独立的功能提出来 -
requestVisitorAndGuiderModeConfig
--线程兼容
访问配置visitorAndGuiderMode
-
initPrivacyPolicyDialog
--
方法里做了和广告相关的业务,需要剥离 -
adverSDK
放在线程中初始化-
DataMgr
在APP中初始化 -
DataMgr
初始化完成才可以进行AdverSDK
在SplashActivity线程中实例化 -
AdverSDK
在使用的地方必须有值 -
AdverSDK
回调会再一次走到onResume
里面
-
-
onRequestPermissionsResult
可以使用三方库 -
show
在UI线程中执行gson的init和解析,可以放在线程中执行
注意多次执行这个方法
优化SplashActivity测试结果
- 测试时间:2019-11-12,机型:Pixel
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
里面初始化移动到单独的线程中
优化前测试结果
- 测试时间:2019-11-13,机型:Pixel
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控件
找相关人员沟通,微信联系中 - 页面绘制超级复杂
只能一点点的优化了 - 在页面绘制中又使用到
FunWebView
不好改,耦合太严重了 -
huyusdk.videoad
找广告项目组解决问题 -
loginForProtoStarSuccess
全部放到single线程中执行
优化后测试结果
- 测试时间:2019-11-13,机型:Pixel
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函数做个延迟,看下哪些地方会出错
出现的问题:
- E/MyApp: get ChannelID fail
- E/gdt_action: GDTAction初始化失败,init方法的userActionSetId参数不能为空
- 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中都进行了初始化
网友评论