概述
首先需要说明的是,“对使用非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中没有了。