隐私合规

您所在的位置:网站首页 获取手机中已安装的应用信息什么意思啊 隐私合规

隐私合规

2024-07-16 07:40| 来源: 网络整理| 查看: 265

文章目录 背景应用场景1.应用间相互拉起2.大数据统计、精准推送3.应用市场、清理、杀毒类应用4.风控SDK 获取方案1.通过命令获取安装列表2.通过API获取安装列表3.通过UID爆破应用列表4.根据包名反向获取应用列表 检测方案代码

背景

最近研究隐私合规检测工作的时候有个需求是需要对应用收集用户设备的安装列表这个行为进行检测,现在简单记录下常用的获取设备安装列表的方法。 先搞清楚一个问题,为什么有些应用要获取设备安装的应用列表,目的是什么?

应用场景 1.应用间相互拉起

这种可能是应用联盟玩应用矩阵保活,比如你安装了应用A,它会主动读取手机中是否安装了兄弟应用B,如果有安装,那么它就可以主动唤醒应用B,还有一种正常点的就是应用A如果需要使用支付功能或地图导航功能,但它自己没有实现,那么就可唤起设备中有支付功能或地图导航功能的应用来完成。

2.大数据统计、精准推送

这种主要是对设备中安装的应用列表进行获取并上传到云端,一是用来做应用安装量的数据统计,二是基于这些应用来判断用户兴趣爱好,对用户进行画像。有了用户喜好后期就便于广告的精准推送。

3.应用市场、清理、杀毒类应用

这类目的主要是一些工具类产品,比如应用市场通过获取设备中安装应用的信息来检查应用是否需要升级更新,清理杀毒类应用通过获取安装列表并通过云端的匹配来判断用户设备是否安全,是否安装了病毒、盗版软件等。

4.风控SDK

还有一种目的主要是用于应用做风控,应用通过获取设备中安装的应用来判断设备是否为模拟器、用户是否为正常用户。如果应用发现自己在模拟器中运行那么就启动主动防御功能,比如运行错误的逻辑又或者直接退出等。

获取方案

知道了获取应用安装列表的目的后来看看一些常见的获取应用列表的方案。

1.通过命令获取安装列表 private List getPkgListFromShell_PM() { List packages = new ArrayList(); try { Process p = Runtime.getRuntime().exec("pm list packages"); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "utf-8")); String line = br.readLine(); while (line != null) { line = line.trim(); if (line.length() > 8) { String prefix = line.substring(0, 8); if (prefix.equalsIgnoreCase("package:")) { line = line.substring(8).trim(); if (!TextUtils.isEmpty(line)) { Log.d("Demo", "install: " + line); packages.add(line); } } } line = br.readLine(); } br.close(); p.destroy(); } catch (Throwable t) { t.printStackTrace(); } return packages; } 2.通过API获取安装列表 private List getPkgListFromAPI_getInstalledPackages(Context context) { List packages = new ArrayList(); try { List packageInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES); for (PackageInfo info : packageInfos) { String pkg = info.packageName; Log.d("Demo", "install: " + pkg); packages.add(pkg); } } catch (Throwable t) { t.printStackTrace(); } return packages; } private List getPkgListFromAPI_queryIntentActivities(Context context) { List packages = new ArrayList(); try { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); List mResolveInfos = context.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo info : mResolveInfos) { String appName = info.activityInfo.applicationInfo.loadLabel(context.getPackageManager()).toString(); String appPkg = info.activityInfo.packageName; Log.d("Demo", "install: " + appName + " " + appPkg); packages.add(appPkg); } } catch (Throwable t) { t.printStackTrace(); } return packages; } private List getPkgListFromAPI_getInstalledApplications(Context context) { List packages = new ArrayList(); try { List mApplicationInfo = context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo info : mApplicationInfo) { String appName = info.name; String appPkg = info.packageName; Log.d("Demo", "install: " + appPkg); packages.add(appPkg); } } catch (Throwable t) { t.printStackTrace(); } return packages; } 3.通过UID爆破应用列表 private boolean getPkgListFromAPI_getPackagesForUid(Context context){ for (int uid=10001;uid


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3