Android 违规获取用户隐私(获取软件安装列表信息)整改

前几天,收到公司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地址)整改

你可能感兴趣的:(Android)