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

概述

首先需要说明的是,“对使用非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;)I
       Lz/chj;->a()I
       Lcom/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 reflection
	101 in greylist
	1 in blacklist
	3 in greylist-max-o
	15 in greylist-max-p
	0 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;)I
       Lcom/sohu/sohuvideo/ui/util/ax;->d(Landroid/content/Context;)I
       Lz/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 reflection
	97 in greylist
	2 in blacklist
	2 in greylist-max-o
	13 in greylist-max-p
	3 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 接口)相关知识总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值