最近的一个需求需要用到系统hide方法,需要安装在android 9.0 (Android P)上。
因为9.0开始,hide方法对反射方法调用做了限制,所以我用到了之前更习惯用的伪造类的方法来解决。
举例:
要用到这个类
我们需要按照同样的路径和类声明在自己的工程中新建一个类:
至于里面的方法,你需要用的你就把方法声明严格复制过来,方法的实现则不用。比如void方法完全可以留空,init方法可以直接return 0;不需要用的方法则可以直接不用要。只要能保证你的调用的地方能编译通过即可。
有同事对这个方法心存疑虑,实际执行的时候到底是执行的系统方法还是你伪造的这个方法呢?
我要肯定的告诉你,执行的是系统方法。
原因是:java类加载的双亲委托模型:
(来源于https://blog.csdn.net/itachi85/article/details/78088701)
(来源于https://www.jianshu.com/p/ba34eb96c45f)
双亲委托模型保证了一个类只会被加载一次。一个应用启动过程中系统创建了一个java虚拟机,然后BootClassLoader加载系统的类,包括java和android的类。这时候系统中的类(比如上面的android.bluetooth.BlutoothCodecConfig)已经加载完成。后面应用启动起来后,运行到调用的地方classloader发现这个类已经加载完成了,就不会再加载。所以我们伪造的这个类压根没有机会被加载。