Android システムでの OAID 取得の適応

1. OAIDの概念

OAID (Open Anonymous Identification) は、モバイル デバイスでの広告追跡とパーソナライズされた広告配信に使用される匿名 ID 識別子です
これは、 China Mobile Communications Group 、China Telecom Group、China Unicom Group が
共同で立ち上げた業界標準であり
、OAID 値は 64 ビットの数値です。

2. OAIDの背景

Android 10 以降では、Android により IMEI の取得が禁止されているため、携帯電話を一意に識別したい場合は、OAID を使用できます。
International Mobile Equipment Identity (IMEI) などの従来のモバイル端末デバイスの識別子は、一部の国でユーザーのプライバシーの一部として認識されており、Android 10 以降のバージョンの非メーカー製システム アプリケーションは改ざんや不正使用のリスクがあるため、 IMEIやMACなどの端末情報は取得されません。IMEI を取得できないと、ユーザー行動統計プロセス中のデバイスの識別に一定の影響が生じます。
最近、モバイルセキュリティアライアンスは、国内の携帯電話メーカーと協力して、この問題に対処するための追加のデバイス標準システム計画を開始し、IMEIなどの代替分野としてOAID分野を選択しました。OAID分野は、中国情報通信技術院とファーウェイ、シャオミ、OPPO、VIVOなどのメーカーが共同で立ち上げたデバイス識別分野であり、一定の権限を持ち、ユーザー行動統計の利用シーンに対応できる。

3. OAIDによって引き起こされる問題

環境:Qualcomm 865 Android10仮想化

1. 問題となる現象

サードパーティのゲーム アプリケーションは、OAID を取得するために Mobile Alliance SDK を統合していますが、システムが OAID に適応していないため、サードパーティのアプリケーションが OAID を取得するために Mobile Alliance SDK を統合すると、結果が空になり、アプリケーションがクラッシュします。

2. 解決策のアイデア

(1). apk を作成し、システムに組み込み、起動時に自動的に起動します アプリケーションはサービスを定義し、oaid を取得するための対応するインターフェイスを書き換えます (2) oaid 属性値を定義します Persist.oaid は、設定に使用され
ますOAID 値の取得
(3)。サードパーティ アプリケーションが OAID を取得するために Mobile Alliance SDK を呼び出すと、ステップ 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"; //系统开机广播

    @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;
    }
}
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 {

    @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", "");
        }
    };
}

IOpenID.aidl コードは次のとおりです。

// 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);
}

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

    <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>

コード構造は次のとおりです 注: パッケージ名は固定です。


記事の最後には、関連情報と、Huawei、OPPO、Samsung、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 の製造元の値を変更する

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 次の図に示すように、OppoAnonymousId を device/qcom/qssi/apps_white_list.txt および device/qcom/kona/apps_white_list.txt に追加します。

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

おすすめ

転載: blog.csdn.net/banzhuantuqiang/article/details/132832661