关于Android设备ANDROID_ID保护、权限管控及使用监测的技术问询
关于Android ID的三个问题解答
让我逐个拆解你的问题:
1. 能否对设备的Settings.Secure#ANDROID_ID进行保护?
Settings.Secure#ANDROID_ID是系统生成的64位字符串,用于标识设备,它的保护情况分两种场景:
- 系统层面的保护:普通第三方应用没有权限修改这个值——只有持有
WRITE_SECURE_SETTINGS权限的系统级应用才能修改,而这个权限不对第三方开放。也就是说,除非设备已Root,否则第三方应用没法篡改这个ID。 - 应用层面的保护(防止自身泄露):如果你是开发者,想避免自己的应用泄露这个ID,可以这么做:
- 不要在日志中明文打印
ANDROID_ID - 传输到服务器前对其进行哈希(比如SHA-256)或加密处理
- 如果用于广告追踪等场景,优先使用Google Play Services提供的广告ID(
AdvertisingIdClient.getAdvertisingIdInfo()),它支持用户手动重置,更符合隐私规范
- 不要在日志中明文打印
2. 在Android系统中,是否存在无需申请权限即可禁止应用获取ANDROID_ID的方法?
这个要分Android版本来看:
- Android 10(API 29)及以上:系统已经默认限制了第三方应用获取设备全局的
ANDROID_ID。当第三方应用调用你给出的代码时,会返回一个与应用签名绑定的唯一值(不同签名的应用拿到的值不同,卸载重装后也会变化),而非真正的设备级ID。从效果上看,这相当于禁止了应用获取设备全局标识,无需额外权限操作。 - Android 9(API 28)及以下:普通应用可以直接读取
ANDROID_ID且无需任何权限,此时没有无需权限的方法禁止其他应用获取这个值——除非你是系统应用、拥有Root权限,或者借助定制ROM自带的隐私管控功能。
你给出的获取代码是标准实现:
import android.provider.Settings.Secure; private String androidId = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
在Android 9及以下的非系统应用中,这段代码能拿到设备全局的ANDROID_ID;在Android 10及以上,拿到的是应用签名专属的标识。
3. 能否通过编程方式获知所有正在获取或使用ANDROID_ID的其他应用?
普通第三方应用做不到,原因如下:
- Android系统的沙箱机制会隔离不同应用的运行环境,不会暴露其他应用的方法调用细节。
- 要监控
ANDROID_ID的获取行为,需要Hook系统的Secure.getString方法,或者读取系统的应用行为日志,但这些操作都需要系统级权限或Root权限,而这些权限不对普通第三方应用开放。
如果拥有Root权限,你可以通过编写Xposed模块、Frida脚本等Hook工具,拦截Settings.Secure.ANDROID_ID的读取调用,记录发起调用的应用包名,但这已经超出了普通应用的能力范围。
内容的提问来源于stack exchange,提问作者impossible




