隐藏 API 的调用有「豁免」条件,即只要它是豁免的,则即使它在黑名单中,也会被放行。这种方式暴露给了 Java 层,因此可以通过 VMRuntime.setHiddenApiExemptions 方法来实现。再结合上面这个方法,我们只需要通过 「元反射」 来反射调用 VMRuntime.setHiddenApiExemptions 就能将我们自己要使用的隐藏 API 全部都豁免掉了。另外系统在检查豁免时是通过方法签名进行前缀匹配的,而 Java 方法签名都是 L 开头的,因此我们可以把直接传个 L 进去,那么所有的隐藏API全部被赦免了!
/** * make the method exempted from hidden API check. * * @param method the method signature prefix. * @return true if success. */ publicstaticbooleanexempt(String method){ return exempt(new String[]{method}); }
/** * make specific methods exempted from hidden API check. * * @param methods the method signature prefix, such as "Ldalvik/system", "Landroid" or even "L" * @return true if success */ publicstaticbooleanexempt(String... methods){ if (sVmRuntime == null || setHiddenApiExemptions == null) { returnfalse; }