Android Studio 3.0清单错误:找到未知元素<action>

时间:2017-10-26 07:43:44

标签: android android-manifest aapt

  

注意:请不要发布此“android.enableAapt2 = false”作为答案。它是的解决方案。它只是忽略了在运行时没有引起任何问题的真正错误。

     

解决方案很简单,只是在清单文件中的意图过滤器之外错误地放置了操作标记

有一个由Android Studio 2.3构建的应用程序很好。 更新Android Studio 3.0 稳定后,开始出现此错误,无法构建我的项目。

这是我的manifest.xml

<application
    android:name=".ApplicationClass"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <!--other unrelated stuff-->

    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.xxx.xxx" />
        </intent-filter>
    </receiver>
</application>

错误显示此行:

<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

如果我评论/删除此操作标记行,项目构建正常,但GCM是必要的,我无法将其删除。

当您看到日志时,错误不会出现在主清单文件中,发生在/build/intermediates/manifests/full/debug/AndroidManifest.xml

尝试清理,重建,禁用即时运行。有没有解决方案?

错误记录:

/THE_PROJECT_PATH/app/build/intermediates/manifests/full/debug/AndroidManifest.xml
Error:(99) error: unknown element <action> found.
Error:(99) unknown element <action> found.
Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
Error:Execution failed for task ':app:processDebugResources'.
> Failed to execute aapt
Information:BUILD FAILED in 1s
Information:6 errors
Information:0 warnings
Information:See complete output in console

8 个答案:

答案 0 :(得分:34)

你的标签错位了。新的AAPT(AAPT2)现在就会引发错误。

来自此处的文档:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

  

使用AAPT2

时行为会发生变化            

为了改善增量资源处理,Android插件3.0.0默认启用AAPT2。虽然AAPT2应该可以立即使用旧项目,但本节介绍了一些您应该注意的行为更改。

     

Android清单中的元素层次结构

     

在以前版本的AAPT中,嵌套在Android清单中错误节点中的元素会被忽略或导致警告。例如,请考虑以下示例:

NMAMapMarker
     

以前版本的AAPT会忽略错位标签。但是,使用AAPT2,您会收到以下错误:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>
     

要解决此问题,请确保您的清单元素已正确嵌套。有关详细信息,请阅读Manifest file structure

答案 1 :(得分:16)

root 项目的 gradle.properties 中添加此代码:

android.enableAapt2=false

这对我有用

root 
| 
|--gradle.properties

答案 2 :(得分:1)

为了总结和简化:您应该专注于主AndroidManifest.xml文件,并检查它是否严格遵循序列以及https://developer.android.com/guide/topics/manifest/manifest-intro.html中所述的XML标记嵌套。否则IDE会打开调试级别的AndroidManifest.xml,每次你尝试清理/构建项目时都会出现很多错误,让你感到困惑!

答案 3 :(得分:1)

根据article将操作内容放入intent-filter中,如下所示。

<intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
 </intent-filter>

答案 4 :(得分:0)

只需重命名您的清单文件:AndroidManifest.xmlold,然后创建一个新的XML文件并命名:AndoridManifest.xml。然后在删除带有标记的行后,只复制旧文件的内容。构建&gt;清理项目,然后再次运行&gt;调试应用程序。然后问题就会消失。

答案 5 :(得分:0)

我们有解决这个问题的方法,解决方案是服务总是属于<Application <service>>的子格式 当我们在<Application>之外编写代码时,就会出现问题。服务是Manifest中应用程序的子代... 好的......它一定会有用的..它吧

答案 6 :(得分:0)

我最近在gradle.properties上进行了此修复,但警告不断,“不建议使用'android.enableAapt2'选项...”,解决方案是将其更改为true。

答案 7 :(得分:-1)

在我的AndroidManifest.xml应用程序中,标记接收器位于application标记下,这是生成失败的原因,并显示消息.../android/app/build/intermediates/manifests/full/debug/AndroidManifest.xml:25: AAPT: error: unknown element <receiver> found。在将其放入应用程序标记后,该项目已成功编译。就这样