android invoke hidden API

String classpath = "android.content.pm.parsing.ParsingPackageUtils";
getAssistClass(classpath).getDeclaredMethod("readKeySetMapping", Parcel.class);

报错,接口被hidden

01-20 10:31:53.467  3929  3964 W eHandlerServic: Accessing hidden method Landroid/content/pm/parsing/ParsingPackageUtils;->readKeySetMapping(Landroid/os/Parcel;)Landroid/util/ArrayMap; (blacklist, reflection, denied)
01-20 10:31:53.469  3929  3964 E CVE_2021_0921: Get method failed
01-20 10:31:53.469  3929  3964 E CVE_2021_0921: java.lang.NoSuchMethodException: android.content.pm.parsing.ParsingPackageUtils.readKeySetMapping [class android.os.Parcel]
01-20 10:31:53.469  3929  3964 E CVE_2021_0921: 	at java.lang.Class.getMethod(Class.java:2072)
01-20 10:31:53.469  3929  3964 E CVE_2021_0921: 	at java.lang.Class.getDeclaredMethod(Class.java:2050)

这种情况可以:

1.直接用invoke,例子如下

String classpath = "android.content.pm.parsing.ParsingPackageUtils";
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
getDeclaredMethod.invoke(getAssistClass(classpath),"readKeySetMapping", new Class[]{Parcel.class});

2.使用VMRuntime的setHiddenApiExemptions豁免所有hidden接口,例子如下

// 豁免所有hidden接口
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
Class<?> vmRuntimeClass = getAssistClass("dalvik.system.VMRuntime");
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[]{String[].class});
setHiddenApiExemptions.setAccessible(true);
//获取VMRuntime类对象实例
VMRuntime objRuntime = VMRuntime.getRuntime();
//setHiddenApiExemptions是hidden接口,只能用反射
setHiddenApiExemptions.invoke(objRuntime,new Object[]{new String[]{"L"}});
Log.d(TAG, "invoke ok");

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...