Adaptation de l'acquisition OAID dans le système Android

1. Concept OAID

OAID (Open Anonymous Identification) est un identifiant d'identité anonyme
utilisé pour le suivi des publicités et la diffusion d'annonces personnalisées sur les appareils mobiles.
Il s'agit d'une norme industrielle lancée conjointement par China Mobile Communications Group , China Telecom Group et China Unicom Group
. La valeur OAID est un nombre de 64 bits.

2. Contexte de l’OAID

Sur Android 10 et supérieur, Android nous interdit d'obtenir l'IMEI. Si nous voulons identifier de manière unique un téléphone mobile, nous pouvons utiliser OAID.
Étant donné que les identifiants traditionnels des terminaux mobiles, tels que l'identité internationale de l'équipement mobile (IMEI), ont été reconnus par certains pays comme faisant partie de la confidentialité des utilisateurs, et qu'il existe un risque de falsification et d'utilisation non autorisée, les applications système non fabricants dans Android 10 et les versions ultérieures Les informations sur l'appareil telles que IMEI et MAC ne seront pas obtenues. L’incapacité d’obtenir l’IMEI aura un certain impact sur l’identification de l’appareil lors du processus de statistiques sur le comportement des utilisateurs.
Récemment, la Mobile Security Alliance s'est associée aux fabricants nationaux de téléphones mobiles pour lancer un plan de système standard d'appareil supplémentaire pour résoudre ce problème, en choisissant le champ OAID comme champ alternatif à l'IMEI, etc. Le domaine OAID est un domaine d'identification d'appareil lancé conjointement par l'Académie chinoise des technologies de l'information et des communications et Huawei, Xiaomi, OPPO, VIVO et d'autres fabricants. Il dispose d'un certain degré d'autorité et peut répondre aux scénarios d'utilisation des statistiques de comportement des utilisateurs.

3. Problèmes causés par l'OAID

Environnement : virtualisation Qualcomm 865 Android10

1. Phénomène problématique

L'application de jeu tierce intègre le SDK Mobile Alliance pour obtenir l'OAID, mais le système n'est pas adapté à l'OAID. De ce fait, lorsque l'application tierce intègre le SDK Mobile Alliance pour obtenir l'OAID, le résultat est vide et l'application s'écrase.

2. Idées de solutions

(1). Écrivez un apk, intégrez-le dans le système et démarrez automatiquement au démarrage. L'application définit un service et réécrit l'interface correspondante pour obtenir oaid. (2) Définissez une valeur d'attribut oaid. Persist.oaid est utilisé pour
définir et Obtenir la valeur OAID
(3). Lorsqu'une application tierce appelle le SDK Mobile Alliance pour obtenir OAID, elle appelle l'interface d'obtention OAID réécrite à l'étape 1. Cette interface lit la valeur OAID via la valeur d'attribut persist.oaid et renvoie à l'application tierce, cela peut donc éviter que la valeur oaid soit vide.

3. Étapes de traitement

3.1 Écrire apk. Ici, nous prenons comme exemple l'adaptation au fabricant OPPO. Chaque fabricant peut réécrire l'interface et la méthode de différentes manières, vous devez donc y prêter attention. Le code du fabricant de l'oppo est le suivant, vous pouvez télécharger le code source pour voir les détails.

Le code BootCompletedReceiver.java est le suivant :
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"; //系统开机广播

    @Override
    public 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;
    }
}
Le code IdentityService.java est le suivant :
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 {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("CCCCC", "Oppo IdentifyService onCreate()");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    private final IOpenID.Stub binder = new IOpenID.Stub() {
        @Override
        public 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", "");
        }
    };
}

Le code IOpenID.aidl est le suivant :

// IOpenID.aidl
package com.heytap.openid;

// Declare any non-default types here with import statements

interface IOpenID {
    String getSerID(String pkgName, String sign, String type);
}

Le code AndroidManifest.xml est le suivant :

<?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" />

    <application
        android: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">
        <!-- 开机广播 -->
        <receiver
            android: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>

La structure du code est la suivante. Remarque : les noms des packages sont fixes :


À la fin de l'article, des informations pertinentes et des codes sources de services d'application adaptés à Huawei, OPPO, Samsung et Vivo seront joints.

3.2 Intégrer l'apk compilé dans le système (le fichier et l'emplacement de l'apk intégré sont uniquement à titre de référence et peuvent être différents. L'exemple intègre OppoAnonymousId.apk)

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

PRODUCT_PACKAGES += OppoAnonymousId

3.2.2 Nouveaux attributs dans Qualcomm865_vir/device/qcom/qssi/system.prop

#oaid 
persist.oaid=0

3.2.3 Modifier la valeur du fabricant dans Qualcomm865_vir/frameworks/base/core/java/android/app/ActivityThread.java

3.2.4 Ajout d'un apk qui doit être intégré dans /home/wenyang/workplace/code/Qualcomm865_vir/vendor/qcom/proprietary/prebuilt_HY11/target/product/qssi/Android.mk

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 Ajoutez OppoAnonymousId à device/qcom/qssi/apps_white_list.txt et device/qcom/kona/apps_white_list.txt, comme indiqué dans la figure suivante :

3.3 Modifiez le fabricant de l'équipement en OPPO (répétez l'étape 3.2.3, il est recommandé d'utiliser 3.2.3 pour modifier la machine. Si vous modifiez la valeur de l'attribut ro.product.manufacturer sous forme de modification de la machine, cette étape peut être ignorée ) ro.product.manufacturer
 = Après avoir modifié le fabricant de l'appareil dans OPPO
3.4, installez et testez oaid test_get_oaid.apk pour voir s'il prend en charge l'obtention d'oaid.

4. Vérification

4.1 Vérifier si l'application existe

 pm list packages | grep com.heytap.openid

Si le service démarre normalement, les résultats suivants peuvent être trouvés via la commande ci-dessus :

Ou vérifiez si le processus existe via la commande suivante :

ps  -A |  grep  com.heytap.openid

4.2 Vérifier s'il y a un appel à l'interface réécrite

Lorsqu'une application tierce obtient oaid, appelle-t-elle l'interface dans l'apk aidl que nous avons écrit ? Ici, nous prenons oppo comme exemple. La vérification du journal appellera l'interface suivante :

Code source de l'application d'adaptation oaid et lien de téléchargement du matériel associé :  https://download.csdn.net/download/banzhuantuqiang/88331871

Je suppose que tu aimes

Origine blog.csdn.net/banzhuantuqiang/article/details/132832661
conseillé
Classement