前言

项目升级到Android Pie(9),需要考虑适配问题.在此做个总结.
Android 9 增加了对非SDK接口访问的限制,无论你是直接访问还是通过反射,JNI等间接访问,都是会被限制的.


SDK接口和非SDK接口有啥区别?

SDK接口是那些官方支持的,Android framework 文档中可以找的.Android framework Package index .那非SDK接口就自然是相反的意思了.


非SDK接口的级别

非SDK接口很对,Google对它按限制程度进行了分类,分为light-greylist(浅灰列表),dark-greylist(深灰列表),blacklist(黑列表). 颜色的加深,限制程度也是随之加深.

  1. 对于light-greylist,非SDK接口的Methods/fields 还可以继续使用
  2. 对于dark-greylist,应用的target SDK version 小于28的,非SDK接口还是可以继续使用的,但是如果target Sdk version 大于等于28的话,就不能用了,会抛exception 如:NoSuchMethodError/NoSuchFieldException.
  3. 对于blacklist 无论你的target SDK version 是多少,都不能用非SDK接口.否则就会出现异常.

注意
对于light-greylist和dark-greylist,他们都属于grey,灰色的,虽然现在在Android 9上还可以使用,但是在之后的版本中,不能保证还可不可以继续用,没准,现在在grey list里的下个版本就被Google移到 black list列表里面了

继续使用非SDK接口导致的结果

上面其实说的也比较清楚了,就是出现异常.下面的表也描述的更具体点

访问方式 结果
Dalvik指令 引用一个field NoSuchFieldError thrown
Dalvik指令 引用一个method NoSuchMethodError thrown
通过Class.getDeclaredField() or Class.getField()反射 NoSuchFieldException thrown,Non-SDK members not in results
通过Class.getDeclaredMethod(), Class.getMethod()反射 NoSuchMethodException thrown,Non-SDK members not in results
JNI 通过 env->GetFieldID()方式 NULL returned, NoSuchFieldError thrown
JNI 通过 env->GetMethodID()方式 NULL returned, NoSuchMethodError thrown

非SDK接口列表

上面说说了,有三种非SDK接口列表,如果我们想知道这些列表里面的具体有哪些内容,可以进入Google提供的列表索引里去查看,看看具体是哪些限制的method,field.

  1. 浅灰列表(light-greylist)
  2. 深灰列表(dark-greylist)
  3. 黑列表(blacklist)

定位非SDK接口

  1. 你可以在Android 9的设备上面运行你的app,如果你的APP有访问非SDK接口的话,会打印出相关的log信息,来帮助你定位,解决非SDK接口问题.log的信息样式如下:
    Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

  2. Android 9 支持通过使用StrictMode的相应Api来检测非SDK接口的使用.通过使用detectNonSdkApiUsage 方法来启用检测功能,检测功能的启用越早启用越好,官方建议是在application的onCreate方法中调用.关于使用这个方法来检测非SDK接口的调用,大家可以自行去源码中看该方法的使用,有注释说明,很容易上手,在此就不再赘述.

  3. 通过Google提供的检测分析工具veridex来,检测非SDK接口的使用情况.veridex的下载地址如下:
    veridex download address

我的平台的是Linux的,所以把veridex-linux.zip 解压后,cd 进入,使用./appcompat.sh --dex-file = test.apk(apk file location) 命令即可完成检测.
效果如下:

从veridex下载列表上面只看到了适合Linux平台的,Mac平台的veridex压缩包,没看到Windows的,网上有看到说Windows平台的不能用这个工具,但是这边试了与veridex-linux.zip同级目录下的appcompat.sh脚本,发现也可以实现相同的检测效果.所以有点怀疑,但是没有Windows的设备来测试,如果有试过的可以把结果告知一下.

结语

定位了解到项目中非SDK接口的使用情况后,就可以做出对应的调整,完成适配,避免crash.如果必须要用某种非SDK接口的话,可以向Google提出申请,请求地址如下:
https://issuetracker.google.com/issues/new?component=328403&template=1027267

Android 开发---对非SDK接口限制的适配相关推荐

  1. Android P版本非SDK接口管控特性,参考华为

    Android P版本非SDK接口管控特性解读及适配指导 在Android P版本中,谷歌加入了非SDK接口使用限制,无论是通过调用.反射还是JNI等方式,开发者都无法对非SDK接口进行访问,此接口的 ...

  2. Android 9 的非 SDK 接口限制 | 中文教学视频

    我们一直致力于为 Android 用户和开发者提供稳定的体验.秉持这种理念,我们逐步限制应用使用非公开接口,因为这种做法往往导致用户遭遇系统崩溃及开发者需要紧急发布修复的风险.在 Android 8. ...

  3. Android P (4)一种绕过Android P上非SDK接口限制的简单方法

    一种绕过Android P上非SDK接口限制的简单方法 众所周知,Android P 引入了 针对非 SDK 接口(俗称为隐藏API)的使用限制.这是继 Android N上 针对 NDK 中私有库的 ...

  4. Android P 访问非SDK 接口

    Android P 如何访问非SDK 接口 为什么要访问非SDK 接口? 为了让应用能获得更多的系统属性.资源,扩展功能等. 在Android P 之前,我们可以使用反射来访问系统内部分 hide/p ...

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

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:天才木木链接:https://www.jianshu.com/p/efe6690b36b6 ...

  6. 一种绕过Android P对非SDK接口限制的简单方法

    众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制.这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次重大调整.从今以后,不论是native层 ...

  7. Android 非 SDK 接口常见问题

    常规问题 Q1: 什么是非 SDK 接口? A:非 SDK 接口指不在官方Android SDK涵盖范围内的 Java 字段和方法.此类接口是 SDK 的内部实现细节,可能随时会被修改,且不对开发者另 ...

  8. Android P非SDK接口限制

    写在前头 Android Pie(API 28)开始对非SDK接口的使用开始做了限制.只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,就会被限制.这些限制旨在帮助提升用户体验和开发 ...

  9. Android 10 中有关限制非 SDK 接口的更新

    Android 10 中有关限制非 SDK 接口的更新 目录 浅灰和深灰列表的命名发生变化 非 SDK 接口的代码注释 在 Android 10 中授予对非 SDK 接口的访问权限 Android 1 ...

最新文章

  1. 【数据结构】单链表的逆序输出(两种方法)
  2. 数据库归档及热点库_postgresql连续归档及时间点恢复的操作
  3. 电子技术基础三_电子技术基础
  4. centos cmake安装mysql_Centos安装mysql实例教程
  5. BOOST_VMD_ASSERT_IS_SEQ宏相关的测试程序
  6. PHP中abstract 和 interface的区别
  7. java里的关键字有什么用_java语言关键字有哪些?都有什么用处?
  8. 关于Application.Lock和Lock(obj)
  9. freemarker 从 spring boot execute jar可执行jar中访问模板文件
  10. python网络编辑 socket篇
  11. android封装aidl接口,Android远端接口AIDL及服务回调用法
  12. 【转载】细说 ASP.NET Cache 及其高级用法
  13. ORACLE HANDBOOK系列之五:PL/SQL中的集合类型(Collections in PL/SQL)
  14. mysql写系统_一个用PHP和MYSQL写的定饭系统_PHP
  15. linux安装界面键盘失灵,安装win7鼠标键盘失灵怎么办_win7安装界面鼠标键盘失灵解决方法【147下载站】...
  16. 20 行 Python 代码批量抓取免费高清图片!
  17. 小米手环6天空人天气表盘
  18. xxx学校/学院/大学信息管理系统
  19. OSChina 周四乱弹 —— OSC妙龄少女@饺子君如何被捕获的?
  20. FIR数字滤波器设计(中)

热门文章

  1. 一次partition过程一(挖坑填数法)
  2. 计算机应用及网络安全论文,计算机应用技术专业毕业论文--计算机网络安全与防范.doc...
  3. vue引用矢量阿里图标iconfont详细步骤
  4. 人工智能帮助科学家预测地震
  5. Rosetta基础1:centos8安装Rosetta
  6. inventor2五子棋游戏apk_联机五子棋手机版下载|联机五子棋游戏下载v1.3.2 安卓版_ 单机手游网...
  7. 终极USB示波器PicoScope 6000系列
  8. 如何判断页面是通过PC端还是移动端访问?
  9. 安防视频上云的趋势、痛点及华为云视频接入服务探索及实践
  10. 联想m8000t安装windows2003蓝屏的解决方法