Android Studio 报已删除未引用资源resource not found错误
问题描述
替换Android OptionsMenu图标资源、删除旧测试图标后,AAPT编译报错提示找不到已删除的旧图标资源drawable/ic_baseline_pause_24,全局搜索无该资源引用,重启IDE、执行Invalidate Caches and Restart后问题仍存在,且修改图标后界面仍显示旧图标。
相关代码
MainActivity.java 菜单相关逻辑
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); View view = findViewById(R.id.action_item_two); //noinspection SimplifiableIfStatement if (id == R.id.action_item_one) { // Do thing one return true; } if (id == R.id.action_item_two) { // Do thing two return true; } return super.onOptionsItemSelected(item); }
res/menu/main.xml 菜单配置
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_item_one" android:icon="@drawable/ic_help" app:showAsAction="always" android:title="Hilfe"> </item> <item android:id="@+id/action_item_two" android:icon="@drawable/ic_forward_30_48px" app:showAsAction="always" android:title="Sekunden"> </item> </menu>
解决方案
按以下顺序排查,绝大多数同类缓存/残留引用问题都能解决:
- 先做全量构建清理:点Android Studio顶部菜单栏的
Build > Clean Project,执行完成后再点Build > Rebuild Project。别直接点运行按钮走增量构建,增量构建会复用之前编译好的中间资源,经常出现代码改了但打包进去的还是旧资源的情况。 - 排查所有资源路径下的同名菜单文件:你当前查看的是主目录下的
res/menu/main.xml,但如果项目开了多构建变体(debug、release、不同渠道包),或者有适配不同系统版本的资源目录(比如res/menu-v21/、src/debug/res/menu/这类路径),这些位置下的同名main.xml大概率还保留着旧的图标引用。报错提示问题在main.xml第4行,刚好和你贴的代码里第一个item的icon属性行位置对应,优先排查这类其他路径的同名文件。 - 手动彻底清理本地缓存:关闭Android Studio,直接删除项目根目录下的
.gradle、.idea文件夹,还有app模块里的build文件夹,删完再重新打开项目等Gradle同步完成后再构建。这步比点Invalidate Caches清理得彻底得多,能把IDE和构建工具存储的所有本地缓存都清掉。 - 检查新图标有没有间接引用旧资源:如果你新替换的
ic_help、ic_forward_30_48px是xml格式的矢量图,打开对应的资源文件,看看里面有没有写错属性引用到旧的ic_baseline_pause_24;如果是png、webp这类位图资源,确认文件名没拼写错误,存放在了有效的drawable目录下。 - 清理设备端残留:如果编译通过但界面还是显示旧图标,先把模拟器或者真机上安装的旧版本应用彻底卸载,再安装新构建的安装包,避免系统拉取旧应用的缓存资源。
容易遗漏的点:如果项目有多个library模块,也要检查其他模块里有没有同名的main.xml菜单文件,或者同名drawable的引用冲突,资源合并阶段很容易把其他模块的旧引用带进来。
内容的提问来源于stack exchange,提问作者R D
相关产品推荐
相关产品推荐

