概述

首先需要说明的是,“对使用非SDK接口的限制”是针对所有应用的。此限制是从9.0(28)开始引入的,只要是运行在9.0及以上系统的app都会有此限制,无论app适配的targetSDKVersion是多少。
9.0、 10、 11版本对非SDK接口的限制是越来越严格。下面是官方文挡,说的很详细。

9.0非SDK接口
Android 10 中有关限制非 SDK 接口的更新
Android 11 中有关限制非 SDK 接口的更新
针对非 SDK 接口的限制

有条件屏蔽 (greylist-max-x)

这个概念需要解释说明一下,以greylist-max-o为例,o表示的是8.0(27)。
greylist-max-o名单中的非SDK接口,App可以在<=8.0的系统上正常访问,无论App的targetSDKVersion是多少。App targetSDKVersion>8.0并且运行在系统>8.0访问此灰名单接口会抛出异常。需要特殊说明的是,targetSDKVersion<=8.0运行在>8.0的系统的,此灰名单接口可以访问,只是会弹出toast提示。

greylist-max-x灰名单接口,表示在x版本系统上及以下可以正常访问,在x版本系统以上访问会有限制,具体限制程度还和App的targetSDKVersion有关,target大于x抛出异常,target小于等于x弹toast。

举例说明一下:
App的targetSDKVersion是9.0,p(28),运行在11系统上。
greylist-max-o灰名单中的接口访问会抛出异常。
greylist-max-p灰名单中的接口可以访问,只是会弹toast提示。
greylist-mac-q灰名单中的接口可以访问,只是灰弹toast提示。

一个例子分析

用veridex对同一个app分别进行10和11版本非SDK接口的分析。
10非SDK接口分析结果:

#53: Reflection greylist-max-o Landroid/graphics/ImageDecoder;->createSource use(s):Lcom/bytedance/sdk/openadsdk/core/widget/gif/GifView;->b([B)Landroid/graphics/drawable/AnimatedImageDrawable;#70: Reflection greylist,test-api Landroid/os/storage/StorageVolume;->getPath use(s):Lcom/huawei/updatesdk/service/c/h;->c()Ljava/lang/reflect/Method;#101: Reflection greylist Lcom/android/internal/R$dimen;->status_bar_height use(s):Lcom/android/sohu/sdk/common/toolbox/g;->a(Landroid/app/Activity;)ILz/chj;->a()ILcom/sohu/sohuvideo/ui/util/ax;->d(Landroid/content/Context;)I#102: Reflection greylist Lcom/android/internal/R$styleable;->Window use(s):Lcom/sina/weibo/sdk/share/BaseActivity;->isTranslucentOrFloating()Z#110: Reflection blacklist Ljava/lang/Runtime;->nativeLoad use(s):Lcom/facebook/soloader/SoLoader;->h()Ljava/lang/reflect/Method;       120 hidden API(s) used: 27 linked against, 93 through reflection101 in greylist1 in blacklist3 in greylist-max-o15 in greylist-max-p0 in greylist-max-q

11非SDK接口分析结果:

#53: Reflection blacklist,test-api Landroid/graphics/ImageDecoder;->createSource use(s):Lcom/bytedance/sdk/openadsdk/core/widget/gif/GifView;->b([B)Landroid/graphics/drawable/AnimatedImageDrawable;#70: Reflection greylist-max-q,test-api Landroid/os/storage/StorageVolume;->getPath use(s):Lcom/huawei/updatesdk/service/c/h;->c()Ljava/lang/reflect/Method;#98: Reflection greylist-max-q Lcom/android/internal/R$dimen;->status_bar_height use(s):Lcom/android/sohu/sdk/common/toolbox/g;->a(Landroid/app/Activity;)ILcom/sohu/sohuvideo/ui/util/ax;->d(Landroid/content/Context;)ILz/chj;->a()I#99: Reflection greylist-max-q Lcom/android/internal/R$styleable;->Window use(s):Lcom/sina/weibo/sdk/share/BaseActivity;->isTranslucentOrFloating()Z#107: Reflection blacklist Ljava/lang/Runtime;->nativeLoad use(s):Lcom/facebook/soloader/SoLoader;->h()Ljava/lang/reflect/Method;       117 hidden API(s) used: 27 linked against, 90 through reflection97 in greylist2 in blacklist2 in greylist-max-o13 in greylist-max-p3 in greylist-max-q

在10中只有一个blacklist,在11中有两个blacklist,我们分析发现,是10中的一个greylist-max-o到11的时候变成了blacklist。Landroid/graphics/ImageDecoder;->createSource这个接口,也就意味着,app运行到11系统上使用此接口都会报错,不论targetSDKVersion是多少;app如果运行在10系统上使用此接口就分情况了,target小于等于o(27),访问正常,弹toast;target大于27,访问报错。(说明低版本中受限的接口可能在高版本系统中成为黑名单接口)

10中有三个greylist变成了greylist-max-q,也就是说这三个接口到11中不让使用了。(说明低版本系统中的灰名单接口可能在高版本中成为受限的接口)

11中的greylist-max-p比10中的少了两个:

#86: Reflection greylist-max-p Landroid/view/inputmethod/InputMethodManager;->mNextServedView use(s):Landroidx/activity/ImmLeaksCleaner;->initializeReflectiveFields()V#87: Reflection greylist-max-p Landroid/view/inputmethod/InputMethodManager;->mServedView use(s):Landroidx/activity/ImmLeaksCleaner;->initializeReflectiveFields()V

而且,在11的整个文件中都没有这两个接口,难道是11让这两个接口变成白名单接口了?
通过分析10和11的hiddenapi-flags.csv文件,果然这两个方法在11中没有了。

实战

参考

【Android P】非公开API(非 SDK 接口)相关知识总结

“对使用非SDK接口的限制”的适配实战相关推荐

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

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

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

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

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

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

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

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

  5. Android9.0对非 SDK 接口的限制

    在 Android 9.0 版本中,谷歌加入了非 SDK 接口使用限制,无论是通过调用.反射还是JNI等方式,开发者都无法对非 SDK 接口进行访问,此接口的滥用将会带来严重的系统兼容性问题. 在开发 ...

  6. Google针对非 SDK 接口的限制

    Google针对非 SDK 接口的限制 前言 最近在项目中遇到一个问题,非系统签名应用预装到android sdk为28的系统vender或者system分区下,调用隐藏api时,程序崩溃. 报错信息 ...

  7. Android 非 SDK 接口常见问题

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

  8. android sdk 9.0下载地址,Android9.0对非 SDK 接口的限制

    Android9.0对非 SDK 接口的限制 发布时间:2018-10-19 12:00, 浏览次数:919 , 标签: Android SDK 在 Android 9.0 版本中,谷歌加入了非 SD ...

  9. Android P 访问非SDK 接口

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

最新文章

  1. python爬取晋江_[Arcpy] 爬取高德地图面状地物(半自动化)—获取任意地区的行政边界...
  2. Java基础-Date类常用方法介绍
  3. 深入剖析RocketMQ源码-NameServer
  4. 米家扩展程序初始化超时_28条规范和建议,教你如何设计出一套完美的PLC程序...
  5. asp.net core的文件下载
  6. 专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions
  7. mysql主从结构主数据库_mysql主从结构主数据库中的日志
  8. php连接oracle很慢是什么原因_通过DB LINK插入速度很慢的问题
  9. 计算机网络-自顶向下方法(7th) 第四章 Review Questions 英文题目
  10. 动态代理 aop切面实现事务管理
  11. 2021年4月蓝桥杯软件类省赛:题目+解析(完整版)
  12. 怎么清理服务器数据库日志文件,SQL SERVER 数据库日志清理图文教程
  13. 【嵌入式】51单片机最小系统以及蜂鸣器驱动电路
  14. java下载https的网络图片,添加安全证书方式
  15. Android外挂开发探索
  16. eventlet 协程
  17. 第一个小项目:学生成绩管理系统
  18. 分享几款DIY的手表
  19. Rancher Labs携手东网发布“容器+虚拟化”双引擎超融合平台HOR
  20. SCM工具-Git的相关指令

热门文章

  1. NASA全球GPM免费降雨数据下载(2021年11月更新)
  2. u盘数据丢失恢复办法分享
  3. 网络架构革命 宽带提速升级
  4. 奈奎斯特–香农采样定理
  5. 给出一个大于或等于3的正整数,判断它是不是一个素数
  6. NXP(Freescale) QorIQ T2080启动流程分析
  7. 【电子书制作软件】云展网教程 | 在杂志页上添加书签功能
  8. 婚恋交友app开发中需要注意的安全问题
  9. 【C语言督学训练营 第三天】C语言的运算符与表达式
  10. 无线充电系统Ltspice仿真