2

我正在尝试编写一个调试实用程序,当当前 Activity 的视图层次结构中的视图发生更改时,它将采取某些操作(日志记录、屏幕截图等)。此处的更改是任何会导致视图树的视觉表示发生更改的内容:设置 TextView 上的文本、更改 View 上的背景颜色,或在 ViewGroup 中添加/删除子项。

理想情况下,我正在寻找一个 API,它会在这些更改即将发生时通知我以及它们将影响哪些视图/视图子树。

我花了很多时间寻找可能的解决方案,最干净的方法是使用 ViewTreeObserver 的 OnPreDrawListener 和 OnGlobalLayoutListener。当感兴趣的事件发生时,他们似乎会收到通知。但是,它们不提供有关哪些视图受到影响的任何上下文信息。AFAIK 将这些侦听器附加到视图的 ViewTreeObserver 会导致每当视图树中的任何内容发生更改并且无法为单个视图创建隔离的 ViewTreeObserver 时都会触发通知。这意味着我必须在每次通知时遍历整个视图树以确定更改了哪个属性。

另一种方法是对 View 类进行二进制修补,以便它们以类似方法setBackgroundColor或任何其他感兴趣的方法回调我的 API。android-aspectj可以用于此。这里的缺点是这只适用于我编译的类,因此几乎没用,因为我可以直接修改源代码。同样的想法,dexmaker将是一个更完整的解决方案,因为它允许在运行时修补类。然而,在这里,我们遇到了类加载的问题。要修补类,我必须通过我自己的加载它ClassLoader但是所有的 View 类都已经被 Android 加载了。一种解决方案是在创建视图树后克隆它,但不使用库存加载的类,而是使用我自己的修补类。这几乎可以工作,除非应用程序在我的修补到位之前抓取了对视图树的引用。当然,我还必须在每个布局更改事件(添加/删除视图)时重做克隆。我知道这个过程会很慢,但到目前为止它是最透明和最完整的解决方案。

最后,这可能是最困难的方法,有没有办法使用 Android 内置的方法跟踪系统(Traceview)在运行时接收跟踪事件?目前,系统会将跟踪信息转储到 SD 卡上的文件中以供离线处理。这对于我的需求来说显然为时已晚,但如果原生 SDK 中暴露了用于拦截这些事件的钩子,那就太好了。

欢迎任何和所有建议。在这一点上,我什至不是在寻找可移植的解决方案,所以请随意提及任何反射/隐藏的 API 技巧。感谢您阅读这个庞然大物的帖子。

4

0 回答 0