文章预览
最近工作需要,反射了一下 android.app.QueuedWork 这个类,但是这个类的一些 Field 在Android P之后是不允许APP反射的,所以需要通过一些绕过系统限制的方法。借此机会了解了一下各个绕过hide限制的反射方案。 原理 我们先从原理上理解为什么Android可以实现限制我们反射某个api,反射不是Java的基础功能吗。以 getDeclaredMethod 为例,他最后会调用 java_lang_Class.cc 里的 Class_getDeclaredMethodInternal : 这里如果 ShouldDenyAccessToMember 返回true,那么就直接返回null了。所以Android就是修改了这部分的代码来加上访问限制。他会调用一个重载函数,传入 getHiddenapiAccessContextFunction 函数,这个函数会直接调用获取调用方的上下文。重载的 ShouldDenyAccessToMember 代码比较长,我直接把流程梳理成流程图: 所以我们只要弄清楚Context的domain和每个domain的规则是什么,基本就能弄清
………………………………