写在前头


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. MyBatis 和 Spring 中的 23 种设计模式,真香,拿去用吧!
  2. 人人都是 DBA(V)SQL Server 数据库文件
  3. WebServices中使用cxf开发日志拦截器以及自定义拦截器
  4. CSS3常用动画总结
  5. 使用C#开发ActiveX控件[Obsolete]
  6. 微软是如何使用 C# 重写 C# 编译器并将其开源的
  7. Android Studio 管理所有程序退出
  8. 五、概念数据模型(CDM生成LDM,PDM和OOM)
  9. ICCV2021|性能优于何恺明团队MoCo v2,DetCo:为目标检测定制任务的对比学习
  10. 阿里云在西雅图招人挖角 微软居多
  11. Java 设计模式 之 模板方法模式(Template Method)
  12. 影视后期制作(Pr)
  13. 3dsMax一渲染就卡住、3DMAX渲染完卡死怎么办?解决方法来了
  14. android 绘制分割线,Android 布局中分割线创建的三种方式
  15. canbus是什么意思_can-bus总线是什么意思?
  16. JQuery.validate验证表单后Ajax异步提交
  17. Python 利用win32com批量给excel加密
  18. fbp是什么岗位_BP是什么职位?
  19. JavaScript妙用
  20. 考研经验贴(南京航空航天大学,电子信息专硕)

热门文章

  1. win10开机蓝屏_Win10开机后没有密码输入框和“您的账户已被停用,请向系统管理员联系”,两个问题一套方案...
  2. android x86 6,android x86 6.0 build iso
  3. python偏函数应用
  4. 江工教育:考一级消防工程师的作用是什么
  5. 怎么制作有趣的GIF动态表情包
  6. 金蝶 K3 库存账龄分析表 数据不一致
  7. 又双叒叕上榜|九州云入选“2022中国边缘计算企业20强”
  8. Elasticsearch基本操作:索引、文档、搜索
  9. “意见反馈”DEMO
  10. 陕西师范大学计算机考研复试,复试干货 | 陕西师范大学考研复试经验分享贴...