解决 fo

作者: JohnsonZzzz | 来源:发表于2019-11-19 00:45 被阅读0次

    问题:

    相信很多同学都遇到过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>之外的:

    image.png
    由此可猜测,是合并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都或多或少带来些坑要填,有时就想着不要更新好了,但这毕竟是逃避的做法,更新的目的肯定是改善体验或者提高效率的,如果太依赖旧版本的话,可能不仅要牺牲新版本带来的新功能特性,还要面临被淘汰的危机,所以,还是要拥抱变化,迎接挑战。但建议更新版本的时机不要在当前任务比较紧的情况下去更新,因为很容易就会导致耽误了最宝贵的时间。

    相关文章

      网友评论

          本文标题:解决 fo

          本文链接:https://www.haomeiwen.com/subject/vkdiictx.html