AndroidID重置功能开发

软件平台:Android11

硬件平台:QCS6125

需求来源:近日,上头关注智能硬件保护用户隐私的内容,遂衍生出了类似OAID的需求,但是OAID是运营商联合制定的一套用户识别码生成机制,需要将包名添加至该规范,这是需要费用的,具体细节可自行上网了解,因此需要研究一套是否能标识用户ID,可以重置且没有三方费用的方式,因此google默认带的androidID功能提上调研日程,跟产品及有关部门确认,AndroidID这一套也能满足审核需求,但原生AndroidID是在设备首次启动过程中生成并且初始化的,如果这个id重置强依赖恢复出厂也不太合理,因此逻辑上做了调整。

具体的代码实现如下:

java 复制代码
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6f8de367164..6a627404253 100755
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -707,6 +707,8 @@
     <protected-broadcast android:name="com.yfd.settings.action.feedback" />
     <protected-broadcast android:name="com.yuanfudao.android.megrez.collect.user.log.COLLECT_ONCE.state_change" />
 
+    <protected-broadcast android:name="android.intent.action.YFD_RESET_ANDROID_ID_ACTION" />
+
 
     <!-- Added by yfd_shawn 20230606 -->
     <protected-broadcast android:name="com.android.systemui.action.SHOW_BACK_ICON" />
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index c67b5dd5822..e4c60bdebaa 100755
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -84,6 +84,7 @@ import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
+import android.util.Log;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.proto.ProtoOutputStream;
@@ -888,10 +889,12 @@ public class SettingsProvider extends ContentProvider {
         return "{null}";
     }
 
+    private static final String ACTION_RESET_ANDROID_ID_COMMAND = "android.intent.action.YFD_RESET_ANDROID_ID_ACTION";
     private void registerBroadcastReceivers() {
         IntentFilter userFilter = new IntentFilter();
         userFilter.addAction(Intent.ACTION_USER_REMOVED);
         userFilter.addAction(Intent.ACTION_USER_STOPPED);
+        userFilter.addAction(ACTION_RESET_ANDROID_ID_COMMAND);
 
         getContext().registerReceiver(new BroadcastReceiver() {
             @Override
@@ -911,6 +914,10 @@ public class SettingsProvider extends ContentProvider {
                             mSettingsRegistry.removeUserStateLocked(userId, false);
                         }
                     } break;
+
+                    case ACTION_RESET_ANDROID_ID_COMMAND: {
+                        mSettingsRegistry.resetAndroidId();
+                    } break;
                 }
             }
         }, userFilter);
@@ -2717,6 +2724,51 @@ public class SettingsProvider extends ContentProvider {
             return settingsState.getSettingNamesLocked();
         }
 
+        public void resetAndroidId() {
+            synchronized (mLock) {
+                try {
+                    for (int i = 0; i < mSettingsStates.size(); i++) {
+                        int key = mSettingsStates.keyAt(i);
+                        SettingsState settingsState = mSettingsStates.valueAt(i);
+                        if (settingsState != null) {
+                            if (isSsaidSettingsKey(key)) {
+                                int userId = getUserIdFromKey(key);
+                                final List<PackageInfo> packages;
+                                try {
+                                    packages = mPackageManager.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES, userId).getList();
+                                } catch (RemoteException e) {
+                                    throw new IllegalStateException("Package manager not available");
+                                }
+                                for (PackageInfo info : packages) {
+                                    final String uid = Integer.toString(info.applicationInfo.uid);
+                                    final Setting ssaid = settingsState.getSettingLocked(uid);
+                                    if (ssaid != null && !ssaid.isNull() && ssaid.getValue() != null) {
+                                        String androidId = Long.toHexString(new SecureRandom().nextLong());
+                                        settingsState.insertSettingLocked(uid, androidId, null, true, info.packageName);
+                                        Bundle result = new Bundle();
+                                        result.putString(Settings.NameValueTable.VALUE, !ssaid.isNull() ? ssaid.getValue() : null);
+                                        mSettingsRegistry.mGenerationRegistry.addGenerationData(result, ssaid.getKey());
+                                    }
+                                }
+                            } else {
+                                Setting value = settingsState.getSettingLocked(Settings.Secure.ANDROID_ID);
+                                if (!value.isNull()) {
+                                    String androidId = Long.toHexString(new SecureRandom().nextLong());
+                                    settingsState.insertSettingLocked(Settings.Secure.ANDROID_ID, androidId,
+                                            null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+                                    notifyForSettingsChange(key, Settings.Secure.ANDROID_ID);
+                                }
+                            }
+                        } else {
+                            Log.i(LOG_TAG, "settingsState is null!!");
+                        }
+                    }
+                } catch (Exception e) {
+                    Log.i(LOG_TAG, "reset android id failed!!");
+                }
+            }
+        }
+
         public SparseBooleanArray getKnownUsersLocked() {
             SparseBooleanArray users = new SparseBooleanArray();
             for (int i = mSettingsStates.size()-1; i >= 0; i--) {

以上是具体的功能实现,UI逻辑交互这里不贴了,基本原理就是UI触发了ID重置的操作,发送一个广播给SettingsProvider,内部调用重置AndroidID的方法,同时插入settings数据库,我们这边在重置之后,绑定了重启操作,这个重启非必需,根据自身情况评估吧,出于数据同步的可能风险我们加上了重置后去重启的操作。

Mark~~

相关推荐
千里马学框架11 天前
google官方Perfetto 中使用 AI相关skill
android·人工智能·ai·framework·perfetto·性能·skill
xianrenli3812 天前
Android14自动时区更新
android·学习·framework·aosp14·自动时区
千里马学框架12 天前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
网络研究院19 天前
Brave浏览器放大招引入容器功能,实现多账户安全隔离
网络·安全·容器·浏览器·数据·隐私
帅次1 个月前
Android 16(API Level 36)Activity 启动流程源码级解析
android·framework·源码解析·activity启动流程·android 16
Android小码家2 个月前
BootAnimation+SE+开机MP4动画播放
android·framework
小北的AI科技分享2 个月前
手机AI应用如何改变我们的日常交互方式
交互·应用·隐私
oh_my_god2 个月前
增加系统白名单,允许普通APP调用Android系统内部隐藏方法
android·framework
事后不诸葛2 个月前
安卓init.rc解析
android·framework
Android小码家2 个月前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗