前几天,收到公司App违规收取用户隐私的邮件,其中一项说我们App存在在用户同意协议前获取软件安装列表信息。
经排查,发现判断主进程的时候,会去获取软件安装列表。
public static boolean isMainProcess() {
return Utils.getApp().getPackageName().equals(getCurrentProcessName());
}
private static String getCurrentProcessName() {
try {
ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
if (am == null) return "";
List<ActivityManager.RunningAppProcessInfo> info = am.getRunningAppProcesses();
if (info == null || info.size() == 0) return "";
int pid = android.os.Process.myPid();
for (ActivityManager.RunningAppProcessInfo aInfo : info) {
if (aInfo.pid == pid) {
if (aInfo.processName != null) {
return aInfo.processName;
}
}
}
} catch (Exception e) {
return "";
}
return "";
}
所以,我们需要替换一种获取当前进程的方式。
需要注意的是,这种方式有可能获取失败,需要在catch中返回默认的进程名
public static boolean isMainProcess() {
return BuildConfig.APPLICATION_ID.equals(getCurrentProcessNameByFile());
}
private static String getCurrentProcessNameByFile() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/cmdline");
BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
String processName = mBufferedReader.readLine().trim();
mBufferedReader.close();
return processName;
} catch (Exception e) {
e.printStackTrace();
return "这里写你的App的进程名"; //TODO 有可能获取失败,需要写默认的进程名
}
}
这样子,我们就不会去获取软件安装列表信息了。
另一个违规问题详见 Android 违规获取用户隐私(获取MAC地址)整改