Android平台实现卸载后持久化设备标识的最优方案咨询
嘿,我刚好在做订阅防滥用的功能时研究过这个问题,来跟你唠唠~
你提到的这个需求确实挺棘手的:既要能在APP卸载后还能留存设备标识,用来限制订阅滥用,又得避开App Set ID的局限性——没错,App Set ID本质是绑定在开发者账号下的,用户把你所有的APP都卸载干净,这个ID就会被清除,确实靠不住。
下面是我整理的几个可行方向,各有优劣,你可以结合自己的场景选:
利用Android备份服务(Auto Backup)
你可以把生成的自定义设备标识(比如你自己生成的随机UUID,或者基于非敏感硬件信息的哈希)通过Auto Backup同步到Google云端。用户重装APP时,只要开启了系统备份功能,这个标识就能被恢复。但缺点也很明显:依赖用户主动开启备份,而且如果用户重置设备、换Google账号或者手动关闭了你的APP备份权限,这个机制就失效了。另外,这个标识是和用户的Google账号绑定的,不是纯设备级的。结合云端账号体系
如果你的APP要求用户登录账号,那其实可以把设备标识和用户账号强绑定——比如用户首次登录时,生成一个设备专属UUID存在你的后端,同时关联到用户账号。这样就算用户卸载重装,只要用同一个账号登录,就能快速识别到是同一设备,防滥用的效果会更直接。但这个方法的局限性是:如果你的APP支持游客模式,那游客用户就覆盖不到了。公共存储区域存储(仅作补充)
你可以尝试把标识存在系统的公共存储目录(比如Downloads下的隐藏文件),但安卓11及以上的Scoped Storage对公共存储的访问限制很严,你得申请额外的权限,而且用户可以很容易地找到并删除这个文件,安全性和可靠性都极低,绝对不能作为主要方案,顶多是对其他方案的补充。非敏感硬件信息哈希(有限可靠)
你可以收集一些非敏感的硬件信息(比如设备型号、主板信息、屏幕分辨率、CPU架构等),组合后生成一个唯一哈希值。但这种方式的问题是:极端情况下不同设备可能生成相同的哈希(概率极低但存在),而且用户如果刷机、修改系统参数,这个哈希会发生变化。另外,安卓10+已经限制了IMEI、SN码等敏感硬件信息的获取权限,普通APP根本拿不到,所以只能用非敏感字段组合,唯一性会打折扣。
最后得说句实在的:Android的安全设计本身就是让APP卸载后清除所有相关数据,所以没有100%完美的“卸载后必留存”的设备标识方案。建议你组合使用多个方案,比如App Set ID + 云端账号绑定 + 备份服务,这样能最大程度覆盖大部分场景,减少订阅滥用的可能。
备注:内容来源于stack exchange,提问作者proninyaroslav

