You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位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问题且无此情况。

疑问

  1. 采用什么策略定位问题根源?
  2. 是否可直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:51