如何定位Android应用中调用Edge-to-Edge废弃API的来源?
适配Android 15 Edge-to-Edge时Google Play警告排查问题
问题背景
为适配Android 15的新Edge-to-Edge要求更新应用后,部分项目上传Google Play收到警告:
Your app uses deprecated APIs or parameters for edge-to-edge
已修复部分问题,但剩余两处无法定位根源:
- 自身代码未调用废弃方法
- 已将样式更新至Material3
- 查看
mapping.txt发现两处调用:
调用1:WindowCompat相关
androidx.core.view.WindowCompat$Api30Impl -> androidx.core.view.j0$b: # {"id":"sourceFile","fileName":"WindowCompat.java"} 1:4:void setDecorFitsSystemWindows(android.view.Window,boolean):167:167 -> a
调用2:Material EdgeToEdgeUtils相关
com.google.android.material.internal.EdgeToEdgeUtils -> com.google.android.material.internal.c: # {"id":"sourceFile","fileName":"EdgeToEdgeUtils.java"} 5:16:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):83:83 -> a 17:27:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):85:85 -> a 28:42:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):88:88 -> a 43:48:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):90:90 -> a 49:54:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):93:93 -> a 55:57:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):97:97 -> a 58:65:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):99:99 -> a 66:73:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):100:100 -> a 74:76:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):102:102 -> a 77:79:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):103:103 -> a 80:91:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):107:107 -> a 92:94:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):105:105 -> a 95:102:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):111:111 -> a 103:106:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):110:110 -> a 107:110:void applyEdgeToEdge(android.view.Window,boolean,java.lang.Integer,java.lang.Integer):108:108 -> a 8:13:int getNavigationBarColor(android.content.Context,boolean):159:159 -> b 14:19:int getNavigationBarColor(android.content.Context,boolean):161:161 -> b 20:28:int getNavigationBarColor(android.content.Context,boolean):162:162 -> b 29:33:int getNavigationBarColor(android.content.Context,boolean):167:167 -> b 8:13:int getStatusBarColor(android.content.Context,boolean):142:142 -> c 14:19:int getStatusBarColor(android.content.Context,boolean):146:146 -> c 20:28:int getStatusBarColor(android.content.Context,boolean):147:147 -> c 29:33:int getStatusBarColor(android.content.Context,boolean):152:152 -> c 1:15:boolean isUsingLightSystemBar(int,boolean):171:171 -> d 1:8:void setLightNavigationBar(android.view.Window,boolean):136:136 -> e 9:12:void setLightNavigationBar(android.view.Window,boolean):137:137 -> e 1:8:void setLightStatusBar(android.view.Window,boolean):123:123 -> f 9:12:void setLightStatusBar(android.view.Window,boolean):124:124 -> f
但不清楚项目为何触发这些调用,另一结构相似的项目已解决所有Edge-to-Edge问题且无此情况。
疑问
- 采用什么策略定位问题根源?
- 是否可直接在Android Studio中检测废弃的Edge-to-Edge代码?目前仅能在上传Google Play后收到该警告。
补充说明
- 使用Java和XML布局文件
- 两个项目的Activity均设置
android:fitsSystemWindows="true",因需大量使用Toolbar,不设置则无法正常工作
解决方案与排查策略
一、定位问题根源的策略
1. 追踪依赖库调用链
- 用Android Studio的Find Usages功能,搜索
setDecorFitsSystemWindows和applyEdgeToEdge,勾选「Include library sources」选项,查看第三方库或Material组件内部的调用路径。 - 对比正常与异常项目的依赖版本:重点检查
androidx.core:core、com.google.android.material:material的版本,异常项目可能使用了未适配Android 15的旧版库。 - 测试
android:fitsSystemWindows="true"的影响:临时移除该属性(做好备份),观察警告是否消失——部分Material组件会基于此属性自动调用废弃的Edge-to-Edge工具方法。
2. 检查构建与混淆配置
- 对比正常项目的proguard规则,确认异常项目是否遗漏了Edge-to-Edge相关的混淆规则,导致mapping文件无法定位具体调用方。
- 检查构建变体差异:确认release/debug等变体是否引入了额外依赖或插件,触发废弃API调用。
3. 启用Lint废弃API检查
在build.gradle中配置:
android { compileSdkVersion 35 targetSdkVersion 35 lintOptions { check 'DeprecatedApi' warningsAsErrors false } }
运行./gradlew lint命令,查看是否有Edge-to-Edge相关的废弃API提示。
二、在Android Studio中提前检测废弃代码
1. Lint静态分析
- 打开「Analyze」→「Inspect Code」,勾选「Deprecated API Usage」,运行检查后查看Edge-to-Edge相关的废弃方法提示。
- 针对Android 15新增的废弃项,可添加Lint规则强制检查:
lintOptions { check 'NewApi' baseline file("lint-baseline.xml") }
2. 查看库源码
按住Ctrl点击WindowCompat或EdgeToEdgeUtils类名,查看setDecorFitsSystemWindows、applyEdgeToEdge是否被标记为@Deprecated,以及注释中的替代方案(如Android 15推荐使用WindowInsetsControllerCompat相关方法)。
3. API Inspector实时追踪
运行应用时,打开「Profiler」→「API Inspector」,过滤「Window」相关API,查看是否有废弃的Edge-to-Edge方法被调用。
三、针对性修复建议
- 升级
com.google.android.material:material至1.11.0+版本,该版本已适配Android 15的Edge-to-Edge要求,移除了内部废弃API调用。 - 替换
setDecorFitsSystemWindows为WindowCompat.setDecorFitsSystemWindows(window, false),配合WindowInsetsControllerCompat控制系统栏,同时调整布局的android:fitsSystemWindows逻辑。 - 若Material组件自动调用废弃方法,可通过自定义组件或覆盖组件的Edge-to-Edge逻辑规避。
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

