工具
- 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中都进行了初始化












网友评论