項目啟動優(yōu)化

工具

  1. BlockCanary, 通過記錄UI線程的事件分發(fā),找到UI線程卡頓的操作,最后更新2017-08-17,參考
  2. ANRWatchDog
    ,向UI線程發(fā)消息,5秒收不到回復(fù)認為卡頓,不精準(zhǔn),最后更新2019-05
  3. TraceCanary
    ,微信開源,功能齊全,檢測FPS,精準(zhǔn)度高,分析時主要使用
  4. Method Tracing,可以很直觀的看到某個時間段內(nèi)哪個方法花了多少時間,\color{#34a853}{主要使用}
  5. DDMS,Google推薦不再使用
  6. 統(tǒng)計activity啟動的時間,其中-S表示每次啟動前先強行停止,-R表示重復(fù)測試次數(shù),\color{#34a853}{主要使用},命令為
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))

  1. MyApp.onCreate()耗時5.01
  2. SplashActivity.loadAd()耗時2.09
  3. com.hao.ad 耗時3.47
  4. splash中g(shù)etOpenUdid耗時1
  5. 首頁布局過于復(fù)雜,占耗時的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優(yōu)化
    開啟Annunciate線程,每0.3s請求一次大廳輪播數(shù)據(jù)(/psnotice/v1/scroll/hall)
  7. AbstractAllPush.init--線程兼容,可以用gradle優(yōu)化
    初始化小米、魅族、華為或者友盟的推送
  8. AbstractMainSDK.init--線程兼容
    請求配置noesdkf,只有拿到1,才初始化NoeSdk`
  9. ObjectBoxManager.init--線程兼容
    數(shù)據(jù)庫初始化,需要權(quán)限
  10. GDTAction.init -- \color{#2e798b}{同步問題-獲取配置!}
    廣點通初始化,需要配置了!!!
  11. requestAdverMid -- \color{#2e798b}{同步問題-獲取配置!}
    請求配置adverMidConfig, 回調(diào)用了channelID&&subChannelID
  12. initBugly -- \color{#2e798b}{同步問題-獲取配置!}
    讀取配置projectName, 必須事前獲取到
  13. ShareManager.getInstance()--用到了userID,注意數(shù)據(jù)不能出錯
    1. 延遲800ms,在io線程中執(zhí)行
    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--線程兼容,重復(fù)初始化ImageLoader
    初始化okhttp
  15. initShuMengSdk--\color{#2e798b}{同步問題-獲取配置!}init方法開啟looper,這里把開啟looper前置了,觀察下會有什么問題
  16. MyNotificationManager.initNotificationChannel -- 線程兼容
  17. initRx-- 線程兼容
    捕獲錯誤
  18. CrashHandlerToServer.getInstance().init()--線程兼容
    上傳異常
  19. initDebugConfig 線程兼容
    設(shè)置debug
  20. initADSDKConfig -- 線程兼容,可以和log合并
    設(shè)置了是否開啟LogUtils
  21. registerHomeKeyReceiver&&startScreenBroadcastReceiver--線程兼容
    注冊廣播接收

優(yōu)化MyApp測試結(jié)果

  • 移除了廣告的延遲
  • 測試時間:2019-11-11,機型:Pixel
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線程中初始化
    友盟推送的初始化,需要在友盟初始化之后完成,參考友盟開發(fā)者中心

額外發(fā)現(xiàn):
* UmengAnalytics.initAbstractUmengPush.initUmeng基本一致,可以去掉一個調(diào)用,根據(jù)名稱的意思,決定去掉AbstractUmengPush.initUmeng里面umeng的初始化

  1. initApi -- 線程兼容
    通過訪問配置dynamicApiDomains,重新設(shè)定APP和游戲請求的服務(wù)器地址,可以放在Application中,作為第一個范圍配置的請求
  2. AppUtil.dataLogAppUtil.StartUpDataLog--線程兼容
    訪問/clientinfo/v1/private,發(fā)送客戶端數(shù)據(jù)打點統(tǒng)計,可以直接挪到線程里面跑完
  3. requestNotificationConfig,線程兼容
    訪問配置messagebuilderconfig,獲取通知配置
  4. requestCashCatConfig, requestDouMengConfig,requestTuiAConfig
    訪問配置cashCatAndDouMengConfigcashCatAndDouMengConfigtuiAConfig,獲取相關(guān)配置
    并且如果是第一次啟動APP,調(diào)用上傳接口
    • /adserving/v1/bianxianmao/feedback/click
  5. isFirstAppRun
    作為獨立的功能提出來
  6. requestVisitorAndGuiderModeConfig--線程兼容
    訪問配置visitorAndGuiderMode
  7. initPrivacyPolicyDialog--
    方法里做了和廣告相關(guān)的業(yè)務(wù),需要剝離
  8. adverSDK放在線程中初始化
    • DataMgr在APP中初始化
    • DataMgr初始化完成才可以進行AdverSDK在SplashActivity線程中實例化
    • AdverSDK在使用的地方必須有值
    • AdverSDK回調(diào)會再一次走到onResume里面
  9. onRequestPermissionsResult可以使用三方庫
  10. show
    在UI線程中執(zhí)行g(shù)son的init和解析,可以放在線程中執(zhí)行
    注意多次執(zhí)行這個方法

優(yōu)化SplashActivity測試結(jié)果

  • 測試時間:2019-11-12,機型:Pixel
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里面初始化移動到單獨的線程中

優(yōu)化前測試結(jié)果

  • 測試時間:2019-11-13,機型:Pixel
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控件
    找相關(guān)人員溝通,微信聯(lián)系中
  3. 頁面繪制超級復(fù)雜
    只能一點點的優(yōu)化了
  4. 在頁面繪制中又使用到FunWebView
    不好改,耦合太嚴(yán)重了
  5. huyusdk.videoad
    找廣告項目組解決問題
  6. loginForProtoStarSuccess
    全部放到single線程中執(zhí)行

優(yōu)化后測試結(jié)果

  • 測試時間:2019-11-13,機型:Pixel
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函數(shù)做個延遲,看下哪些地方會出錯
出現(xiàn)的問題:

  1. E/MyApp: get ChannelID fail
  2. E/gdt_action: GDTAction初始化失敗,init方法的userActionSetId參數(shù)不能為空
  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中都進行了初始化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,136評論 1 32
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,908評論 0 5
  • 類加載機制 如下圖所示,JVM類加載機制分為五個部分:加載,驗證,準(zhǔn)備,解析,初始化,下面我們就分別來看一下這五個...
    舉頭望明月泣閱讀 1,172評論 0 0
  • // com.adobe.flash.listen settings.gradle 定義項目包含那些模塊app.i...
    zeromemcpy閱讀 1,645評論 0 1
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,804評論 0 10