
文章目录
https://blog.csdn.net/u011016373/article/details/82863710
代理可以实现方法增强,也可以实现方法拦截,通过代理方法修改原方法的参数和返回值

静态代理
自定义一个类implements实现某个接口里面的方法
这种方式需要为每个代理写一个自定义类,而且无法拦截
动态代理
JVM在运行的时候动态生成一系列代理类
就是hook方法
先找点需要hook的对象,静态变量或单例
注意jdk动态代理只能代理接口,所以想代理类的话需要先手写静态代理类覆盖掉原始的方法
使用Class.forName(“模块名.包名.类名.类型名”)可以获取某个参数类型类
比如Class.forName(“android.net.wifi.IWifiManager”);

类名.class.getDeclaredField(“变量名”);可以获取某个类里的变量
比如
serviceField = WifiManager.class.getDeclaredField(“mService”);
这个mService变量的类型是IWifiManager
可以设置下这个变量的可控性
serviceField.setAccessible(true);
这个IManager类型的service获取了
但是实际的WiFi管理器是使用app上下文从系统服务里获取的
然后使用这个IWifiManager服务变量获取app的原生wifiobj,把这个wifiobj传入自定义的操作触发器获取到自定义的触发器的代理实例
之后使用Imanager类型的服务变量的set方法,传入获取到的现有的WiFi管理器和使用这个WiFi管理器的WiFiobj重构的WiFi管理器
新的WiFi管理器是需要使用反射类里的代理方法重构处理的,需要传入WiFi服务变量的缓存,这个WiFi服务的新的类实例和自定义的重构的WiFi服务被触发的时候的方法才可以得到真正的WiFi控制器类
现在要动态代理的是getHardwareAddress方法,这个方法由什么在控制呢
这个方法在NetworkInterface。java里
所以我们需要替代的是这个类,然后重新里面获取硬件信息的方法
原理
Subject subject = new RealSubject();
ProxySubject proxy = new ProxySubject(subject);
Subject sub = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(),
subject.getClass().getInterfaces(), proxy);
sub.operation();
public class ProxySubject implements InvocationHandler

博客探讨了安卓动态代理的实现,包括静态代理和动态代理的原理,并着重讲解了如何利用动态代理hook方法,尤其是getHardwareAddress。文章提到了在Android中动态代理广泛应用于系统服务的获取,通过代理可以实现方法增强和拦截。同时,文中详细阐述了获取Mac地址的流程,涉及到NetworkInterface类和相关方法。此外,还讨论了libcore.io.Libcore在动态代理中的作用和MzPush SDK对隐私的影响。
最低0.47元/天 解锁文章
851

被折叠的 条评论
为什么被折叠?



