我的应用违反Android Advertising ID政策,如何排查依赖获取IMEI?
排查依赖中获取IMEI的方法
别担心,我帮你梳理几个靠谱的方法来找出哪个依赖在悄悄获取IMEI,解决Google Play的政策驳回问题:
1. 用Android Studio Lint快速检测
Android Studio自带的Lint工具能直接定位调用IMEI相关API的代码,步骤很简单:
- 点击顶部菜单栏的
Analyze→Inspect Code... - 在弹出窗口中选择整个项目,点击
OK开始检查 - 检查完成后,在结果面板的
Security分类下,找Using IMEI without permission或类似条目,里面会明确显示调用getDeviceId()(获取IMEI的核心方法)的类和所属依赖库
2. 全局搜索IMEI相关API
用Android Studio的全局搜索功能直接定位调用:
- 按下快捷键
Ctrl+Shift+F(Mac是Cmd+Shift+F),打开Find in Path窗口 - 搜索关键词:
getDeviceId、getImei(Android 6.0+的API) - 在
Scope下拉框中选择External Libraries,只搜索依赖库代码 - 搜索结果会直接显示哪个依赖库的哪个类调用了这些方法,一目了然
3. 日志追踪调用栈
如果上面的方法没找到,你可以通过Hook获取IMEI的方法,打印调用栈来溯源:
用AspectJ织入代码(需要先配置AspectJ依赖),在Application初始化时添加追踪逻辑:
@Aspect public class ImeiTracker { @Around("call(* android.telephony.TelephonyManager.getDeviceId()) || call(* android.telephony.TelephonyManager.getImei(int))") public Object trackImeiCall(ProceedingJoinPoint joinPoint) throws Throwable { // 打印完整调用栈 StringBuilder stackTrace = new StringBuilder("IMEI调用栈:\n"); for (StackTraceElement element : Thread.currentThread().getStackTrace()) { stackTrace.append(element.toString()).append("\n"); } Log.d("IMEI_TRACKER", stackTrace.toString()); // 继续执行原方法 return joinPoint.proceed(); } }
运行App后,查看Logcat中的IMEI_TRACKER日志,就能清楚看到是哪个依赖库的代码触发了IMEI获取。
4. 针对性排查可疑依赖
从你的依赖列表来看,重点排查这几个库:
- Batch SDK(1.11.0):旧版本的Batch可能默认收集设备标识符,建议查看官方文档,确认是否有禁止收集IMEI的配置开关,或者直接升级到最新版本
- Zooz SDK(本地jar):本地依赖的jar包容易被忽略,直接反编译这个jar,搜索是否有调用IMEI相关API的代码
- Crashlytics:虽然Crashlytics主要收集崩溃信息,但也可以检查其配置,确认是否有默认收集设备标识符的行为
另外,你已经配置了AppsFlyer不收集IMEI,所以可以暂时排除它的嫌疑。
内容的提问来源于stack exchange,提问作者Ignasi
相关产品推荐
相关产品推荐

