问题:
相信很多同学都遇到过android.enableAapt2=false不能再使用的情况,编译提示是2018年末就会禁用,然而当你去掉它的时候,编译会出错,各种乱七八糟的可能都有,究其原因也五花八门。这个问题困扰了我很久没有解决,因为以前android.enableAapt2=false还能使用就将就着用了。终于,在最新版本的Android Studio 3.5.2和Gradle 3.5.2下,这个问题不得不面对了。
//编译不过,提示aapt错误
AAPT: error: unexpected element <service> found in <manifest>.
提示的意思是说我的AndroidManifest中有<service>包含在根标签<manifest>中,然而并没有,报错指引到的代码明明在<application>里,应该是符合规定的。
解决:
无论是某度,谷歌,还是各种stackFlow啥的都找过了,都说是标签嵌套的位置不对,臣妾冤枉啊,陷入各种自我怀疑和百般尝试很久之后,终于发现了一些端倪:
在AndroidManifest文件中选择MergeManiFest视图,的确能看到,有几个<receiver>是在<application>之外的:
由此可猜测,是合并Manifest出现了错误,可是,我又没参与合并,怎么会出现错误呢?于是,我找到官方的合并规则:Manifest合并规则
在学习了一番规则之后......不出所料,还是不知道怎么搞,但可以确定的是问题的大致方向和大概的解决办法。经过又一顿疯狂调试和搜索之后终于给我找到正确的解决方法了,unexpected element found in
十分感谢这篇文章的作者。编译器说我的<receiver>是在<application>之外,那我就在<application>之外将它去把它remove掉总可以了吧
<service android:name="com.netease.nimlib.service.ResponseService"
tools:node="remove"/>
<application
android:name=".MyApplication">
...
</application>
编译一下,完美运行~
题外话
虽然写在外层预编译会红线报错,但是真编译却可以行得通,我想,这大概是官方还没有解决的bug吧.至于是哪个部分的bug,我感觉是Gradle工具,因为不同的Gradle版本往往编译出不同的结果,版本3.5.2我刚更新就跳了一个坑,无端端说我的某个databindingImpl不存在,我尝试性地降低了两个版本,换成3.3.2,就没有报错了。
每次更新AS版本或者Gradle都或多或少带来些坑要填,有时就想着不要更新好了,但这毕竟是逃避的做法,更新的目的肯定是改善体验或者提高效率的,如果太依赖旧版本的话,可能不仅要牺牲新版本带来的新功能特性,还要面临被淘汰的危机,所以,还是要拥抱变化,迎接挑战。但建议更新版本的时机不要在当前任务比较紧的情况下去更新,因为很容易就会导致耽误了最宝贵的时间。
网友评论