1、如何规避Android P对私有API的访问限制
● Android:Pie — 9.0 — 28
● 一般都是通过反射访问私有 API
1.1、私有API
(1)hide public
hide public方法无法直接使用,可以自行编译系统源码,并导入项目工程,从而访问到。
比如 convertFromTranslucent() 是 Acticity 中的方法,我们可以直接把 Activity 的源码放到工程里,就可以访问到这个方法。
(android.jar编译的Activity中没有convertFromTranslucent()方法,我们可以自己搞一个privaded.jar把系统源码搞过来,就可以骗过编译器,运行时加载的那个类里面肯定是有这个方法的)
(2)private
private 彻底访问不到,只能通过反射。
Method initMethod = AssetManager.class.getDeclaredMethod("init");
initMethod.setAccessible(true);
反射:1)不仅可以绕过访问权限控制 2)还可以修改final变量
1.2、Android P 的API名单
● 白名单中的API:谁都能用
● 浅灰名单中的API:反射可用
● 深灰名单中的API:SDK < 28,允许使用;SDK >= 28,不允许使用,同黑名单
● 黑名单中的API:反射不可用。如 getDeclaredField()、getDeclaredMethod() 获取不到任何东西