SdkSandboxManager

public final class SdkSandboxManager
extends Object

java.lang.Object
   ↳ android.app.sdksandbox.SdkSandboxManager


提供相应 API,用于将 SDKs 加载到 SDK 沙盒进程中,然后与之进行交互。

SdkSandbox 是在单独的 uid 范围内运行的 Java 进程。每个应用都有自己的 SDK 沙盒进程。

第一个应用需要使用 <uses-sdk-library> 标记在其 AndroidManifest.xml 中声明它所依赖的 SDKs。应用只能将自己所依赖的 SDKs 加载到 SdkSandbox 中。

注意:此类中定义的所有 API 都不是稳定版,可能会发生变化。

摘要

嵌套类

interface SdkSandboxManager.LoadSdkCallback

用于跟踪与 SDK 加载和交互相关的事件的回调。 

interface SdkSandboxManager.RequestSurfacePackageCallback

用于跟踪来自 SDK 的 Surface 包请求的回调。 

interface SdkSandboxManager.SendDataCallback

用于跟踪向 SDK 发送数据的回调。 

常量

int LOAD_SDK_ALREADY_LOADED

SDK 已加载。

int LOAD_SDK_INTERNAL_ERROR

加载 SDK 时出现内部错误。

int LOAD_SDK_NOT_FOUND

找不到 SDK。

int REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

请求 SurfacePackage 时出现内部错误。

String SDK_SANDBOX_SERVICE

Context#getSystemService(String) 配合使用以检索 SdkSandboxManager,以便与属于此客户端应用的 SDK 进行交互。

int SDK_SANDBOX_STATE_DISABLED

SDK 沙盒已停用。

int SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

SDK 沙盒已启用。

int SEND_DATA_INTERNAL_ERROR

执行 SdkSandboxManager#sendData(String, Bundle, Executor, SendDataCallback) 时出现内部错误。

公共方法

static int getSdkSandboxState()

返回 SdkSandbox 的当前状态。

void loadSdk(String sdkName, Bundle params, Executor callbackExecutor, SdkSandboxManager.LoadSdkCallback callback)

在 SDK 沙盒 Java 进程中加载 SDK。

void requestSurfacePackage(String sdkName, int displayId, int width, int height, Bundle params, Executor callbackExecutor, SdkSandboxManager.RequestSurfacePackageCallback callback)

向 SDK 发送 Surface 包请求。

void sendData(String sdkName, Bundle data, Executor callbackExecutor, SdkSandboxManager.SendDataCallback callback)

向 SDK 发送一个包的 data

继承的方法

常量

LOAD_SDK_ALREADY_LOADED

public static final int LOAD_SDK_ALREADY_LOADED

SDK 已加载。

这表示客户端应用在成功加载后试图通过调用 loadSdk(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.app.sdksandbox.SdkSandboxManager.LoadSdkCallback) 重新加载相同的 SDK。

常量值: 101 (0x00000065)

LOAD_SDK_INTERNAL_ERROR

public static final int LOAD_SDK_INTERNAL_ERROR

加载 SDK 时出现内部错误。

这表示从客户端应用执行调用时发生了常规内部错误。

常量值: 500 (0x000001f4)

LOAD_SDK_NOT_FOUND

public static final int LOAD_SDK_NOT_FOUND

找不到 SDK。

这表示客户端应用试图通过调用 loadSdk(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.app.sdksandbox.SdkSandboxManager.LoadSdkCallback) 加载不存在的 SDK。

常量值: 100 (0x00000064)

REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

public static final int REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

请求 SurfacePackage 时出现内部错误。

这表示在请求 SurfacePackage 时发生了常规内部错误。

常量值: 700 (0x000002bc)

SDK_SANDBOX_SERVICE

public static final String SDK_SANDBOX_SERVICE

Context#getSystemService(String) 配合使用以检索 SdkSandboxManager,以便与属于此客户端应用的 SDK 进行交互。

常量值: "sdk_sandbox"

SDK_SANDBOX_STATE_DISABLED

API 级别 33 中引入
public static final int SDK_SANDBOX_STATE_DISABLED

SDK 沙盒已停用。

SdkSandboxManager API 已隐藏。尝试调用这些 API 会导致 UnsupportedOperationException

常量值: 0 (0x00000000)

SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

API 级别 33 中引入
public static final int SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

SDK 沙盒已启用。

应用可以使用 SdkSandboxManager API 将自己所依赖的 SDKs 加载到相应的 SdkSandbox 进程中。

常量值: 2 (0x00000002)

SEND_DATA_INTERNAL_ERROR

public static final int SEND_DATA_INTERNAL_ERROR

执行 SdkSandboxManager#sendData(String, Bundle, Executor, SendDataCallback) 时出现内部错误。

这表示在请求向 SDK 发送数据时发生了常规内部错误。

常量值: 800 (0x00000320)

公共方法

getSdkSandboxState

API 级别 33 中引入
public static int getSdkSandboxState ()

返回 SdkSandbox 的当前状态。

返回
int 值为 SDK_SANDBOX_STATE_DISABLEDSDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

loadSdk

public void loadSdk (String sdkName,
                Bundle params,
                Executor callbackExecutor,
                SdkSandboxManager.LoadSdkCallback callback)

在 SDK 沙盒 Java 进程中加载 SDK。

此方法会将带有 sdkName 的 SDK 库异步加载到沙盒进程中,调用方应通过 LoadSdkCallback callback 收到通知。

应用应事先使用 <use-sdk-library> 标记在其 AndroidManifest 中声明其所依赖的 SDKs。应用只能将自己所依赖的 SDKs 加载到 SdkSandbox 中。

当客户端应用加载第一个 SDK 时,系统会创建一个新的 SdkSandbox 进程,之后的其他 SDK 将会加载到已为该客户端应用创建的同一个沙盒中。

参数
sdkName String:要加载的 SDK 的名称。此值不能为 null

params Bundle:应用传递给 SDK 的参数。此值不能为 null

callbackExecutor Executor:要在其上调用回调的 Executor。此值不能为 null
callback SdkSandboxManager.LoadSdkCallback:将接收与 SDK 加载相关的事件的 LoadSdkCallback。此值不能为 null

requestSurfacePackage

public void requestSurfacePackage (String sdkName,
                int displayId,
                int width,
                int height,
                Bundle params,
                Executor callbackExecutor,
                SdkSandboxManager.RequestSurfacePackageCallback callback)

向 SDK 发送 Surface 包请求。

客户端应用通过 SdkSandboxManager.LoadSdkCallback.onLoadSdkSuccess(android.os.Bundle) 收到成功加载 SDK 的信号后,便可向 SDK 异步请求 SurfacePackage 来呈现视图。

所请求的 SurfacePackage 会通过 SdkSandboxManager.RequestSurfacePackageCallback.onSurfacePackageReady(android.view.SurfaceControlViewHost.SurfacePackage, int, android.os.Bundle) 返回给客户端应用。

参数
sdkName String:加载到 SDK 沙盒中的 SDK 的名称。此值不能为 null

displayId int:用于显示 Surface 包的逻辑屏幕的 ID

width int:Surface 包的宽度

height int:Surface 包的高度

params Bundle:客户端应用传递给 SDK 的参数。此值不能为 null

callbackExecutor Executor:要在其上调用回调的 Executor。此值不能为 null
callback SdkSandboxManager.RequestSurfacePackageCallback:将接收向 SDK 请求 Surface 包的结果的 RequestSurfacePackageCallback。 此值不能为 null

sendData

public void sendData (String sdkName,
                Bundle data,
                Executor callbackExecutor,
                SdkSandboxManager.SendDataCallback callback)

向 SDK 发送一个包的 data

客户端应用通过 SdkSandboxManager.LoadSdkCallback.onLoadSdkSuccess(android.os.Bundle) 收到成功加载 SDK 的信号后,便可向沙盒中的 SDK 异步请求发送任何数据。如果不加载 SDK,系统将抛出 SecurityException

参数
sdkName String:加载到 SDK 沙盒中的 SDK 的名称,与 loadSdk(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.app.sdksandbox.SdkSandboxManager.LoadSdkCallback) 中使用的名称相同。此值不能为 null

data Bundle:要向 SDK 发送的数据,格式为 Bundle。此值不能为 null

callbackExecutor Executor:要在其上调用回调的 Executor。此值不能为 null
callback SdkSandboxManager.SendDataCallback:将接收与 SDK 加载和交互相关的事件的 SendDataCallback。SDK 也可以通过 SendDataCallback#onSendDataSuccess(Bundle) 发送回数据。此值不能为 null