成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

一分鐘快速定位Android啟動耗時問題

瀏覽:6日期:2022-09-17 15:58:59
目錄前言1. 接入Tencent Matrix2. 改造Application子類3.運(yùn)行,快速定位總結(jié)前言

Tencent Matrix默認(rèn)無法監(jiān)測Application冷啟動的耗時方法,本文介紹了如何改造Matrix支持冷啟動耗時方法監(jiān)測。讓你一分鐘就能給App啟動卡頓號脈。

1. 接入Tencent Matrix

1.1 在你項目根目錄下的 gradle.properties 中配置要依賴的 Matrix 版本號,如:

MATRIX_VERSION=1.0.0

1.2 在你項目根目錄下的 build.gradle 文件添加 Matrix 依賴,如:

dependencies { classpath ('com.tencent.matrix:matrix-gradle-plugin:${MATRIX_VERSION}') { changing = true } }

1.3 在 app/build.gradle 文件中添加 Matrix 各模塊的依賴,如:

dependencies { implementation group: 'com.tencent.matrix', name: 'matrix-android-lib', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-android-commons', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-trace-canary', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-resource-canary-android', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-resource-canary-common', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-io-canary', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-sqlite-lint-android-sdk', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-battery-canary', version: MATRIX_VERSION, changing: true implementation group: 'com.tencent.matrix', name: 'matrix-hooks', version: MATRIX_VERSION, changing: true } apply plugin: ’com.tencent.matrix-plugin’ matrix { trace {enable = true//if you don’t want to use trace canary, set falsebaseMethodMapFile = '${project.buildDir}/matrix_output/Debug.methodmap'blackListFile = '${project.projectDir}/matrixTrace/blackMethodList.txt' } }

1.4 實現(xiàn) PluginListener,接收 Matrix 處理后的數(shù)據(jù), 如:

class MatrixListener(context: Context?) : DefaultPluginListener(context) { companion object {const val TAG: String = 'Matrix.TestPluginListener' } override fun onReportIssue(issue: Issue) {super.onReportIssue(issue)MatrixLog.e(TAG, issue.toString()) }}

1.5 實現(xiàn)動態(tài)配置接口, 可修改 Matrix 內(nèi)部參數(shù). 在 sample-android 中 我們有個簡單的動態(tài)接口實例DynamicConfigImplDemo.java, 其中參數(shù)對應(yīng)的 key 位于文件 MatrixEnum中, 摘抄部分示例如下:

class MatrixConfig : IDynamicConfig { val isFPSEnable: Booleanget() = true val isTraceEnable: Booleanget() = true val isMatrixEnable: Booleanget() = true override fun get(key: String, defStr: String): String {// for Activity leak detectif (ExptEnum.clicfg_matrix_resource_detect_interval_millis.name == key || ExptEnum.clicfg_matrix_resource_detect_interval_millis_bg.name == key) { Log.d('DynamicConfig','Matrix.ActivityRefWatcher: clicfg_matrix_resource_detect_interval_millis 10s' ) return TimeUnit.SECONDS.toMillis(5).toString()}if (ExptEnum.clicfg_matrix_resource_max_detect_times.name == key) { Log.d('DynamicConfig','Matrix.ActivityRefWatcher: clicfg_matrix_resource_max_detect_times 5' ) return 3.toString()}return defStr } override fun get(key: String, defInt: Int): Int {//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.if (MatrixEnum.clicfg_matrix_resource_max_detect_times.name == key) { MatrixLog.i(TAG, 'key:$key, before change:$defInt, after change, value:2') return 2 //new value}if (MatrixEnum.clicfg_matrix_trace_fps_report_threshold.name == key) { return 10000}if (MatrixEnum.clicfg_matrix_trace_fps_time_slice.name == key) { return 12000}if (ExptEnum.clicfg_matrix_trace_app_start_up_threshold.name == key) { return 3000}return if (ExptEnum.clicfg_matrix_trace_evil_method_threshold.name == key) { 200} else defInt } override fun get(key: String, defLong: Long): Long {//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.if (MatrixEnum.clicfg_matrix_trace_fps_report_threshold.name == key) { return 10000L}if (MatrixEnum.clicfg_matrix_resource_detect_interval_millis.name == key) { MatrixLog.i(TAG, '$key, before change:$defLong, after change, value:2000') return 2000}return defLong } override fun get(key: String, defBool: Boolean): Boolean {//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.return defBool } override fun get(key: String, defFloat: Float): Float {//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.return defFloat } companion object {private const val TAG = 'Matrix.DynamicConfigImplDemo' }}

1.6 選擇程序啟動的位置對 Matrix 進(jìn)行初始化,如在 Application 的繼承類中, Init 核心邏輯如下:

Matrix.Builder builder = new Matrix.Builder(application); // build matrix builder.patchListener(new TestPluginListener(this)); // add general pluginListener DynamicConfigImplDemo dynamicConfig = new DynamicConfigImplDemo(); // dynamic config // init plugin IOCanaryPlugin ioCanaryPlugin = new IOCanaryPlugin(new IOConfig.Builder() .dynamicConfig(dynamicConfig) .build()); //add to matrix builder.plugin(ioCanaryPlugin); //init matrix Matrix.init(builder.build()); // start plugin ioCanaryPlugin.start();2. 改造Application子類

2.1 模擬Application卡頓

private fun A() {B()H()L()SystemClock.sleep(800) } private fun B() {C()G()SystemClock.sleep(200) } private fun C() {D()E()F()SystemClock.sleep(100) } private fun D() {SystemClock.sleep(20) } private fun E() {SystemClock.sleep(20) } private fun F() {SystemClock.sleep(20) } private fun G() {SystemClock.sleep(20) } private fun H() {SystemClock.sleep(20)I()J()K() } private fun I() {SystemClock.sleep(20) } private fun J() {SystemClock.sleep(6) } private fun K() {SystemClock.sleep(10) } private fun L() {SystemClock.sleep(10000) }

2.2 Application.onCreate()調(diào)用卡頓方法

override fun onCreate() { A()}

2.3 反射獲取ActivityThread的mHandler

override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) println('zijiexiaozhan MyApp attachBaseContext') time1 = SystemClock.uptimeMillis() time3 = System.currentTimeMillis() try { val forName = Class.forName('android.app.ActivityThread') val field = forName.getDeclaredField('sCurrentActivityThread') field.isAccessible = true val activityThreadValue = field[forName] val mH = forName.getDeclaredField('mH') mH.isAccessible = true val handler = mH[activityThreadValue] mHandler = handler as Handler } catch (e: Exception) { }}

2.4 將原來的onCreate的方法調(diào)用轉(zhuǎn)入匿名內(nèi)部類調(diào)用

inner class ApplicationTask : Runnable { override fun run() {A() }}

2.5 重寫Application onCreate方法

override fun onCreate() { super.onCreate() //重點 mHandler.postAtFrontOfQueue(ApplicationTask())}3.運(yùn)行,快速定位

3.1 關(guān)鍵字'Trace_EvilMethod'查找日志

tag[Trace_EvilMethod]type[0];key[null];content[{'machine':'MIDDLE','cpu_app':0,'mem':3822452736,'mem_free':1164132,'detail':'NORMAL','cost':1344,'usage':'0.37%','scene':'default','stack':'0,1048574,1,1344n1,5471,1,1338n2,17582,1,1338n3,17558,1,1338n4,17560,1,379n5,17562,1,160n6,17563,1,17n6,17566,1,20n6,17568,1,20n5,17569,1,20n4,17573,1,56n5,17575,1,21n5,17576,1,5n5,17578,1,10n4,17580,1,102n','stackKey':'17558|','tag':'Trace_EvilMethod','process':'com.peter.viewgrouptutorial','time':1624837969986}]

3.2 解析日志 打印卡頓堆棧

android.os.Handler dispatchMessage 1344.com.peter.viewgrouptutorial.MyApp$ApplicationTask run 1338..com.peter.viewgrouptutorial.MyApp access$A 1338...com.peter.viewgrouptutorial.MyApp A 1338....com.peter.viewgrouptutorial.MyApp B 379.....com.peter.viewgrouptutorial.MyApp C 160......com.peter.viewgrouptutorial.MyApp D 17......com.peter.viewgrouptutorial.MyApp E 20......com.peter.viewgrouptutorial.MyApp F 20.....com.peter.viewgrouptutorial.MyApp G 20....com.peter.viewgrouptutorial.MyApp H 56.....com.peter.viewgrouptutorial.MyApp I 21.....com.peter.viewgrouptutorial.MyApp J 5.....com.peter.viewgrouptutorial.MyApp K 10....com.peter.viewgrouptutorial.MyApp L 102

總結(jié)

到此這篇關(guān)于快速定位Android啟動耗時問題的文章就介紹到這了,更多相關(guān)定位Android啟動耗時內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美人与禽zozo性伦| 国产精品一区二区在线观看| 国产一区二区三区自拍| 欧美一级高清大全免费观看| 另类综合日韩欧美亚洲| 久久久久网站| 一区二区成人在线| 欧美精品亚洲精品| 精品国产三级电影在线观看| 国产成人aaaa| 91精品国产色综合久久久蜜香臀| 久久精品国产秦先生| 91黄色免费网站| 亚洲成人免费影院| 国产精品一区二区在线观看 | 亚洲五码中文字幕| 9色精品在线| 亚洲婷婷综合久久一本伊一区| 国产精品v欧美精品∨日韩| 欧美国产亚洲另类动漫| 欧美一区网站| 国产目拍亚洲精品99久久精品| 99久久精品一区二区| 精品国产一区二区在线观看| 成人av在线播放网址| 精品久久久久久亚洲综合网| 粉嫩aⅴ一区二区三区四区五区| 91精品国产品国语在线不卡| 国产精品影视网| 91精品国产综合久久久久久久 | 日韩毛片一二三区| 亚洲福利久久| 亚洲色图色小说| 欧美三区视频| 国产精品成人免费在线| 在线观看福利一区| 亚洲精品欧美激情| 久久国产精品免费一区| 日本午夜一区二区| 在线综合视频播放| 91亚洲男人天堂| 国产精品乱码一区二区三区软件| 好吊色欧美一区二区三区四区| 亚洲欧美aⅴ...| 销魂美女一区二区三区视频在线| 日日夜夜精品视频免费| 欧美性受极品xxxx喷水| 国产精品一区二区久久不卡| 91精品国产福利| 成人动漫av在线| 国产嫩草影院久久久久| 亚洲一本视频| 亚洲成人先锋电影| 欧美性色aⅴ视频一区日韩精品| 蜜桃视频免费观看一区| 5858s免费视频成人| 99精品国产视频| 亚洲欧美国产毛片在线| 蜜桃av噜噜一区二区三区| 伦理电影国产精品| 精品动漫一区二区三区在线观看| 欧美日韩精品一本二本三本| 亚洲综合无码一区二区| 色欧美日韩亚洲| 国产一区二区三区观看| 久久先锋资源网| 亚洲久久一区| 蜜芽一区二区三区| 欧美大黄免费观看| 一区视频在线| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲在线观看免费视频| 欧美在线免费观看视频| 99久久久免费精品国产一区二区 | 亚洲精品网站在线观看| 久久综合福利| 高潮精品一区videoshd| 亚洲色欲色欲www| 欧美日韩午夜在线| 欧美不卡在线| 亚洲第一精品在线| 日韩免费一区二区三区在线播放| 在线欧美不卡| 激情综合亚洲精品| 久久久久国产精品免费免费搜索| 亚洲人人精品| 国产一区二区导航在线播放| 国产精品国产三级国产aⅴ入口 | 亚洲欧洲精品成人久久奇米网| 久久综合激情| 99视频精品免费视频| 亚洲午夜成aⅴ人片| 欧美成人a视频| 亚洲欧美日韩视频二区| 福利一区二区在线观看| 一区二区三区高清| 欧美一卡二卡三卡四卡| 国产精品久久久久久久久婷婷| 国产盗摄精品一区二区三区在线| 国产精品福利一区| 欧美日韩二区三区| 亚洲国产精品毛片| 国产一区在线精品| 亚洲色图欧美在线| 91.成人天堂一区| 日韩视频在线播放| 从欧美一区二区三区| 亚洲一区二区三区中文字幕| 日韩欧美国产1| 亚洲一区二区四区| av成人动漫在线观看| 日韩av电影免费观看高清完整版 | 麻豆高清免费国产一区| 国产精品久久久久婷婷二区次| 欧美日韩一区不卡| 国产综合精品| 国产米奇在线777精品观看| 最近日韩中文字幕| 日韩亚洲欧美中文三级| 国产精品最新自拍| 成人av网站免费| 毛片av中文字幕一区二区| 亚洲欧洲精品天堂一级| 精品国产电影一区二区| 91黄色免费网站| 99精品福利视频| 91免费观看在线| 韩国欧美一区二区| 亚洲一区二区精品久久av| 中文字幕av资源一区| 日韩免费一区二区| 欧美午夜一区二区三区免费大片| 国产精品国产亚洲精品看不卡15 | 国产三级精品在线不卡| 91小视频免费观看| 国产美女久久久久| 日韩电影在线观看网站| 中文字幕一区二区三区乱码在线 | 国产精品天天看| 欧美成人综合网站| 欧美亚洲国产一区二区三区va | 国产一区二区三区成人欧美日韩在线观看| 99综合电影在线视频| 国产一区二区三区最好精华液| 日韩精品每日更新| 亚洲人成影院在线观看| 久久久久国产一区二区三区四区 | 亚洲成av人在线观看| 亚洲区小说区图片区qvod| 久久亚洲一区二区三区四区| 欧美福利视频导航| 欧美影视一区在线| 美女亚洲精品| 亚洲黄色天堂| 欧美三级在线| 欧美不卡在线| 91麻豆精品一区二区三区| 国产成人午夜精品影院观看视频| 麻豆精品视频在线| 蜜臀91精品一区二区三区| 午夜婷婷国产麻豆精品| 亚洲激情欧美激情| 成人欧美一区二区三区小说 | 1024亚洲合集| 国产精品成人一区二区艾草 | 欧美激情国产日韩| 99国产精品视频免费观看| 国产成人99久久亚洲综合精品| 国产一区二区三区黄视频| 激情久久久久久久久久久久久久久久 | 精品国内片67194| 欧美一区日本一区韩国一区| 欧美日韩五月天| 欧美人伦禁忌dvd放荡欲情| 91高清视频在线| 91福利在线看| 在线观看免费亚洲| 在线观看一区二区视频| 欧美色视频一区| 欧美日韩一二三区| 777色狠狠一区二区三区| 欧美一区二区性放荡片| 日韩欧美一卡二卡| 精品处破学生在线二十三| 久久综合九色欧美综合狠狠| 欧美成人艳星乳罩| 欧美xxxx老人做受| 久久午夜老司机| 国产日产亚洲精品系列| 国产精品美日韩| 亚洲免费在线播放| 一区二区三区不卡在线观看 | 国产人久久人人人人爽| 日本一区二区三区免费乱视频| 亚洲国产高清aⅴ视频| 中文字幕乱码一区二区免费| 中文字幕一区二区视频| 亚洲在线视频免费观看| 日韩中文字幕不卡| 久久99精品国产麻豆不卡|