Android Pie限制非 SDK 接口的调用
Android Pie的限制
从 Android 9(API 级别 28)开始,Android对应用能使用的非 SDK 接口实施了限制。
只要应用引用非 SDK 接口
或尝试使用反射
或JNI
来获取其(包括Method、Class、Field)句柄,这些限制就适用。
目的在于帮助提升用户体验和开发者体验,为用户降低应用发生崩溃的风险,同时为开发者降低紧急发布的风险
对于插件的影响
目前插件的加载都是通过反射调用PathClassLoader
与DexClassLoader
的makeDexElements
生成Dex对应的Elements对象 , 再将Elements
添加到主ClassLoader的dexElements
数组中.
而再9.0后 , ClassLoader的函数等级处于greylist
, 所以目前还可以继续使用.
非SDK接口等级
在Android9.0后 , Android 10、11都陆续更新了非SDK提供接口全集. 而Android官方为这些非公开的API接口分了等级 , 并且在ART虚拟机中对API接口进行处理.
等级 |
策略 |
---|---|
屏蔽名单 (blacklist) |
无论应用TargetVersion是什么,都无法使用的非 SDK 接口。 如果您的应用尝试访问其中任何一个接口,系统就会抛出错误 |
有条件屏蔽 (greylist-max-x) |
从 Android 9(API 级别 28)开始,当有应用以该 API 级别为TargetVersion时,我们会在每个 API 级别分别限制某些非 SDK 接口。 |
不支持 (greylist) |
当前不受限制且您的应用可以使用的非 SDK 接口。 但请注意,这些接口不受支持,可能会在不另行通知的情况下随时发生更改。预计这些接口在未来的 Android 版本中会被有条件地屏蔽,并列在 max-target-x 名单中。 |
SDK (whitelist) |
已在 Android 框架中正式记录、受支持并且可以自由使用的接口 |
简单描述则为以下情况 :
- black List : 不管在哪个平台上 , 都会抛出错误
- greylist-max-x : 当APP的
TargetVersion
与运行时Android版本相同时 , 则会抛出错误 - greylist : 目前可以继续调用 , 其实系统是不建议这样使用 , 可能在未来的版本会加入到
greylist-max-x
里 - whitelist : 不管怎么调都可以正常使用
扫描检测
在官网中找到对应的Excel , 会有各个接口对应的级别.
image.png
接口访问
当black-list
中接口通过反射、JNI接口去获取相应的Method
、Field
的引用时 , 就会报错.
当greylist
中接口通过反射、JNI接口去获取相应的Method
、Field
的引用时 , 目前可以正常使用.
image.png
举例说明
image.png
参考资料
针对非 SDK 接口的限制 Android P 调用隐藏API限制原理 谈谈 Android P 行为变更与内联优化
- No.004 Median of Two Sorted Arrays
- No.001 Two Sum
- No.002 Add Two Numbers
- 【Python环境】探索 Python、机器学习和 NLTK 库
- 【机器学习】机器学习之组合算法总结
- IE 11浏览器0day漏洞(CVE-2015-2425)UAF分析
- 【Python环境】Python可视化工具综述
- 【Spark研究】Spark编程指南(Python版)
- Java细粒度锁实现的3种方式
- 教你在Java接口中定义方法
- 【Spark研究】如何用 Spark 快速开发应用?
- 高性能Java解析器实现过程详解
- Java内存模型深度解读
- Java 实现线程死锁
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- kubernete中的原子调度单位:pod
- mybatis-generator在命令行及IEAD中的使用
- mybatis-generator在命令行及IDEA中的使用
- 70-STM32+ESP8266+AIR202基本控制篇-移植使用-移植单片机MQTT底层包到自己的工程项目
- springboot研究:springboot自带监控actuator
- springboot研究:springboot使用swagger自动构建api
- numpy/pandas瞎搞系列(一):OLS,WLS的numpy实现
- redis实战第三篇 redis sentinel安装和部署
- 后浪,谈谈你对jvm性能调优的理解
- Homer预测共表达基因的motif
- redis实战第一篇 安装和使用
- lombok在java项目中的使用
- MySQL 的全文索引.
- Swift Reusable开源库使用
- 面试官:聊聊你读过的开源代码中用到的设计模式