工具
-
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测试结果
| 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里面初始化移动到单独的线程中
优化前测试结果
| 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线程中执行
优化后测试结果
| 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中都进行了初始化
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。