Android在高版本中如何允许访问非 SDK 接口

https://developer.android.com/guide/app-compatibility/restrictions-non-sdk-interfaces?hl=zh-cn

Android 10(API 级别 29)或更高版本

如需允许访问非 SDK 接口,请使用以下 adb 命令:

 adb shell settings put global hidden_api_policy 1

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

adb shell settings delete global hidden_api_policy

可以将 API 强制执行策略中的整数设置为以下值之一:

0:停用所有非 SDK 接口检测。如果您使用此设置,系统会停止输出针对非 SDK 接口使用行为的所有日志消息,并阻止您使用 StrictMode API 测试应用。建议不要使用此设置。
1:允许访问所有非 SDK 接口,但同时输出日志消息,并且在其中显示针对所有非 SDK 接口使用情况的警告。如果使用此设置,您仍可以使用 StrictMode API 来测试应用。
2:禁止使用列于屏蔽名单中的非 SDK 接口,或针对您的目标 API 级别被有条件屏蔽的非 SDK 接口

在系统映像中的什么位置可以找到非 SDK API 名单?
它们是在平台 dex 文件中的字段和方法访问标记位中编码的。 系统镜像中没有单独的文件包含这些名单

搭载同一 Android 版本的不同 OEM 设备上的非 SDK API 名单是否相同?
原始设备制造商 (OEM) 可以将自己的接口添加到屏蔽名单(黑名单)中,但是无法从 AOSP 非 SDK API 名单中移除接口。CDD 会阻止此类更改,并且 CTS 测试会确保 Android 运行时强制执行相应名单。

针对非 SDK 接口的限制是否适用于包括系统应用和第一方应用在内的所有应用,而不仅仅是第三方应用?

是,但我们对使用平台密钥进行签名的应用和某些系统映像应用免除这项限制。请注意,免除限制的情况仅适用于系统映像应用(或更新后的系统映像应用)。软件包白名单仅适用于针对私有平台 API(而不是 SDK API)构建的应用(其中 LOCAL_PRIVATE_PLATFORM_APIS := true)。

JNI绕过去的方法:
破坏调用堆栈绕过去,使 VM 无法识别调用方

可以通过 JniEnv::AttachCurrentThread(…) 函数创建一个新的 Thread 来完成。

jni层新建个线程,在这个线程里去反射,去除掉了java调用的信息,从而让安卓系统以为这个是系统调用。

frameworks/base/config/hiddenapi-greylist.txt

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注