适配Android P之非SDK接口限制的排查方法

  • Android,Anroid适配,非SDK接口

从 Android P(API 28)开始,Google 限制了开发者对非 SDK 的调用的限制,受影响的是一些利用反射和 JNI 调用实现的一些黑科技。

由于 Android 开源的属性,以及基于 Java 虚拟机设计的特性,导致 Android 开发者在开发的过程中,为了达到一些目的,可以通过反射或者 JNI 调用的方式,访问 Android SDK 中未公开的 API。这种办法,虽然短时间内解决了开发者的需求问题,但是从长久来看,不利于 Android 的良好发展。

在 Android P ,Google 分别设置了白名单(whitelist)、灰名单(greylist)、黑名单(blacklist)三个名单。

  • 白名单 可以正常访问
  • 灰名单 可以正常访问,但是再未来可能会被移动到黑名单
  • 黑名单 会抛出异常,需要开发者进行异常捕获,并且考虑其他替代方案

在 Android 10.0 之后,名单机制又进行了部分修改,

  • greylist 可以正常访问
  • blacklist 抛异常,需要修改
  • greylist-max-o 运行在 <= 8.0 的系统上,可以正常访问,在 target > 8.0 或者手机系统 > 8.0 会抛异常
  • greylist-max-p 运行在 <= 9.0 的系统上,可以正常访问,在 target > 9.0 或者手机系统 > 9.0 会抛异常

限制的表现

  • Dalvik 指令引用某个字段 抛出 NoSuchFieldError
  • Dalvik 指令引用某个方法 抛出 NoSuchMethodError
  • 通过 Class.getDeclaredField() 或 Class.getField() 抛出 NoSuchFieldException
  • 通过 Class.getDeclaredMethod() 或 Class.getMethod() 抛出 NoSuchMethodException
  • Class.getDeclaredFields()、Class.getFields() 结果中不包含非 SDK 成员
  • Class.getDeclaredMethods()、Class.getMethods() 结果中不包含非 SDK 方法
  • env->GetFieldID() 返回 NULL,抛出 NoSuchFieldError
  • env->GetMethodID() 返回 NULL,抛出 NoSuchMethodError

检查

Google 提供了一个 veridex 工具包,通过这个工具,可以列出你的应用有多少地方调用了非 SDK API。

由于普通开发者一般是不会去做这些黑科技的事情的,所以大部分会出现在第三方库中,包括 Android Support 包也有可能,解决的办法就是升级、升级、升级。

阅读原文 : 适配Android P之非SDK接口限制的排查方法 https://www.jianshu.com/p/efe6690b36b6

- EOF -

本文链接 https://spacepage.top/archives/2019.08.23-适配AndroidP之非SDK接口限制的排查方法.html,欢迎转载,转载请注明出处。

友情链接
网站统计
  • 网站已运行:42天
  • 文章总数:60 篇