有时候会用到一些系统api,在P 上使用反射或者使用classes.jar 调用@hide api接口的时候会报找不到method的错误
java.lang.NoSuchMethodError: No static method getInstance()Lcomxxxxxxxxxxxxxxxxx
这是Android 新的安全机制吧。
可通过以下方式进行绕过
在调用@hide api接口前先调用一下VMRuntime.setHiddenApiExemptions
try {
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);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[]{String[].class});
Object sVmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(sVmRuntime, new Object[]{new String[]{"L"}});
} catch (Throwable e) {
Log.e("[error]", "reflect bootstrap failed:", e);
}