绕过|绕过 Android P以上非公开API反射的限制

网上有很多讲述如何避开Android P以上非公开API反射的限制的方法,用起来也很好用。但是基本上都是需要在gradle中添加引用,然而实际上实现的代码并不多。
我们完全可以直接在项目中加一个工具类就够了,而好一些的方式许多还使用了JNI来做,还有一些C/C++写的代码,但这并不是我们想要的。
所以在参考文末的文章后,整理了一个工具类,真实代码真的不多,只需要在Application的attachBaseContext()中调用unseal()方法即可。
下面贴出了部分关键代码,后面有Demo的链接,这个工具类经过测试,可以在9.0以上系统自由使用反射了。具体原理文末的文章中大神讲的很清楚了。

Method forName = Class.class.getDeclaredMethod("forName", String.class); Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class); Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime"); Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null); setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[]{String[].class}); vmRuntime = getRuntime.invoke(null);

@SuppressLint("PrivateApi") Method setHiddenApiEnforcementPolicy = ApplicationInfo.class .getDeclaredMethod("setHiddenApiEnforcementPolicy", int.class); setHiddenApiEnforcementPolicy.invoke(applicationInfo, 0);

setHiddenApiExemptions.invoke(vmRuntime, new Object[]{methods});

项目地址:https://github.com/hxgJG/ForceReflect
【绕过|绕过 Android P以上非公开API反射的限制】原文链接:http://weishu.me/2019/03/16/another-free-reflection-above-android-p

    推荐阅读