Android

项目启动优化

2019-11-12  本文已影响0人  0一缕星光0

工具

  1. BlockCanary, 通过记录UI线程的事件分发,找到UI线程卡顿的操作,最后更新2017-08-17,参考
  2. ANRWatchDog
    ,向UI线程发消息,5秒收不到回复认为卡顿,不精准,最后更新2019-05
  3. TraceCanary
    ,微信开源,功能齐全,检测FPS,精准度高,分析时主要使用
  4. Method Tracing,可以很直观的看到某个时间段内哪个方法花了多少时间,\color{#34a853}{主要使用}
  5. DDMS,Google推荐不再使用
  6. 统计activity启动的时间,其中-S表示每次启动前先强行停止,-R表示重复测试次数,\color{#34a853}{主要使用},命令为
adb shell am start -S -R 10 -W com.mahjong.sichuang3d/com.xianlai.protostar.common.activity.SplashActivity

WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间
TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用 Activity pause 的耗时

优化前测试结果

SplashActivity TotalTime WaitTime
第0次 6613 6618
第1次 7152 7154
第2次 8188 8190
第3次 8403 8405
第4次 8364 8366
平均 7744 7746

分析时间消耗(非严格对应)

  1. MyApp.onCreate()耗时5.01
  2. SplashActivity.loadAd()耗时2.09
  3. com.hao.ad 耗时3.47
  4. splash中getOpenUdid耗时1
  5. 首页布局过于复杂,占耗时的19.9%

Step1:MyApp.onCreate里面初始化移动到单独的线程中

  1. X5Webview.init -- 另外一个\color{#2e798b}{进程}中初始化去了
    腾讯的WebView
    尝试把X5WebView的初始化移动到其他进程处理
  2. Logger.init--线程兼容,Executors.newSingleThreadExecutor()作为替换
    开启上传log文件的线程池
    需要放在前面,喝多使用logger的地方都需要
  3. initJSONConfig--\color{#34a853}{同步问题}
    读取json的配置文件,有些请求是需要先获取到配置的
  4. initChannelConfig--\color{#34a853}{同步问题}
    从apk中获取渠道信息(文件IO),获取channelID&&subChannelID
  5. initAppInfo--\color{#34a853}{同步问题}
    获取包名
  6. GlobalRequests.startWithAppLaunch();--线程兼容,可以用rxjava优化
    开启Annunciate线程,每0.3s请求一次大厅轮播数据(/psnotice/v1/scroll/hall)
  7. AbstractAllPush.init--线程兼容,可以用gradle优化
    初始化小米、魅族、华为或者友盟的推送
  8. AbstractMainSDK.init--线程兼容
    请求配置noesdkf,只有拿到1,才初始化NoeSdk`
  9. ObjectBoxManager.init--线程兼容
    数据库初始化,需要权限
  10. GDTAction.init -- \color{#2e798b}{同步问题-获取配置!}
    广点通初始化,需要配置了!!!
  11. requestAdverMid -- \color{#2e798b}{同步问题-获取配置!}
    请求配置adverMidConfig, 回调用了channelID&&subChannelID
  12. initBugly -- \color{#2e798b}{同步问题-获取配置!}
    读取配置projectName, 必须事前获取到
  13. ShareManager.getInstance()--用到了userID,注意数据不能出错
    1. 延迟800ms,在io线程中执行
    2. SF中获取UserID
    3. 请求配置channelShareConfig|shareConfig
    4. 请求/xlhy-activity-external/baseshare/getconfig
    5. 使用GlideLoader下载图片
    6. 请求/psgrowth/v1/friend/commonreward/base分享的收益配置
    7. 请求/psgrowth/v1/friend/config/commonreward配置的分享收益
  14. getOk--线程兼容,重复初始化ImageLoader
    初始化okhttp
  15. initShuMengSdk--\color{#2e798b}{同步问题-获取配置!}init方法开启looper,这里把开启looper前置了,观察下会有什么问题
  16. MyNotificationManager.initNotificationChannel -- 线程兼容
  17. initRx-- 线程兼容
    捕获错误
  18. CrashHandlerToServer.getInstance().init()--线程兼容
    上传异常
  19. initDebugConfig 线程兼容
    设置debug
  20. initADSDKConfig -- 线程兼容,可以和log合并
    设置了是否开启LogUtils
  21. registerHomeKeyReceiver&&startScreenBroadcastReceiver--线程兼容
    注册广播接收

优化MyApp测试结果

SplashActivity TotalTime WaitTime 提升 \color{#ff3333}{提升率}
第0次 3219 3220 3398 \color{#ff3333}{48.66\%}
第1次 3138 3141 4013 \color{#ff3333}{43.91\%}
第2次 3958 3962 4228 \color{#ff3333}{48.38\%}
第3次 4054 4055 4350 \color{#ff3333}{48.25\%}
第4次 3656 3658 4708 \color{#ff3333}{43.72\%}
平均 3605 3607 4139 \color{#ff3333}{46.56\%}

Step2: SplashActivity.onCreate里面初始化移动到单独的线程中

  1. PushAgent.getInstance(this).onAppStart() -- 移动到APP线程中初始化
    友盟推送的初始化,需要在友盟初始化之后完成,参考友盟开发者中心

额外发现:
* UmengAnalytics.initAbstractUmengPush.initUmeng基本一致,可以去掉一个调用,根据名称的意思,决定去掉AbstractUmengPush.initUmeng里面umeng的初始化

  1. initApi -- 线程兼容
    通过访问配置dynamicApiDomains,重新设定APP和游戏请求的服务器地址,可以放在Application中,作为第一个范围配置的请求
  2. AppUtil.dataLogAppUtil.StartUpDataLog--线程兼容
    访问/clientinfo/v1/private,发送客户端数据打点统计,可以直接挪到线程里面跑完
  3. requestNotificationConfig,线程兼容
    访问配置messagebuilderconfig,获取通知配置
  4. requestCashCatConfig, requestDouMengConfig,requestTuiAConfig
    访问配置cashCatAndDouMengConfigcashCatAndDouMengConfigtuiAConfig,获取相关配置
    并且如果是第一次启动APP,调用上传接口
    • /adserving/v1/bianxianmao/feedback/click
  5. isFirstAppRun
    作为独立的功能提出来
  6. requestVisitorAndGuiderModeConfig--线程兼容
    访问配置visitorAndGuiderMode
  7. initPrivacyPolicyDialog--
    方法里做了和广告相关的业务,需要剥离
  8. adverSDK放在线程中初始化
    • DataMgr在APP中初始化
    • DataMgr初始化完成才可以进行AdverSDK在SplashActivity线程中实例化
    • AdverSDK在使用的地方必须有值
    • AdverSDK回调会再一次走到onResume里面
  9. onRequestPermissionsResult可以使用三方库
  10. show
    在UI线程中执行gson的init和解析,可以放在线程中执行
    注意多次执行这个方法

优化SplashActivity测试结果

SplashActivity TotalTime WaitTime 提升 \color{#ff3333}{提升率}
第0次 726 734 5884 \color{#ff3333}{88.91\%}
第1次 701 703 6451 \color{#ff3333}{90.17\%}
第2次 669 672 7518 \color{#ff3333}{91.79\%}
第3次 681 686 7719 \color{#ff3333}{91.84\%}
第4次 692 696 7670 \color{#ff3333}{91.68\%}
平均 693 698 7048 \color{#ff3333}{90.99\%}

Step3: HomeActivity.onCreate里面初始化移动到单独的线程中

优化前测试结果

HomeActivity TotalTime WaitTime
第0次 7435 7439
第1次 7750 7787
第2次 7816 7827
第3次 8376 8380
第4次 8781 8792
平均 8031 8045
  1. FunWebView extend X5WebView
    目前没找到方法
  2. 七鱼
    使用了ImageLoader,可以替换为其他的image控件
    找相关人员沟通,微信联系中
  3. 页面绘制超级复杂
    只能一点点的优化了
  4. 在页面绘制中又使用到FunWebView
    不好改,耦合太严重了
  5. huyusdk.videoad
    找广告项目组解决问题
  6. loginForProtoStarSuccess
    全部放到single线程中执行

优化后测试结果

HomeActivity TotalTime WaitTime 提升 提升率
第0次 5292 5302 2137 \color{#ff3333}{28.73\%}
第1次 5819 5830 1957 \color{#ff3333}{25.13\%}
第2次 6351 6356 1471 \color{#ff3333}{18.79\%}
第3次 6543 6552 1828 \color{#ff3333}{21.81\%}
第4次 7249 7254 1538 \color{#ff3333}{17.49\%}
平均 8031 8045 1786 \color{#ff3333}{22.20\%}

TODO:验证问题:

把init函数做个延迟,看下哪些地方会出错
出现的问题:

  1. E/MyApp: get ChannelID fail
  2. E/gdt_action: GDTAction初始化失败,init方法的userActionSetId参数不能为空
  3. CrashReport: addThread fail ,this thread has been added in monitor queue
  4. E/sichuang3d:cor: Unknown bits set in runtime_flags: 0x8000
  5. E/ResolverController: No valid NAT64 prefix (100, <unspecified>/0)
  6. E/TBSResources: Note:TbsResorce is Reinited,current Thread is 29278
  7. E/memtrack: Couldn't load memtrack module
  8. Note:TbsResorce is Reinited
  9. org.json.JSONException: No value for guangDianTongAppID

改进:
X5webview在app和homeactivity中都进行了初始化

上一篇下一篇

猜你喜欢

热点阅读