-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Description
最近因为项目需要集成一个 APM 工具,因此下载了源码折腾了一周,不知道该项目还有没有人维护,因此提出我发现的一些问题:
-
demo 版本限制在 API 31, 调整到 API 33 点击工具中的 cpu 等模块时报错权限未授权,查看相关代码发现请求获取存储权限,然后在此过程中好像并未发现有啥文件写入过程,而是回调将路径抛到初始化的监听中,而且路径也是为应用的沙盒路径,完全没必要进行权限请求
-
插件的相关开启配置必须写在全局的 gradle.properties, 这一点是非常奇怪的,因为本身就有
DoKitExtension
配置参数,文档中描述 plugin 的transform
注册必须早于project.afterEvaluate
,所以无法通过原先的配置项拿到配置信息。我试了的确如此,如果在 project.afterEvaluate 中注册 transform 会导致其无法正常执行,因此我转换了思路,可以直接注册,但是在 transform 中判断相关插件的开关状态,同时开关的状态在project.afterEvaluate 后进行赋值,我按此思路进行了改动:

测试动态修改 dokit { }
闭包中参数是可以实时生效的,这个插件体验会好很多,但是还有一个问题就是 dependNewInstance()
这个 transform 的注册,因为我对 MSDClassTransformer
的内部逻辑不是很了解,如果能实现 MSDClassTransformer
无参,编译时从 DoKitExtUtil
中获取相关参数值,同时实现原有的逻辑,即可去除通过 gradle.properties 配置插件开关。
但是这个方案有个弊端就是所有的 transform 都会被注册,如果开关是关闭的就不会执行相关的插桩逻辑,理论上对编译时间的影响应该也不是非常的大,同时对比原实现还有一个非常好的点,动态修改某些插件的开关,无需 clean 一下重新编译即可生效,所有的 transform 都会被注册执行带来的时间消耗对比 clean 所需的时间简直不值一提,特别是越大的项目重新编译时间越长,而且也是越大的项目才需即可 APM 这类工具观察应用相关性能数据,所以官方如果还有维护的开发者希望可以看看这个方案,顺便解决一下 MSDClassTransformer 这个里面的问题。
https://github.com/Heart-Beats/DoKit/tree/dev_zhanglei 这个是我这边修改提交的分支,可以使用这个修改进行调试。