写在前头


Android Pie(API 28)开始对非SDK接口的使用开始做了限制.只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,就会被限制。这些限制旨在帮助提升用户体验和开发者体验,为用户降低应用发生崩溃的风险,同时为开发者降低紧急发布的风险.

官网针对非SDK接口限制的解释

SDK接口和非SDK接口


SDK接口是指Android 框架软件包索引中记录的那些接口,非SDK即指不包含在Android 框架软件包下的接口.当你使用反射去获取SDK未列举的方法和属性时就会被限制.

使用非SDK接口的影响

没有兼容性保证:

  • 非SDK接口可能会在将来发生改变,甚至消失
  • 在不同设备上可能不兼容
  • 兼容性问题可能要到运行时才能发现

绕过隐式保护:

  • 影响用户体验
  • 妨碍用户隐式
  • 被Google Play Protect判定为恶意软件

非SDK接口分类


非SDK一共分为三类,黑名单,灰名单,白名单,其中灰名单又被分为浅灰名单和深灰名单.(非受限灰名单中的非 SDK 接口称为浅灰名单,而受限灰名单中的非 SDK 接口称为深灰名单)

  • 黑名单(Blacklist):只能被Android系统或者系统应用使用,无论targetSdkVersion的版本都禁止使用.意味着禁止开发者使用这些接口.
  • 灰名单(Dark Greylist和Light Greylist):深灰黑名单当用户的targetSdkVersion小于P(API 28)时可以使用,当大于等于P时无法使用.浅灰黑名单是目前仍然有应用正在使用的非SDK接口,Google将会在后期考虑提供这样的SDK接口.目前还能正常使用.但是当targetSdkVersion大于或者等于P时,系统会抛出警告.
  • 白名单(Whitelist):此列表中的接口已在 Android 框架软件包索引中正式记录,就是Android公开SDK接口本身,它们是受支持的接口,没有任何访问限制,您可以自由使用。

真正的名单会在系统编译时生成,直接将访问标志编码在dex文件的相关字段和方法中,系统中不存在单独的列表文件,运行时高效率的检查应用是否使用了非SDK接口.

访问受限的非 SDK 接口时可能会出现的预期行为


访问方式 结果
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() 进行 JNI 调用 返回 NULL,抛出 NoSuchFieldError
通过 env->GetMethodID() 进行 JNI 调用 返回 NULL,抛出 NoSuchMethodError

测试您的应用是否使用非 SDK 接口


  • 使用可调试的应用进行测试
    您可以通过在搭载 Android 9(API 级别 28)或更高版本的设备或模拟器上构建和运行可调试应用来测试该应用是否使用非 SDK 接口。请确保您使用的设备或模拟器与您应用的目标 API 级别相匹配。
    在您的应用上运行测试时,如果该应用访问了某些非 SDK 接口,系统就会输出一条日志消息。您可以检查应用的日志消息,查找以下详细信息:
    您可以使用 adb logcat 来查看这些日志消息,这些消息显示在所运行应用的 PID 下。

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI) //表示使用JNI方法访问了light greylist中的非SDK接口

  • 使用 StrictMode API (严苛模式)进行测试
    您还可以利用 StrictMode API 来测试您的应用是否使用非 SDK 接口。请使用 detectNonSdkApiUsage 方法来启用此 API。启用 StrictMode API 后,您可以使用 penaltyListener 来接收每次使用非 SDK 接口的行为所对应的回调,并且您可以在其中实现自定义处理。回调中提供的 Violation 对象派生自 Throwable,并且封闭式堆栈轨迹会提供相应使用行为的上下文。

使用detectNonSdkApiUsage()方法来在应用调用非SDK接口时抛出警告.
使用permitNonSdkApiUsage()方法来阻止StrictMode 对这些调用抛出警告.

StrictMode 简单使用:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode.detectDiskReads().detectDiskWrites().detectNetwork()   // or .detectAll() for all detectable problems.penaltyDialog() //弹出违规提示对话框.penaltyLog() //在Logcat 中打印违规异常信息.penaltyFlashScreen() //API等级11.build())StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects() //API等级11.penaltyLog().penaltyDeath().build())
  • 使用 veridex 工具进行测试
    您还可以在 APK 上运行静态分析工具 veridex。veridex 工具会扫描 APK 的整个代码库(包括所有第三方库),并报告发现的所有使用非 SDK 接口的行为。
    veridex 工具存在以下局限性:
    它无法检测到通过 JNI 实现的调用。
    它只能检测到一部分通过反射实现的调用。
    它对非活动代码路径的分析仅限于 API 级别的检查。

最后


绕过Android P对非SDK的限制方法
Android P 访问非SDK 接口
其实方法很简单,无非是干涉Android的反射流程中对非SDK判断的返回进行修改.或者使用第三方库来绕过这种限制.FreeReflection

Android P非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. Android 非 SDK 接口常见问题

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

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

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

  7. Android P 访问非SDK 接口

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

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

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

  9. Android 开发---对非SDK接口限制的适配

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

最新文章

  1. 设计模式 — 创建型模式 — 建造者模式
  2. Linux---- Linux ---安装软件之 srpm ,rpm
  3. 写文件函数 Linux C fwrite,C文件读写函数介绍(转)
  4. fedora8 使用小记之:终端字体设置
  5. c# winform窗口自适应各种分辨率类
  6. mysql administrator 备份 表_【转】如何使用 MySQL Administrator 管理/备份/还原 My SQL 数据库...
  7. python 试题答案_python试题答案
  8. Linkedin Camus的使用
  9. 快钱如何快-企业级效率提升实践
  10. main线程 子线程 顺序_面试官:线程池如何按照core、max、queue的执行顺序去执行?详解...
  11. linux远程升级运行程序,运用RedHat的Kickstart升级Linux系统方法
  12. 表单验证之validform.js使用方法
  13. java string hash变量_java基础(六)-----String性质深入解析
  14. dp线和hdmi区别_各类视频线有什么区别?应该怎么选呢?
  15. Pytorch tensor基础知识
  16. php千图网解析,PHP素材资源解析平台源码V8.0(thinkPHP框架内核)
  17. VK1640脚位定义图
  18. 计算机对操作系统函数的调用失败,win10调用DllRegisterServer失败怎么办_win10调用DllRegisterServer失败如何解决...
  19. 复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)
  20. 备份jar包的一些坑

热门文章

  1. html 字前边自动加点,css实现文字越界加点点点显示,并且后面紧跟一个图标
  2. 如何找到大于或等于一个整数的最小的 2 的幂?
  3. 声学特征提取-python
  4. 植物大战僵尸开发商PopCap的13亿美元之路
  5. 操作系统第四章笔记---进程
  6. mysql数据库的命令基础操作
  7. Harmony 开发基础——Harmony 学习笔记
  8. 男子杀死情妇丈夫后分尸 起因系情妇要分手
  9. 百度云不用会员就能满速下载的方法
  10. python分析微博数据中心_未明学院:量化金融项目实战,成为掌握数据分析技能的复合型人才!...