简介
在 Android 11 上,Android 运行时 (ART) 引入了一个名为 Structural Class Redefinition (类的结构性重定义) 的 JVMTI API 扩展。本文将介绍类的结构性重定义的功能,并介绍在实现该功能所遇到的问题,包含我们对问题的思考、权衡及解决方案。类的结构性重定义是一个运行时功能,它扩展了 Android 8 中引入的重定义类方法,Android Studio 里的 Apply Changes 可以通过它来改变类的自身结构,并可以在类中增加变量或者方法。
这可以被用在很多强大的功能中,例如扩展 Apply Changes 来支持向应用中增加新的资源。您可以查看相关文档了解 Android Studio ‘Apply Changes’ 功能的工作机制,以及在后续博客中了解其如何使用类的结构性重定义进行扩展。未来 Android Studio 会增加更加综合和功能强大的工具来适配这些新的特性。
JVMTI 是一个标准的 API,开发工具可以通过它在底层与运行时环境进行交互和控制。利用该功能实现了很多我们熟知的开发工具,从 Android Studio 中的 Network 及 Memory 分析器,到调试器中的模拟框架,如 dexmaker-mockito-inline、MockK,再到 Layout 以及 Database 检查器。您可以在 Android 文档中找到更多关于 Android JVMTI 的实现以及如何将其应用于您自己的工具中。
查看相关文档
https://medium.com/androiddevelopers/android-studio-project-marble-apply-changes-e3048662e8cd
Network
https://developer.android.google.cn/studio/profile/network-profiler
Memory
https://developer.android.google.cn/studio/profile/memory-profiler
dexmaker-mockito-inline
https://medium.com/androiddevelopers/mock-final-and-static-methods-on-android-devices-b383da1363ad
MockK
https://mockk.io/
Android 文档
https://source.android.google.cn/devices/tech/dalvik/art-ti
结构化重定义
类的结构性重定义基于 Android Oreo (8.0) 中增加的重定义类进行改进。在 Oreo 中,仅有类中已有的方法才能被修改。类中定义的对象布局以及字段集、方法集不能以任何方式进行修改。
类的结构性重定义对类的修改提供了更高的自由度,使已有类中添加全字段和方法成为了可能,对可能新增的字段及方法的类型没有任何限制。新增的字段初始值为 0 或 null