繞過 Android P以上非公開API反射的限制

????網(wǎng)上有很多講述如何避開Android P以上非公開API反射的限制的方法,用起來也很好用。但是基本上都是需要在gradle中添加引用,然而實際上實現(xiàn)的代碼并不多。

????我們完全可以直接在項目中加一個工具類就夠了,而好一些的方式許多還使用了JNI來做,還有一些C/C++寫的代碼,但這并不是我們想要的。

????所以在參考文末的文章后,整理了一個工具類,真實代碼真的不多,只需要在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});

項目地址:https://github.com/hxgJG/ForceReflect

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容