{"id":13713340,"url":"https://github.com/zhengcx/MethodTraceMan","last_synced_at":"2025-05-06T23:31:50.654Z","repository":{"id":38629347,"uuid":"208237250","full_name":"zhengcx/MethodTraceMan","owner":"zhengcx","description":"用于快速找到高耗时方法，定位解决Android App卡顿问题。通过gradle plugin+ASM实现可配置范围的方法插桩来统计所有方法的耗时，并提供友好的界面展示，支持耗时筛选、线程筛选、方法名筛选等。(A Tool for Discovering High Time-consuming Methods for Android App)","archived":false,"fork":false,"pushed_at":"2021-02-23T08:51:17.000Z","size":3777,"stargazers_count":1643,"open_issues_count":30,"forks_count":216,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-04-08T14:13:06.469Z","etag":null,"topics":["android","asm","gradle-plugin","jank","method","performance","transform"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhengcx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-09-13T09:50:10.000Z","updated_at":"2025-04-06T13:52:36.000Z","dependencies_parsed_at":"2022-07-28T20:38:53.023Z","dependency_job_id":null,"html_url":"https://github.com/zhengcx/MethodTraceMan","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhengcx%2FMethodTraceMan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhengcx%2FMethodTraceMan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhengcx%2FMethodTraceMan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhengcx%2FMethodTraceMan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhengcx","download_url":"https://codeload.github.com/zhengcx/MethodTraceMan/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252787531,"owners_count":21804278,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","asm","gradle-plugin","jank","method","performance","transform"],"created_at":"2024-08-02T23:01:33.172Z","updated_at":"2025-05-06T23:31:45.631Z","avatar_url":"https://github.com/zhengcx.png","language":"Kotlin","funding_links":[],"categories":["Mobile Development"],"sub_categories":["C++/C Toolkit"],"readme":"# MethodTraceMan\n\n\u003cp\u003e\n\u003ca href=\"README.md\"\u003e中文\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\u003ca href=\"README_en.md\"\u003eEnglish\u003c/a\u003e\n\u003c/p\u003e\n\n用于快速找到高耗时方法，定位解决Android App卡顿问题。通过gradle plugin+ASM实现可配置范围的方法插桩来统计所有方法的耗时，并在浏览器提供友好的界面展示，支持耗时筛选、线程筛选、方法名筛选等。\n\n\n## 预览\n\u003cimg src=\"methodtraceman.png\" width:800 height:500/\u003e\n\n\n### 整个项目包括三部分：\n\n1. 方法耗时数据收集部分：通过gradle plugin+ASM在编译时期对所有方法进行插桩收集方法耗时数据，并进行处理\n2. 方法耗时数据展示部分：在浏览器上展示方法耗时数据，并支持耗时筛选、线程筛选、方法名搜索等功能\n3. AndroidStduio插件：用于方便在AndroidStduio顶部栏上快速打开方法耗时数据展示部分【即上面说的第二部分】\n\n### 实现及原理\n详见我的博客：[App流畅度优化：利用字节码插桩实现一个快速排查高耗时方法的工具](https://juejin.im/post/6844903975142047758)\n\n\n## QuickStart\n\n### Step1 集成与配置\n\n#### root project `build.gradle`\n\n```groovy\nbuildscript {\n    repositories {\n        google()\n        jcenter()\n        maven { url 'https://jitpack.io' }\n        maven { url \"https://plugins.gradle.org/m2/\" }\n    }\n    dependencies {\n        classpath \"gradle.plugin.cn.cxzheng.methodTracePlugin:tracemanplugin:1.0.4\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url 'https://jitpack.io' }\n        maven { url \"https://plugins.gradle.org/m2/\" }\n    }\n}\n```\n\n#### app module project `build.gradle`\n\n```groovy\ndependencies {\n  debugImplementation 'com.github.zhengcx:MethodTraceMan:1.0.7'\n  releaseImplementation 'com.github.zhengcx:MethodTraceMan:1.0.5-noop'\n}\n\napply plugin: \"cn.cxzheng.asmtraceman\"\ntraceMan {\n    open = true //这里如果设置为false,则会关闭插桩\n    logTraceInfo = false //这里设置为true时可以在log日志里看到所有被插桩的类和方法\n    traceConfigFile = \"${project.projectDir}/traceconfig.txt\"\n}\n```\nrelease包下依赖的是noop包，里面不会做任何操作，也不会增加包大小。\n\n\n#### 在app module的根目录下创建一个名叫`traceconfig.txt`的配置文件，并在里面对插桩范围进行配置\n下面是配置示例：\n```txt\n#配置需插桩的包,如果为空，则默认所有文件都进行插桩(config the package need to trace,If they are empty, all files are traced by default.)\n-tracepackage cn/cxzheng/asmtraceman\n\n#在需插桩的包下设置无需插桩的包(Setting up traceless packages under packages that require trace)\n#-keeppackage cn/cxzheng/asmtraceman/test\n\n#在需插桩的包下设置无需插桩的类(Setting up traceless classes under packages that require trace)\n#-keepclass cn/cxzheng/asmtraceman/MainActivity\n\n#插桩代码所在类,这里固定配置为：cn/cxzheng/tracemanui/TraceMan(Fixed configuration here: cn/cxzheng/tracemanui/TraceMan)\n-beatclass cn/cxzheng/tracemanui/TraceMan\n```\n\n**注意：** -tracepackage 后面是需要改成你自己项目中想配置插桩范围的包名，以斜杆分割如cn/cxzheng/asmtraceman,错误示范:cn.cxzheng.asmtraceman\n\n#### 在AndroidManifest.xml中检查是否开启了网络权限，如果没有的话，请开启网络权限\n```xml\n\u003cuses-permission android:name=\"android.permission.INTERNET\" /\u003e\n\u003cuses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /\u003e\n \u003cuses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /\u003e\n```\n\n#### 最后，Rebuild项目并运行安装你的app,所有方法就会进行耗时插桩\n\n\n### Step2 安装AndroidStduio辅助插件: MethodTraceMan\n\n这个插件的主要功能是可以在AndroidStduio上快速方便的打开methodtraceman的UI界面，这个插件已上传AndroidStduio的插件仓库，你可以通过在AndroidStduio插件库中搜索`MethodTraceMan`来安装这个插件，当然在项目的aspluin目录下也提供了该插件的jar包，具体如何安装AndroidStduio插件，这里就不细说了，可以在网上搜索，安装好之后重启AndroidStduio，就可以在顶部栏看到MethodTraceMan插件的黄色灯泡💡图标了，集成和安装到这里就介绍完毕了，下面我会介绍MethodTraceMan如何使用。\n\n安装后重启，图如下：\n\n**注意：** 如果重启AndroidStduio后在顶部栏没发现小灯泡图标，请检查AndroidStduio顶部栏View-\u003eToolbar是否勾选上。\n\n\u003cimg src=\"aspluginicon.png\" width:400 height:250/\u003e\n\n### Step3 使用介绍\n完成上面两步后，确保已完成：\n\n1. 按要求集成后，Rebuild\u0026Run 启动你的App\n2. AndroidStduio上已安装好MethodTraceMan插件\n\n接下来会介绍如何使用MethodTraceMan来方便的排查高耗时的方法：\n\n#### 1.将手机通过Usb连接电脑，确保连接成功。\n\n#### 2.启动APP后，此时点击AndroidStduio顶部栏的MethodTraceMan灯泡小图标，则会在浏览器上打开MethodTraceMan的UI界面如下：\n\n\u003cimg src=\"img/startui.png\" width:600 height:350/\u003e\n\n\n#### 3.点击“开始方法耗时统计按钮”，然后开始随意操作你的app\n\u003cimg src=\"img/startwork.png\" width:600 height:350/\u003e\n\n#### 4.操作完app后，点击“结束方法耗时统计”按钮，此时会输出所有方法的耗时统计，你可以进行耗时筛选、线程筛选、方法名搜索等进行筛查\n\u003cimg src=\"img/endwork.png\" width:600 height:350/\u003e\n\n\u003cimg src=\"img/result.png\" width:600 height:350/\u003e\n\n\n## 问题排障\n\n日志排障详见：\u003ca href=\"问题排障.md\"\u003e问题排障\u003c/a\u003e\n\n**注意事项：**\n* 请不要同时打开两个集成了此项目的App,会导致耗时数据无法传送到浏览器的UI界面\n* 请不要同时连接两个手机，会导致浏览器打开界面失败\n* 集成进自己的项目的话，请务必记得将traceconfig.txt中 -tracepackage配置成自己想插桩的包范围\n* 如果重启AndroidStduio后在顶部栏没发现小灯泡图标，请检查AndroidStduio顶部栏View-\u003eToolbar是否勾选上\n\n**若升级AndroidStduio4.x后安装此plugin报错提示：Plugin is incompatible (supported only in IntelliJ IDEA).**\n\n解决方案：\n\n1.cd到AndroidStduio安装目录下的plugins文件夹下，如/Users/xxx/Library/ApplicationSupport/Google/AndroidStudio4.x/plugins\n\n2.删除此文件夹下的methodtraceman-plugin.jar\n\n3.重启AndroidStduio，重新安装此插件即可。\n\n\n\n## End 欢迎Star/Fork/Issue.\n\n**集成及使用过程中有任何问题或者建议，欢迎与我进行交流，谢谢**\n\n\n\n## License\n\nApache2.0.\n\n\n## About Me\n\n- 博客: [舒大飞](https://juejin.im/user/2313028194537566/posts)\n- Github: [DavidSu](https://github.com/zhengcx)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhengcx%2FMethodTraceMan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhengcx%2FMethodTraceMan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhengcx%2FMethodTraceMan/lists"}