特别注意Android Q中的非SDK受限变化

在Android P中,Google限制了非SDK接口。
在Android Q中,Google再次更新了限制的非SDK接口。而且,单独将这一块拎出来,着重描述了一篇。
可见重要程度增强。

浅灰和深灰列表的命名发生变化

在 Android 9(API 级别 28)中,灰名单分为以下两个列表:

  • 包含非 SDK 接口(无论目标 API 级别是什么,您都可以使用这些接口)的浅灰列表。
  • 包含非 SDK 接口(如果您应用的目标 API 级别是 28 或更高,您将无法使用这些接口)的深灰列表。

在 Android Q 中,我们现在将这两个列表都称为灰名单,但列入灰名单且受目标 API 级别限制的非 SDK 接口(之前列入浅灰列表)现在也会由可在其中使用此类接口的最高目标 SDK 版本引用。

示例

如果某个非 SDK 接口列在 Android 9(API 级别 28)的深灰列表中,则该接口现在位于 greylist-max-o 列表中,其中“o”代表 Oreo 或 Android 8.1(API 级别 27)。在这种情况下,如果您的应用以 Android 8.1(API 级别 27)或更低版本为目标平台,您将只能使用属于 greylist-max-o 列表的接口。

同样,如果某个列入灰名单的非 SDK 接口之前未在 Android Pie 中受限,但现在却在 Android Q 中受限,则该接口位于 greylist-max-p 列表中,其中“p”代表 Pie 或 Android 9(API 级别 28)。

通过这些名称,您应该可以深入了解可在其中使用某个已列入灰名单的 API 的最高目标 SDK 级别(在该 API 受相应平台的限制之前)。

非 SDK 接口的代码注释

除了列表名称发生变化之外,现在可使用以下注释在代码中为许多非 SDK 接口添加注释。

注释 含义
@UnsupportedAppUsage 不受限制的灰名单
@UnsupportedAppUsage(maxTargetSdk = 0) 黑名单
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.O) 受限制的灰名单。仅供以 Android 8.1 Oreo(API 级别 27)或更低版本为目标平台的应用进行访问。
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) 受限制的灰名单。仅供以 Android 9 Pie(API 级别 28)或更低版本为目标平台的应用进行访问。

由于 Android 8.1 Oreo(API 级别 27)的受限灰名单中有大量非 SDK 接口,因此该列表中的很多接口未添加注释。虽然这些新注释可以提供快速参考点,但如果您不确定自己的应用是否会使用非 SDK 接口,则应测试该应用

在 Android Q 中授予对非 SDK 接口的访问权限

在 Android Q 中,可用于授予对非 SDK 接口的访问权限的命令已更改。您可以更改 API 强制执行政策,以允许在开发设备上访问非 SDK 接口。为此,请使用以下 ADB 命令:

    adb shell settings put global hidden_api_policy  1

要将 API 强制执行政策重置为默认设置,请使用以下命令:

    adb shell settings delete global hidden_api_policy

这些命令无需设备启用 root 权限即可执行。

您可以将 API 强制执行政策中的整数设置为以下某个值:

  • 0:停用所有非 SDK 接口检测。如果使用此设置,系统会停止输出有关非 SDK 接口使用情况的所有日志消息,并阻止您使用 StrictMode API 测试应用。建议不要使用此设置。
  • 1:允许访问所有非 SDK 接口,但同时输出日志消息,并且在其中显示针对所有非 SDK 接口使用情况的警告。如果使用此设置,您还可以使用 StrictMode API 测试应用。
  • 2:禁止使用已针对您的目标 API 级别列入黑名单或受限灰名单的非 SDK 接口。

Android Q 的列表更改

本部分介绍了 Android 9(API 级别 28)中列入灰名单的非 SDK 接口;这些接口目前在 Android Q 中受限,或已添加到 Android Q 中的 Android SDK(白名单)中。

目前在 Android Q 中受限的灰名单中的非 SDK 接口

以下代码框列出了 Android 9(API 级别 28)中列入灰名单的所有非 SDK 接口;这些接口目前在 Android Q 中受限。建议尽可能使用备选 API。我们注意到接口存在误报问题,因为我们原本认为这些接口可能正在使用中,而事实证明并非如此。每个接口占一行。

我们的目标是在限制使用非 SDK 接口之前确保有可用的公开替代方案,并且我们知道您的应用可能具有使用这些接口的有效用例。如果您当前在 Android 9 中使用的某个接口现在受限,则应该针对该接口请求新的公共 API

Landroid/accessibilityservice/AccessibilityService;->mWindowToken:Landroid/os/IBinder;   # False Positive
    Landroid/accounts/AccountManager$AmsTask;->mActivity:Landroid/app/Activity;   # False Positive
    Landroid/accounts/AccountManager$AmsTask;->mHandler:Landroid/os/Handler;   # False Positive
    Landroid/accounts/AccountManager$AmsTask;->mResponse:Landroid/accounts/IAccountManagerResponse;   # False Positive
    Landroid/accounts/AccountManager$GetAuthTokenByTypeAndFeaturesTask;->mAuthTokenType:Ljava/lang/String;   # False Positive
    Landroid/accounts/AccountManager$GetAuthTokenByTypeAndFeaturesTask;->mLoginOptions:Landroid/os/Bundle;   # False Positive
    Landroid/accounts/AccountManager$GetAuthTokenByTypeAndFeaturesTask;->mMyCallback:Landroid/accounts/AccountManagerCallback;   # False Positive
    Landroid/accounts/AuthenticatorDescription;-><init>(Landroid/os/Parcel;)V   # False Positive
    Landroid/accounts/AuthenticatorDescription;-><init>(Ljava/lang/String;)V   # False Positive
    Landroid/animation/LayoutTransition;->cancel()V   # This is used by androidx.transitions only for the API levels less than 18, so it is safe to restrict it after P. If developers are using it directly we encourage them to migrate to AndroidX Transition library instead
    Landroid/animation/LayoutTransition;->cancel(I)V
    Landroid/animation/ValueAnimator;->sDurationScale:F
    Landroid/app/Activity;->mVisibleFromClient:Z   # False Positive
    Landroid/app/Activity;->mVoiceInteractor:Landroid/app/VoiceInteractor;   # False Positive
    Landroid/app/Activity;->setParent(Landroid/app/Activity;)V   # False Positive
    Landroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I   # False Positive
    Landroid/app/ActivityThread$ActivityClientRecord;-><init>()V   # False Positive
    Landroid/app/ActivityThread$AppBindData;->compatInfo:Landroid/content/res/CompatibilityInfo;   # False Positive
    Landroid/app/ActivityThread;->getPackageInfo(Ljava/lang/String;Landroid/content/res/CompatibilityInfo;I)Landroid/app/LoadedApk;   # False Positive
    Landroid/app/ActivityThread;->handleReceiver(Landroid/app/ActivityThread$ReceiverData;)V   # False Positive
    Landroid/app/ActivityThread;->mLocalProviders:Landroid/util/ArrayMap;   # False Positive
    Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager;   # False Positive
    Landroid/app/ActivityThread;->peekPackageInfo(Ljava/lang/String;Z)Landroid/app/LoadedApk;   # False Positive
    Landroid/app/ActivityThread;->sMainThreadHandler:Landroid/os/Handler;   # False Positive
    Landroid/app/ActivityThread;->startActivityNow(Landroid/app/Activity;Ljava/lang/String;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/Activity$NonConfigurationInstances;)Landroid/app/Activity;   # False Positive
    Landroid/app/admin/DeviceAdminInfo$PolicyInfo;->tag:Ljava/lang/String;   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordHistoryLength(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumLength(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumLetters(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumLowerCase(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumNonLetter(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumNumeric(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumSymbols(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordMinimumUpperCase(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/admin/DevicePolicyManager;->getPasswordQuality(Landroid/content/ComponentName;I)I   # False Positive
    Landroid/app/assist/AssistContent;->mClipData:Landroid/content/ClipData;   # False Positive
    Landroid/app/assist/AssistContent;->mExtras:Landroid/os/Bundle;   # False Positive
    Landroid/app/assist/AssistContent;->mIntent:Landroid/content/Intent;   # False Positive
    Landroid/app/assist/AssistContent;->mIsAppProvidedIntent:Z   # False Positive
    Landroid/app/assist/AssistContent;->mStructuredData:Ljava/lang/String;   # False Positive
    Landroid/app/assist/AssistContent;->mUri:Landroid/net/Uri;   # False Positive
    Landroid/app/assist/AssistContent;->writeToParcelInternal(Landroid/os/Parcel;I)V   # False Positive
    Landroid/app/ContentProviderHolder;->noReleaseNeeded:Z   # False Positive
    Landroid/app/ContextImpl;->mFlags:I   # False Positive
    Landroid/app/ContextImpl;->mOpPackageName:Ljava/lang/String;   # False Positive
    Landroid/app/ContextImpl;->mSharedPrefsPaths:Landroid/util/ArrayMap;   # False Positive
    Landroid/app/Dialog;->CANCEL:I   # False Positive
    Landroid/app/Dialog;->mHandler:Landroid/os/Handler;   # False Positive
    Landroid/app/DownloadManager$Query;->orderBy(Ljava/lang/String;I)Landroid/app/DownloadManager$Query;   # False Positive
    Landroid/app/DownloadManager;->setAccessFilename(Z)V   # False Positive
    Landroid/app/Fragment;->mView:Landroid/view/View;   # False Positive
    Landroid/app/Fragment;->sClassMap:Landroid/util/ArrayMap;   # False Positive
    Landroid/app/IInstrumentationWatcher$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstrumentationWatcher;
    Landroid/app/Instrumentation;->checkStartActivityResult(ILjava/lang/Object;)V   # False Positive
    Landroid/app/ISearchManager$Stub;-><init>()V
    Landroid/app/IUiModeManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUiModeManager;
    Landroid/app/IUiModeManager;->disableCarMode(I)V
    Landroid/app/job/JobInfo;->flags:I   # False Positive
    Landroid/app/job/JobWorkItem;-><init>(Landroid/os/Parcel;)V   # False Positive
    Landroid/app/job/JobWorkItem;->mDeliveryCount:I   # False Positive
    Landroid/app/job/JobWorkItem;->mGrants:Ljava/lang/Object;   # False Positive
    Landroid/app/job/JobWorkItem;->mIntent:Landroid/content/Intent;   # False Positive
    Landroid/app/job/JobWorkItem;->mWorkId:I   # False Positive
    Landroid/app/KeyguardManager;->isDeviceLocked(I)Z   # False Positive
    Landroid/app/LoadedApk$ReceiverDispatcher;->mContext:Landroid/content/Context;   # False Positive
    Landroid/app/LoadedApk$ServiceDispatcher;->mContext:Landroid/content/Context;   # False Positive
    Landroid/app/LoadedApk;->mDataDirFile:Ljava/io/File;   # False Positive
    Landroid/app/LoadedApk;->mServices:Landroid/util/ArrayMap;   # False Positive
    Landroid/app/Notification$Action;->mIcon:Landroid/graphics/drawable/Icon;   # False Positive
    Landroid/app/ProgressDialog;->mProgress:Landroid/widget/ProgressBar;   # False Positive
    Landroid/app/ResultInfo;->CREATOR:Landroid/os/Parcelable$Creator;   # False Positive
    Landroid/app/UiAutomation;-><init>(Landroid/os/Looper;Landroid/app/IUiAutomationConnection;)V   # False Positive
    Landroid/app/UiAutomation;->connect()V   # False Positive
    Landroid/app/UiAutomation;->disconnect()V   # False Positive
    Landroid/app/usage/ConfigurationStats;->mActivationCount:I   # False Positive
    Landroid/app/usage/ConfigurationStats;->mBeginTimeStamp:J   # False Positive
    Landroid/app/usage/ConfigurationStats;->mConfiguration:Landroid/content/res/Configuration;   # False Positive
    Landroid/app/usage/ConfigurationStats;->mEndTimeStamp:J   # False Positive
    Landroid/app/usage/ConfigurationStats;->mLastTimeActive:J   # False Positive
    Landroid/app/usage/ConfigurationStats;->mTotalTimeActive:J   # False Positive
    Landroid/app/usage/UsageEvents$Event;->mClass:Ljava/lang/String;   # False Positive
    Landroid/app/usage/UsageEvents$Event;->mConfiguration:Landroid/content/res/Configuration;   # False Positive
    Landroid/app/usage/UsageEvents$Event;->mEventType:I   # False Positive
    Landroid/app/usage/UsageEvents$Event;->mPackage:Ljava/lang/String;   # False Positive
    Landroid/app/usage/UsageEvents$Event;->mTimeStamp:J   # False Positive
    Landroid/app/usage/UsageEvents;-><init>(Landroid/os/Parcel;)V   # False Positive
    Landroid/app/usage/UsageEvents;->findStringIndex(Ljava/lang/String;)I   # False Positive
    Landroid/app/usage/UsageEvents;->mEventCount:I   # False Positive
    Landroid/app/usage/UsageEvents;->mEventsToWrite:Ljava/util/List;   # False Positive
    Landroid/app/usage/UsageEvents;->mIndex:I   # False Positive
    Landroid/app/usage/UsageEvents;->mStringPool:[Ljava/lang/String;   # False Positive
    Landroid/app/usage/UsageEvents;->readEventFromParcel(Landroid/os/Parcel;Landroid/app/usage/UsageEvents$Event;)V   # False Positive
    Landroid/app/usage/UsageEvents;->writeEventToParcel(Landroid/app/usage/UsageEvents$Event;Landroid/os/Parcel;I)V   # False Positive
    Landroid/app/usage/UsageStats;->mBeginTimeStamp:J   # False Positive
    Landroid/app/usage/UsageStats;->mEndTimeStamp:J   # False Positive
    Landroid/app/usage/UsageStats;->mLastTimeUsed:J   # False Positive
    Landroid/app/usage/UsageStats;->mPackageName:Ljava/lang/String;   # False Positive
    Landroid/app/usage/UsageStatsManager;->mContext:Landroid/content/Context;   # False Positive
    Landroid/app/usage/UsageStatsManager;->sEmptyResults:Landroid/app/usage/UsageEvents;   # False Positive
    Landroid/app/WallpaperManager;->setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZII)I   # False Positive
    Landroid/bluetooth/BluetoothA2dp;->getPriority(Landroid/bluetooth/BluetoothDevice;)I   # False Positive
    Landroid/bluetooth/BluetoothA2dp;->stateToString(I)Ljava/lang/String;   # False Positive
    Landroid/bluetooth/BluetoothClass;-><init>(I)V   # False Positive
    Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I   # False Positive
    Landroid/bluetooth/BluetoothProfile;->PAN:I   # False Positive
    Landroid/bluetooth/BluetoothUuid;->AdvAudioDist:Landroid/os/ParcelUuid;   # False Positive
    Landroid/bluetooth/BluetoothUuid;->AudioSink:Landroid/os/ParcelUuid;   # False Positive
    Landroid/bluetooth/BluetoothUuid;->Handsfree:Landroid/os/ParcelUuid;   # False Positive
    Landroid/bluetooth/BluetoothUuid;->HSP:Landroid/os/ParcelUuid;   # False Positive
    Landroid/bluetooth/IBluetooth$Stub;-><init>()V
    Landroid/bluetooth/IBluetoothA2dp$Stub;-><init>()V
    Landroid/content/BroadcastReceiver$PendingResult;-><init>(ILjava/lang/String;Landroid/os/Bundle;IZZLandroid/os/IBinder;II)V   # False Positive
    Landroid/content/BroadcastReceiver$PendingResult;->mFlags:I   # False Positive
    Landroid/content/BroadcastReceiver$PendingResult;->mResultCode:I   # False Positive
    Landroid/content/BroadcastReceiver$PendingResult;->mResultData:Ljava/lang/String;   # False Positive
    Landroid/content/BroadcastReceiver$PendingResult;->mToken:Landroid/os/IBinder;   # False Positive
    Landroid/content/BroadcastReceiver$PendingResult;->mType:I   # False Positive
    Landroid/content/ClipData$Item;->mUri:Landroid/net/Uri;   # False Positive
    Landroid/content/ContentProvider;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V   # False Positive
    Landroid/content/ContentProviderClient;->mPackageName:Ljava/lang/String;   # False Positive
    Landroid/content/Context;->COUNTRY_DETECTOR:Ljava/lang/String;   # False Positive
    Landroid/content/Entity;->mSubValues:Ljava/util/ArrayList;   # False Positive
    Landroid/content/Entity;->mValues:Landroid/content/ContentValues;   # False Positive
    Landroid/content/IContentProvider;->descriptor:Ljava/lang/String;   # False Positive
    Landroid/content/IIntentReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentReceiver;
    Landroid/content/IIntentSender$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentSender;
    Landroid/content/IntentFilter;->isVerified()Z   # False Positive
    Landroid/content/pm/ApplicationInfo$DisplayNameComparator;->mPM:Landroid/content/pm/PackageManager;   # False Positive
    Landroid/content/pm/ApplicationInfo$DisplayNameComparator;->sCollator:Ljava/text/Collator;   # False Positive
    Landroid/content/pm/ApplicationInfo;->disableCompatibilityMode()V   # False Positive
    Landroid/content/pm/ApplicationInfo;->isPackageUnavailable(Landroid/content/pm/PackageManager;)Z   # False Positive
    Landroid/content/pm/LauncherApps;->mService:Landroid/content/pm/ILauncherApps;   # False Positive
    Landroid/content/pm/PackageInfo;-><init>(Landroid/os/Parcel;)V   # False Positive
    Landroid/content/pm/PackageInfoLite;->CREATOR:Landroid/os/Parcelable$Creator;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->active:Z   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->appIcon:Landroid/graphics/Bitmap;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->appLabel:Ljava/lang/CharSequence;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->appPackageName:Ljava/lang/String;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->installerPackageName:Ljava/lang/String;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->mode:I   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->progress:F   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->sessionId:I   # False Positive
    Landroid/content/pm/PackageInstaller$SessionInfo;->sizeBytes:J   # False Positive
    Landroid/content/pm/PackageInstaller$SessionParams;->appLabel:Ljava/lang/String;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionParams;->appPackageName:Ljava/lang/String;   # False Positive
    Landroid/content/pm/PackageInstaller$SessionParams;->mode:I   # False Positive
    Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;   # False Positive
    Landroid/content/pm/PackageStats;->userHandle:I   # False Positive
    Landroid/content/pm/ParceledListSlice;->CREATOR:Landroid/os/Parcelable$ClassLoaderCreator;   # False Positive
    Landroid/content/pm/ShortcutInfo;->getIcon()Landroid/graphics/drawable/Icon;   # False Positive
    Landroid/content/pm/ShortcutManager;->mService:Landroid/content/pm/IShortcutService;   # False Positive
    Landroid/content/res/CompatibilityInfo;->CREATOR:Landroid/os/Parcelable$Creator;   # False Positive
    Landroid/content/RestrictionsManager;->mService:Landroid/content/IRestrictionsManager;   # False Positive
    Landroid/content/SyncAdapterType;-><init>(Ljava/lang/String;Ljava/lang/String;)V   # False Positive
    Landroid/content/SyncAdapterType;->supportsUploading:Z   # False Positive
    Landroid/content/SyncAdapterType;->userVisible:Z   # False Positive
    Landroid/content/SyncInfo;-><init>(Landroid/os/Parcel;)V   # False Positive
    Landroid/content/SyncRequest;->mAuthority:Ljava/lang/String;   # False Positive
    Landroid/content/SyncRequest;->mExtras:Landroid/os/Bundle;   # False Positive
    Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;   # False Positive
    Landroid/database/DatabaseUtils;->getTypeOfObject(Ljava/lang/Object;)I   # False Positive
    Landroid/database/MatrixCursor;->data:[Ljava/lang/Object;   # False Positive
    Landroid/database/MatrixCursor;->rowCount:I   # False Positive
    Landroid/database/sqlite/SQLiteCustomFunction;->name:Ljava/lang/String;   # False Positive
    Landroid/database/sqlite/SQLiteQueryBuilder;->computeProjection([Ljava/lang/String;)[Ljava/lang/String;   # False Positive
    Landroid/database/sqlite/SQLiteQueryBuilder;->mDistinct:Z   # False Positive
    Landroid/database/sqlite/SQLiteQueryBuilder;->mTables:Ljava/lang/String;   # False Positive
    Landroid/database/sqlite/SQLiteQueryBuilder;->mWhereClause:Ljava/lang/StringBuilder;   # False Positive
 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值