您当前的位置:首页 > 计算机 > 软件应用 > 开发(IDE)

android studio运行应用报找不到资源问题

时间:02-05来源:作者:点击数:

比如:

Android resource linking failed
...\merged.dir\values-v26\values-v26.xml:7: error: resource android:attr/colorError not found.
...\merged.dir\values-v26\values-v26.xml:11: error: resource android:attr/colorError not found.
...\merged.dir\values-v26\values-v26.xml:15: error: style attribute 'android:attr/keyboardNavigationCluster' not found.
...\merged.dir\values\values.xml:2079: error: resource android:attr/fontStyle not found.
...\merged.dir\values\values.xml:2079: error: resource android:attr/font not found.
...\merged.dir\values\values.xml:2079: error: resource android:attr/fontWeight not found.
error: failed linking references.

由于文件路径太长,已经省略了前面的很多路径,我们主要看后面的就行了,不运行应用时没有报错,运行时编译就报错了,不知道为什么要在编译运行时才报错。

这个错误说的比较明白了,但是如果没经验的话还是一头雾水的,我在项目中引入了Kotlin的Anko,如下:

implementation "org.jetbrains.anko:anko:$anko_version"

然后运行就报错了,这是因为这个库又依赖到了其他一些库,而这些库里面有包含这些报错的xml资源文件,这些资源文件里面引用了一些xml属性,我们看到这些属性是android:attr,以android命令空间打头的肯定是系统属性,说找不到这个属性那就是这个版本的系统就没有这个属性,所以找不到,像我上面那个错误就很好解决,因为我们看到有values-v26,说明使用这个资源的库他的编译版本最少是26吧,所以我把我项目的编译版本(compileSdkVersion)也设置成26,编译就能过了,因为在Api26版本中有这些对应的属性,26以下的版本就没有这些属性。如果报出来的错误中没有版本信息,则你需要找你依赖的库里面使用到的一些支持库,看他的版本是多少,找最高的版本,我们编译版本就设置和它一样就行了,示例如下:

在这里插入图片描述

可以看到anko它是需要 sdk27来编译的,但是我发现我用26编译也没问题。

后续(2021年6月24日):

后来有一个项目,我记得就更新了一下Gradle版本,代码没改动啊,突然就运行不了了,报如下错误:

> Task :Angel:processDebugResources FAILED
AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml","position":{"startLine":4,"startColumn":4,"startOffset":217,"endLine":7,"endColumn":12,"endOffset":426}}],"original":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml:5:5-8:13: AAPT: error: resource android:attr/colorError not found.\n    ","tool":"AAPT"}
AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml","position":{"startLine":8,"startColumn":4,"startOffset":431,"endLine":11,"endColumn":12,"endOffset":652}}],"original":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml:9:5-12:13: AAPT: error: resource android:attr/colorError not found.\n    ","tool":"AAPT"}
AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml","position":{"startLine":12,"startColumn":4,"startOffset":657,"endLine":15,"endColumn":12,"endOffset":891}}],"original":"C:\\Users\\even\\.gradle\\caches\\transforms-2\\files-2.1\\b380e3a83472853140378ff982a8e787\\appcompat-v7-26.0.2\\res\\values-v26\\values-v26.xml:13:5-16:13: AAPT: error: style attribute 'android:attr/keyboardNavigationCluster' not found.\n    ","tool":"AAPT"}

Execution failed for task ':Angel:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Android resource linking failed
     C:\Users\even\.gradle\caches\transforms-2\files-2.1\b380e3a83472853140378ff982a8e787\appcompat-v7-26.0.2\res\values-v26\values-v26.xml:5:5-8:13: AAPT: error: resource android:attr/colorError not found.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

我们看关键的地方:

values-v26\values-v26.xml:5:5-8:13: AAPT: error: resource android:attr/colorError not found.

values-v26 这个v26表示了这个values只能用在API 26的Android版本,并不是说我的应用支持的最低版本要为26,而是说如果你的手机版本是API 26,则会使用这个values-v26里面的值,如果不是,则会使用其他values目录里面的值,所以,这里我就搞不懂了,为什么会报错?我的设置的最低版本为15,目标版本和编译版本均为26,但是还是报这个错,真是见鬼了!

从控制台中点开这个报错的values-v26.xml文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    。。。
    <style name="Base.V26.Theme.AppCompat" parent="Base.V23.Theme.AppCompat">
        <!-- We can use the platform styles on API 26+ -->
        <item name="colorError">?android:attr/colorError</item>
    </style>
    。。。
</resources>

按住 Ctrl 键点击“?android:attr/colorError”,确实可以正常跳转,如下:

在这里插入图片描述

如上图所示,在android-26版本确实是有这个colorError属性的呀,为什么编译的时候会说找不到这个属性呢?而且我的编译版本明明是26,为什么会说找不到这个属性啊!真是见了鬼了!一生气,我就把build.gradle中的appcompat给删掉了,老子不用它了,气死我了!如下:

// implementation 'com.android.support:appcompat-v7:26.0.2'

当然了,这是因为我的项目中没用到这个兼容包里的东西,如果真的用到了,那真不知道怎么解决了,见鬼!

再后来,哎,还是得找出解决方案,不用是不行的,因为我那个项目下有好几个module,其中一个注释掉不用appcompat-v7是可以的,因为那个项目没怎么用到支持库的东西,但是另外的几个项目用到了,而且用到的地方还不少,不可能不用啊,没办法,硬着头皮找答案,百度、Google什么的,都试过了,找不到答案,最后仔细想了一下,不就是更新了Gradle嘛,之前是可以的嘛,说明编译版本设置是没问题的,只是编译工具出了问题,但是我又不想把Gradle的版本改回去,因为我使用了较新的kotlin版本,这需要较新的Gradle版本才能支持,最后我才想到,如果按着android-26的版本去编译的话,肯定是没问题的,但是我明明已经设置为26了还报错,是不是说明了gradle工具没有使用26来编译呢?抱着这个疑问,我把项目下的所有module的编译版本都改到了26或更高,然后再次支行,哎,OK了,我去他大爷的,这google真是坑爹啊,搞这种Bug来坑我!

简单总结一下这个坑:module A的编译版本设置为26,module B的编译版本设置为25,此时支行module A,报错说module A的某个属性不存在,但是这个属性明明在26版本是存在的,解决方案就是把module B的编译版本也设置为26,再运行module A就不会报错了。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门