Android 系统中适配OAID获取

一、OAID概念

OAID(Open Anonymous Identification)是一种匿名身份识别标识符,
用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集
团、中国电信集团和中国联通集团共同推出的一项行业标准
OAID值为一个64位的数字

二、OAID产生的背景

在Android10以上,安卓是禁止我们获取IMEI的,那如果想要唯一标识一部手机,那我们可以使用OAID。
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。

三、由于OAID 引发的问题

环境:高通865 Android10 虚拟化

1、问题现象

第三方游戏应用集成了移动联盟sdk获取oaid,但是系统并没有适配oaid,导致第三方应用集成移动联盟sdk获取oaid时获取为空导致应用闪退。

2、解决思路

(1)、编写一个apk,集成到系统,开机自启,应用中定义了一个服务和重写了相对应的获取oaid的接口
(2)、定义一个oaid属性值,persist.oaid用来设置和获取oaid值
(3)、第三方应用调用移动联盟sdk获取oaid时,调用步骤1中重写的获取oaid接口,该接口通过属性值persist.oaid读取oaid的值,返回给第三方应用,这样就可以避免获取到oaid值为空情况。

3、处理步骤

3.1 编写apk,这里以适配OPPO厂商为例,每种厂商有可能重写的接口和方式不一样,这里需要注意。oppo厂商的代码如下,具体的可以下载源码查看。

BootCompletedReceiver.java代码如下:
package com.heytap.openid;import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;import java.util.List;public class BootCompletedReceiver extends BroadcastReceiver {//    private final String ACTION_BOOT_COMPLETED = "com.matrixlauncher.oncreate"; //开机Launcher广播private final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; //系统开机广播@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null) {Log.d("CCCCC", "Oppo BootCompletedReceiveronReceive");if (!TextUtils.isEmpty(intent.getAction()) && intent.getAction().equals(ACTION_BOOT_COMPLETED)) {if (!isRun(context)) {Log.d("CCCCC", "Oppo BootCompletedReceiveronReceive start IdentifyService");context.startService(new Intent(context, IdentifyService.class));}}}}/*** 判断应用是否在运行** @param context* @return*/public boolean isRun(Context context) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);boolean isAppRunning = false;String MY_PKG_NAME = "com.heytap.openid";//100表示取的最大的任务数,info.topActivity表示当前正在运行的Activity,info.baseActivity表系统后台有此进程在运行for (ActivityManager.RunningTaskInfo info : list) {if (info.topActivity.getPackageName().equals(MY_PKG_NAME) || info.baseActivity.getPackageName().equals(MY_PKG_NAME)) {isAppRunning = true;break;}}return isAppRunning;}
}
IdentifyService.java代码如下:
package com.heytap.openid;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;import androidx.annotation.Nullable;public class IdentifyService extends Service {@Overridepublic void onCreate() {super.onCreate();Log.d("CCCCC", "Oppo IdentifyService onCreate()");}@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}private final IOpenID.Stub binder = new IOpenID.Stub() {@Overridepublic String getSerID(String pkgName, String sign, String type) throws RemoteException {Log.d("CCCCC", "Oppo OpenDeviceIdentifierService.Stub getOaid=" + SysProp.get("persist.oaid", ""));return SysProp.get("persist.oaid", "");}};
}

IOpenID.aidl代码如下:

// IOpenID.aidl
package com.heytap.openid;// Declare any non-default types here with import statementsinterface IOpenID {String getSerID(String pkgName, String sign, String type);
}

AndroidManifest.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.heytap.openid"android:sharedUserId="android.uid.system"><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- 开机广播 --><receiverandroid:name=".BootCompletedReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.matrixlauncher.oncreate" /><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter></receiver><service android:name=".IdentifyService"android:enabled="true"android:exported="true"><intent-filter><action android:name="action.com.heytap.openid.OPEN_ID_SERVICE" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></service></application></manifest>

代码结构如下,注意:包名那些都是固定的:


文章末尾会附上相关资料和适配华为、OPPO、三星、Vivo的应用服务源码

3.2 将编译好的apk集成到系统(集成apk的文件和位置仅供参考,有可能不一样,示例集成 OppoAnonymousId.apk)

3.2.1 Qualcomm865_vir/vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/prebuilt.mk中添加

PRODUCT_PACKAGES += OppoAnonymousId

3.2.2  Qualcomm865_vir/device/qcom/qssi/system.prop中新增属性

#oaid 
persist.oaid=0

3.2.3  Qualcomm865_vir/frameworks/base/core/java/android/app/ActivityThread.java中修改manufacturer值

3.2.4 /home/wenyang/workplace/code/Qualcomm865_vir/vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/Android.mk中新增需要集成的apk

include $(CLEAR_VARS)
LOCAL_MODULE        := OppoAnonymousId
LOCAL_MODULE_OWNER  := qcom
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := APPS
LOCAL_CERTIFICATE   := platform
LOCAL_MODULE_SUFFIX := .apk
LOCAL_SRC_FILES     := ../../.././target/product/qssi/system/app/OppoAnonymousId/OppoAnonymousId.apk
LOCAL_MULTILIB := 64
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/app
include $(BUILD_PREBUILT)

3.2.5 device/qcom/qssi/apps_white_list.txt和 device/qcom/kona/apps_white_list.txt中添加OppoAnonymousId,如下图所示:

3.3 修改设备厂商为OPPO(和3.2.3步骤重复,建议采用3.2.3改机的形式修改,如果采用改机形式修改 ro.product.manufacturer属性值,此步骤可忽略)
 ro.product.manufacturer=OPPO
3.4 修改设备厂商后,安装测试oaid test_get_oaid.apk,看看是否支持获取oaid

4、验证

4.1查看应用是否存在

 pm list packages | grep com.heytap.openid

如果服务正常启动,通过上面的命令,可以查到如下结果:

或者通过如下命令查看进程是否存在:

ps  -A |  grep  com.heytap.openid

4.2查看是否有调用重写的接口

第三方应用获取oaid时,是否有调用我们写的apk aidl中的接口,这里以oppo为例,查看日志会调用下面的接口:

oaid适配应用源码和相关资料下载链接: https://download.csdn.net/download/banzhuantuqiang/88331871

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/111982.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch Advanced(二) Variational Auto-Encoder

自编码说白了就是一个特征提取器&#xff0c;也可以看作是一个降维器。下面找了一张很丑的图来说明自编码的过程。 自编码分为压缩和解码两个过程。从图中可以看出来&#xff0c;压缩过程就是将一组数据特征进行提取&#xff0c; 得到更深层次的特征。解码的过程就是利用之前的…

详细介绍下路由器中的WAN口

路由器的 WAN 口&#xff08;Wide Area Network port&#xff09;是指用于连接广域网&#xff08;WAN&#xff09;的接口。它是路由器与外部网络&#xff08;如互联网&#xff09;之间的物理连接点&#xff0c;允许路由器与互联网服务提供商&#xff08;ISP&#xff09;或其他广…

风车时间锁管理 - 构建IPA文件加锁+签名+管理一站式解决方案

时间锁管理&#xff1a;是一种用于控制对某些资源、功能或操作的访问权限的机制&#xff0c;它通过设定时间限制来限制对特定内容、系统或功能的访问或执行&#xff0c;以提高安全性和控制性&#xff0c;时间锁管理常见于以下场景&#xff1a; 1. 文件或文档的保密性&#xff…

浏览器代理解决方案

当谈到网络浏览器&#xff0c; 浏览器 无疑是最受欢迎和广泛使用的选项之一。然而&#xff0c;你可能已经注意到&#xff0c; 浏览器并不原生支持 SOCKS5 代理协议。不过&#xff0c;别担心&#xff01;在本文中&#xff0c;我将与你分享一些解决方案&#xff0c;让你能够在 浏…

【C++初阶】动态内存管理

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C/C内存分布、C语言动态内存管理、C动态内存管理、operator new与operator delete函数、new和delete的实现原理、定位new表达式、常见面试问题等。 &#x1f43c;本文作者&#xff1a; 阿四啊 …

Django系列:Django的项目结构与配置解析

Django系列 Django的项目结构与配置解析 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132893616 【介…

简单介绍神经网络中不同优化器的数学原理及使用特性【含规律总结】

当涉及到优化器时&#xff0c;我们通常是在解决一个参数优化问题&#xff0c;也就是寻找能够使损失函数最小化的一组参数。当我们在无脑用adam时&#xff0c;有没有斟酌过用这个是否合适&#xff0c;或者说凭经验能够有目的性换用不同的优化器&#xff1f;是否用其他的优化器可…

【分布式】分布式事务:2PC

分布式事务的问题可以分为两部分&#xff1a; 并发控制 concurrency control原子提交 atomic commit 分布式事务问题的产生场景&#xff1a;一份数据被分片存在多台服务器上&#xff0c;那么每次事务处理都涉及到了多台机器。 可序列化&#xff08;并发控制&#xff09;&…

SQL优化--分页优化(limit)

在数据量比较大时&#xff0c;如果进行limit分页查询&#xff0c;在查询时&#xff0c;越往后&#xff0c;分页查询效率越低。 通过测试我们会看到&#xff0c;越往后&#xff0c;分页查询效率越低&#xff0c;这就是分页查询的问题所在。 因为&#xff0c;当在进行分页查询时&…

帆软BI开发-Day2-趋势图的多种变形

前言&#xff1a; 在BI数据展示中&#xff0c;条形图、趋势图无疑是使用场景非常多的两种图形。与条形图不同的是&#xff0c;趋势图更能反馈出一定的客观规律和未来的趋势走向&#xff0c;因此用于作为预警和判异的业务场景&#xff0c;但实际业务场景的趋势图可没你想的那么简…

视频汇聚/视频云存储/视频监控管理平台EasyCVR分发rtsp流起播慢优化步骤详解

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…