Skip to content

Android 版本集成的一些问题和优化建议 #1204

@Heart-Beats

Description

@Heart-Beats

最近因为项目需要集成一个 APM 工具,因此下载了源码折腾了一周,不知道该项目还有没有人维护,因此提出我发现的一些问题:

  1. demo 版本限制在 API 31, 调整到 API 33 点击工具中的 cpu 等模块时报错权限未授权,查看相关代码发现请求获取存储权限,然后在此过程中好像并未发现有啥文件写入过程,而是回调将路径抛到初始化的监听中,而且路径也是为应用的沙盒路径,完全没必要进行权限请求

  2. 插件的相关开启配置必须写在全局的 gradle.properties, 这一点是非常奇怪的,因为本身就有 DoKitExtension 配置参数,文档中描述 plugin 的transform 注册必须早于 project.afterEvaluate,所以无法通过原先的配置项拿到配置信息。我试了的确如此,如果在 project.afterEvaluate 中注册 transform 会导致其无法正常执行,因此我转换了思路,可以直接注册,但是在 transform 中判断相关插件的开关状态,同时开关的状态在project.afterEvaluate 后进行赋值,我按此思路进行了改动:

Image

测试动态修改 dokit { } 闭包中参数是可以实时生效的,这个插件体验会好很多,但是还有一个问题就是 dependNewInstance() 这个 transform 的注册,因为我对 MSDClassTransformer 的内部逻辑不是很了解,如果能实现 MSDClassTransformer 无参,编译时从 DoKitExtUtil 中获取相关参数值,同时实现原有的逻辑,即可去除通过 gradle.properties 配置插件开关。

但是这个方案有个弊端就是所有的 transform 都会被注册,如果开关是关闭的就不会执行相关的插桩逻辑,理论上对编译时间的影响应该也不是非常的大,同时对比原实现还有一个非常好的点,动态修改某些插件的开关,无需 clean 一下重新编译即可生效,所有的 transform 都会被注册执行带来的时间消耗对比 clean 所需的时间简直不值一提,特别是越大的项目重新编译时间越长,而且也是越大的项目才需即可 APM 这类工具观察应用相关性能数据,所以官方如果还有维护的开发者希望可以看看这个方案,顺便解决一下 MSDClassTransformer 这个里面的问题。

https://github.com/Heart-Beats/DoKit/tree/dev_zhanglei 这个是我这边修改提交的分支,可以使用这个修改进行调试。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions