关于小米设备隐私收集获取

Overview

自2024年7月起,在架应用不再允许boot_id、ApplicationInfo.sourceDir、prop_persist_info、prop_bluetooth_name_info设备隐私信息的收集获取。

而在2024年4月,小米将不再允许获取boot_id的应用在小米应用商店发布和更新。

具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【重要】关于2024年7月起,在架应用不再允许boot_id、ApplicationInfo.sourceDir、prop_persist_info、prop_bluetooth_name_info设备隐私信息的收集获取通知
尊敬的开发者,您好

一直以来,小米始终坚持践行分发平台主体责任,保障用户权益和数据安全;2023年11月20日,依照相关政策法规要求,制定《设备隐私信息采集规范标准》 并完成公示。

具体要求:
2024年4月起,将不再允许违规获取 boot_id 的应用在小米应用商店「发布和更新」;
2024年7月起,针对违规获取 应用安装路径(ApplicationInfo.sourceDir)、设备名称(prop_persist_info)、蓝牙名称(prop_bluetooth_name_info) 的应用将无法在小米应用商店「发布和更新」;

为保障您的应用正常经营和运转,请广大开发者关注相关节点,尽快完成应用的适配升级,避免影响应用后续的经营发布和用户体验。

如果您在适配升级的过程中有任何疑问,您可通过 联系在线客服 或通过邮箱 developer@xiaomi.com 与我们取得联系,感谢您理解与支持。

小米应用商店
2024年4月26日

针对小米的邮件我们可以全局搜索对应Api,如果项目中使用了相关Api需要移除或替换。

获取boot_id相关Api

在Android开发中,获取boot_id通常指的是获取设备自启动以来的唯一标识符。这个标识符可以通过调用Settings.Secure类中的getStringForUser方法来获取,该方法读取secure settings值。
以下是一个简单的方法,用于获取当前设备的boot_id

1
2
3
4
5
6
7
8
9
import android.content.ContentResolver;
import android.provider.Settings.Secure;
import android.os.UserHandle;

public long getBootId() {
ContentResolver resolver = getContentResolver();
long bootId = Secure.getStringForUser(resolver, Secure.ANDROID_ID, UserHandle.myUserId());
return bootId;
}

获取应用安装路径ApplicationInfo.sourceDir

在Android开发中,要获取应用的安装路径,可以使用PackageManager类来获取ApplicationInfo对象,然后访问其sourceDir字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import android.content.Context;  
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.util.Log;

public class AppPathExample {

private Context context;

public AppPathExample(Context context) {
this.context = context;
}

public String getAppInstallPath() {
try {
PackageManager packageManager = context.getPackageManager();
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
return applicationInfo.sourceDir;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
}

获取设备名称prop_persist_info

获取设备名称prop_persist_info一般开发中不太会用到,问了gpt以下是获取方式,可以逐一排查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在Android开发中,要获取设备名称或其他系统属性,如prop_persist_info,通常涉及到读取Android系统属性。这通常是通过System.getProperty()或读取/system/build.prop文件来完成的。但是,prop_persist_info这样的属性通常不是通过标准的System.getProperty()方法直接可访问的,因为这些属性可能存储在系统分区的其他位置或用于特定的系统配置。

要获取prop_persist_info或其他非标准系统属性,你可能需要:

- 使用Build类:首先,检查Android的Build类是否提供了你需要的任何信息。这个类包含了一些关于设备构建信息的静态字段,比如MODEL、MANUFACTURER、PRODUCT等。

- 读取/system分区下的属性文件:对于prop_persist_info这样的属性,你可能需要直接读取/system分区下的某个属性文件。这通常涉及到使用FileInputStream或RandomAccessFile来读取文件内容。

- 使用Settings.Secure或Settings.Global:某些设备特定的设置或属性可能存储在Settings.Secure或Settings.Global中。你可以使用ContentResolver来查询这些设置。

- 使用反射或JNI:在某些情况下,可能需要使用Java反射来访问内部API,或者使用JNI(Java Native Interface)来调用本地代码获取这些信息。

- Root权限:如果你尝试访问需要root权限才能读取的文件或属性,那么你的应用将需要root权限。在大多数用户设备上,这是不可能的,除非设备已经被root。

- 使用ADB shell命令:在开发或调试过程中,你可以通过ADB(Android Debug Bridge)执行shell命令来获取这些属性。但这并不适用于常规的用户应用。

请注意,直接读取系统文件或执行需要特定权限的操作可能会违反Google Play的政策,导致你的应用被拒绝上架。此外,这些方法可能因设备制造商和Android版本的不同而有所差异。

如果你只是想要获取设备的名称或型号,通常可以通过Build.MODEL和Build.MANUFACTURER等字段来获取。如果你需要访问特定的非标准属性,你可能需要更深入地了解你的目标设备或Android版本,并可能需要与设备制造商合作以获取正确的访问方法。

获取蓝牙名称prop_bluetooth_name_info

在开发中获取蓝牙名称通常不是通过读取prop_bluetooth_name_info这样的系统属性来实现的。Android提供了标准的API来管理蓝牙设备的名称和配置。

可以在项目中全局搜索prop_bluetooth_name_info字段。