从 Android 9(API 级别 28)开始,Android对应用能使用的非 SDK 接口实施了限制。
只要应用引用非 SDK 接口
或尝试使用反射
或JNI
来获取其(包括Method、Class、Field)句柄,这些限制就适用。
目的在于帮助提升用户体验和开发者体验,为用户降低应用发生崩溃的风险,同时为开发者降低紧急发布的风险
目前插件的加载都是通过反射调用PathClassLoader
与DexClassLoader
的makeDexElements
生成Dex对应的Elements对象 , 再将Elements
添加到主ClassLoader的dexElements
数组中.
而再9.0后 , ClassLoader的函数等级处于greylist
, 所以目前还可以继续使用.
在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 框架中正式记录、受支持并且可以自由使用的接口 |
简单描述则为以下情况 :
TargetVersion
与运行时Android版本相同时 , 则会抛出错误greylist-max-x
里在官网中找到对应的Excel , 会有各个接口对应的级别.
image.png
当black-list
中接口通过反射、JNI接口去获取相应的Method
、Field
的引用时 , 就会报错.
当greylist
中接口通过反射、JNI接口去获取相应的Method
、Field
的引用时 , 目前可以正常使用.
image.png
举例说明
image.png
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有