# 集成OAID

> 来源：https://help.gravity-engine.com/docs/client-sdk/android/advanced/oaid
> 说明 Android SDK 自动获取或由业务侧传入 OAID 的集成方式，并区分不同版本 MSA SDK 的配置。



> 引力引擎最新版本 SDK 已支持获取 oaid，您可以不用手动集成 msa 包，当然如果您已经在使用 msa 官方包获取 oaid，您可以继续参考下方文档。

匿名设备标识符（Open Anonymous Device Identifier，简称 OAID）是一种用于安卓设备的唯一标识符，可由用户重置。该标识符由移动安全联盟（MSA）、中国信息通信研究院以及设备厂商合力推出，旨在替代 IMEI 等不可重置的设备标识符，以保护用户隐私。

使用最新的 MSA SDK 版本，才能支持市面上最新推出的手机，进而提升 OAID 的获取率，由于归因匹配很大程度上依赖 OAID 完成，所以使用最新版本的 MSA SDK 对于降低您应用的买量成本**至关重要**！

引力引擎 SDK 支持最新版本的 MSA SDK！需要您按照如下步骤进行手动集成。

## 1. 集成 OAID [#1-集成-oaid]

### 1.1 MSA1.0.25 之后版本（推荐，采集率更高） [#11-msa1025-之后版本推荐采集率更高]

* 在[MSA 官网](http://www.msa-alliance.cn/)注册账号并等待审核通过；
* 账号审核通过后，下载OAID的SDK，找到里面的 csv 文件，填写好游戏包名等信息，然后附邮件发送到 [msa@caict.ac.cn](mailto:msa@caict.ac.cn) 获取对应的证书文件（证书文件有效期为1年，请注意及时更换，建议可以通过服务端下发证书字符串，并通过引力提供的：setOaidCertStr 方法传入证书，可以保证历史已发布apk包在证书到期时无需升级安装包即可继续正常采集 oaid。）
* 证书申请完成之后，将`supplierconfig.json` 、`应用包名.cert.pem`、`aar` 文件放在项目中合适的位置；
* 按照 MSA 文档添加混淆配置。

引力引擎会默认读取 `assets` 中命名为`应用包名.cert.pem`的文件当做签名文件初始化 MSA SDK。

> **`应用包名.cert.pem`中应用包名要替换成你自己的应用包名!**

如果你需要自定义签名文件的路径，可以使用如下方法进行设置

```java
/**
 * 定义 oaid 证书在 assets 中的文件相对路径
 *
 * @param filePath oaid 证书在 assets 中的相对路径，eg："file/test.cert.pem"
 */
OaidHelper.setOaidCertFilePath(filePath);
```

如果您的证书文件不是放在项目中参与打包，而是后端下发的字符串，您可以通过如下方式传入证书内容：

```java
/**
 * 直接传入证书的文本内容
 * @param oaidCertStr
 */
OaidHelper.setOaidCertStr(oaidCertStr);
```

### 1.2 MSA1.0.25 及之前版本 [#12-msa1025-及之前版本]

无需单独申请 MSA 证书，只需将 MSA 的 AAR 包集成到项目中即可，引力 SDK 将自动采集设备的 OAID。[MSA 1.0.25 下载](https://resource.helplook.net/docker_production/p4xbdk/article/15kDiafS/attachments/oaid_sdk_1.0.25.zip "oaid_sdk_1.0.25.zip")

> **缺点：部分新上市的手机机型可能无法成功采集 OAID，不建议采用！**

## 2. 直接传入 OAID [#2-直接传入-oaid]

如果您通过其他 SDK，比如友盟 SDK 已经获取到 OAID 字符串，您可以通过直接传入字符串的方式把 OAID 传递给引力 SDK，这样能避免引力再次获取，传入方式如下：

```java
/**
 * 用户直接设置oaid
 * @param context
 * @param oaid
 */
OaidHelper.setOaid(context, yourOaidString);
```

## 3. 获取 OAID [#3-获取-oaid]

如您有获取 OAID 字符串的需要，可以按照如下方式获取

```java
OaidHelper.getOpenAdIdentifier(mContext);
```

> **请注意该接口是同步接口，必须子线程中使用！经过测试，耗时在 10 - 1000ms 之间。**
