如何修复JitPack构建时触发的AAPT生成android:id/icon外部包警告
AAPT告警「generated id 'android:id/icon' for external package 'android'」修复方案
告警触发逻辑
AAPT在编译资源时发现,当前布局引用的android:id/icon属于系统Android包的非公开资源,不在当前compileSdk可访问的公开资源列表中,只能临时为系统包生成占位ID完成编译,因此抛出告警。
这类告警并非单纯的格式提示,往往会导致运行时自定义Preference的图标绑定逻辑失效,出现图标不显示的bug。
具体修复步骤
- 打开告警指向的布局文件:
commons/src/main/res/layout/md_preference_custom.xml,跳转至第14行的控件节点 - 检查该行的id属性写法,绝大多数场景下此处为错误引用:
android:id="@android:id/icon"- 规则说明:
@android:id/xxx格式的引用,仅可使用系统已公开的预置ID(如@android:id/list、@android:id/empty),引用未公开的系统资源ID必然触发该类告警
- 规则说明:
- 根据业务场景选择修复方式:
- 无需适配系统Preference框架的ID绑定规则:直接将该行ID替换为项目内自定义ID,修改为
android:id="@+id/icon",后续代码通过本地ID查找控件实现逻辑即可 - 需要保留框架自动绑定图标的逻辑:直接将项目依赖的
androidx.preference库升级至最新稳定版本——该告警是老版本androidx.preference库的历史遗留问题,旧版本的默认布局文件中存在对未公开系统ID的错误引用,新版本已经完成修复
- 无需适配系统Preference框架的ID绑定规则:直接将该行ID替换为项目内自定义ID,修改为
- 临时兜底方案:如果暂时无法升级依赖,可在模块的
res/values/目录下新建ids.xml文件,手动声明对应ID完成映射:<?xml version="1.0" encoding="utf-8"?> <resources> <item name="icon" type="id" /> </resources>
注意:不要为了快速消除告警在gradle配置中全局屏蔽AAPT告警级别,该操作会掩盖资源引用不匹配的问题,最终引入运行时绑定失效的bug。
内容的提问来源于stack exchange,提问作者Y A
相关产品推荐
相关产品推荐

