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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions