绕过|绕过 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
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备