绕过 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

原文链接:http://weishu.me/2019/03/16/another-free-reflection-above-android-p

推荐阅读更多精彩内容