????網(wǎng)上有很多講述如何避開Android P以上非公開API反射的限制的方法秦士,用起來也很好用票顾。但是基本上都是需要在gradle中添加引用森爽,然而實(shí)際上實(shí)現(xiàn)的代碼并不多。
????我們完全可以直接在項(xiàng)目中加一個工具類就夠了嘀粱,而好一些的方式許多還使用了JNI來做激挪,還有一些C/C++寫的代碼辰狡,但這并不是我們想要的。
????所以在參考文末的文章后垄分,整理了一個工具類宛篇,真實(shí)代碼真的不多,只需要在Application的attachBaseContext()中調(diào)用unseal()方法即可薄湿。
下面貼出了部分關(guān)鍵代碼叫倍,后面有Demo的鏈接,這個工具類經(jīng)過測試豺瘤,可以在9.0以上系統(tǒng)自由使用反射了吆倦。具體原理文末的文章中大神講的很清楚了。
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});
項(xiàng)目地址:https://github.com/hxgJG/ForceReflect
原文鏈接:http://weishu.me/2019/03/16/another-free-reflection-above-android-p