Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决总结

Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决

一、前言

Android13 从Studio正常编译运行的app代码在源码中编译 有可能报错:AndroidManifest.xml.fixed …

网上说法很多,有的说是添加android:appComponentFactory=“XXX” 和 tools:replace="XXX"就可以。

Android·13 之前的方案使用上面的属性添加可能有效,这个修改主要针对包冲突问题(support和androidx ),

但是在Android13 或更新的版本可能就没有作用了,因为Android13 有些情况会有新的要求。

除了Android13,之前的代码,也是有可能出现AndroidManifest.xml.fixed …问题报错。

AndroidManifest.xml.fixed …报错有很多种情况,fixed 翻译是固定的意思,

这个大概意思就是AndroidManifest.xml 的代码与固定格式不符,出现问题的情况:

比如缺少必要标签,缺少某个标签字符串不对,缺少双引号,缺少箭头等等情况。

AndroidManifest.xml.fixed …问题要如何分析报错日志解决,本文进行展开介绍一下。

普通应用开发不一定会遇到,但是系统开发基本都会遇到,可以先收藏。

二、Android13源码下简单demo应用代码编译报错和分析解决

1、AndroidManifest.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo.jnicallback">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:directBootAware="true"
        android:theme="@style/Theme.JniLoadso">

        <activity android:name=".MainActivity"  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

    </application>

</manifest>

这个apk的代码,在Android Studio中是可以正常编译通过和正常运行的。

看起来没啥问题,必要的exported属性也添加了。

代码放到源码中,正常情况只要添加一个Android.mk或者Android.bp文件就可以正常编译里面的代码了。

但是实际上有可能报错,下面是具体原因分析。

2、AndroidManifest.xml 原始代码报错和分析:

报错信息:

在这里插入图片描述

主要报错文本信息:

/bin/bash -c "out/host/linux-x86/bin/manifest-merger --main 
out/.../manifest/AndroidManifest.xml.fixed            
--libs out/.../manifest/AndroidManifest.xml:
out/.../androidx.recyclerview_recyclerview_intermediates/manifest/AndroidManifest.xml:
out/.../androidx.appcompat_appcompat_intermediates/manifest/AndroidManifest.xml           Error:
        Attribute provider#androidx.startup.InitializationProvider@authorities value=(com.google.android.material.androidx-startup) 
        Suggestion: add 'tools:replace="android:authorities"' to <provider> element at AndroidManifest.xml.fixed:32:9-43:20 to override.
11:02:47 ninja failed with: exit status 1

#### failed to build some targets (03:19 (mm:ss)) ####

从这里代码看,很难看出具体原因。androidx-startup 其实是Google一个新的组件,JetPack的新成员!

报错只说了跟libs包 androidx-startup属性有关,并且建议添加 provider节点和tools标签;

并且里面的的行数是不对的,AndroidManifest.xml 总共才27行,这里报错32行到43行?

所以有些情况看报错行数是不行的!

网上查了一下,有的说在application节点里面添加:

        android:appComponentFactory="com.demo.jnicallback"
        tools:replace="android:appComponentFactory"

还是报一样的错误。

最后根据添加报错提示添加provider 节点

 <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="com.google.android.material.androidx-startup"
            tools:replace="android:authorities"/>

编译就没有问题了。

3、其实具体原因和编译脚本Android.mk有关:

LOCAL_PACKAGE_NAME := JNIDemo1

LOCAL_STATIC_ANDROID_LIBRARIES := \
    com.google.android.material_material \
    androidx.recyclerview_recyclerview \ //具体报错原因就是因为添加了androidx的recyclerview
    ...

这个是对Android.mk一个个属性排除验证才发现的。具体为啥是这样,不清楚啊。

难道最新的recyclerview的源码也在JetPack的相关包里面?

并且对比了系统很多app的源码,mk或者bp里面添加了recyclerview_recyclerview包编译的app源码,

都在AndroidManifest.xml 里面添加了 provider

比如原生Settings中,Android.bp文件导入了 recyclerview_recyclerview 包

android_app {
    name: "Settings",
}

android_library {
    name: "Settings-core",
	static_libs: [
        "androidx-constraintlayout_constraintlayout",
        "androidx.recyclerview_recyclerview", // recyclerview_recyclerview
        ...
}

但是不同的app添加的 provider 具体信息有些是不一样的,

Settings 源码的 AndroidManifest.xml 的 provider 定义:

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            tools:node="remove" />

其他的系统app应用源码的 AndroidManifest.xml 的 provider 定义:

        <provider
            android:name="androidx.startup.InitializationProvider"
            tools:replace="android:authorities"
            android:authorities="${applicationId}.startup-tests"
            android:exported="false"
            android:enabled="false"
            android:multiprocess="true"/>

其他的系统app应用源码2的 AndroidManifest.xml 的 provider 定义:

      <provider
          android:name="androidx.startup.InitializationProvider"
          android:exported="false"
          android:authorities="com.android.cellbroadcastreceiver.androidx-startup"
          tools:node="remove" />

不同的应用,provider 里面的具体信息可能有差异,一般根据报错信息添加必要属性就行。

有尝试把Setings里面的 provider 标签复制过来用,发现是会报错的。

上面添加了 android:name=“androidx.startup.InitializationProvider” 的 provider 标签的app源码应用,

都是在Android.mk 或者Android.bp文件中 添加了recyclerview_recyclerview包参与编译的。

所以在Android13或者更新的系统版本的系统源码中编译app代码,

如果编译加载了系统的 recyclerview_recyclerview包 ,是一定要添加provider 标签。

4、最终没有问题的AndroidManifest.xml 代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    coreApp="true"
    xmlns:tools="http://schemas.android.com/tools" //(1)根目录添加tool
    package="com.demo.jnicallback">


    <application
        android:allowBackup="true"
        android:appComponentFactory="com.demo.jnicallback" //(2)添加appComponentFactory
        tools:replace="android:appComponentFactory" //(2)添加replace
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:directBootAware="true"
        android:theme="@style/Theme.JniLoadso" >
        <activity android:name=".MainActivity"  android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
        
         <provider //(3)添加provider和相关标签
            android:name="androidx.startup.InitializationProvider"
            android:authorities="com.google.android.material.androidx-startup"
            tools:replace="android:authorities"/>
    </application>

</manifest>

三、其他AndroidManifest.xml.fixed 报错分析解决

下面的报错是一些基本的报错情况,有些情况是哪个版本的Android源码都会。

1、缺少必要字符,比如缺少一个引号

(1)示例代码:

在这里插入图片描述
这里application的name属性,后面少了一个引号。

(2)报错信息:

在这里插入图片描述

主要报错信息:

error: not well-formed (invalid token): line 18, column 29
14:02:11 ninja failed with: exit status 1
(3)报错分析和解决:

上面的 AndroidManifest.xml 代码,明明是第十七行代码缺少了一个引号,为啥报错是第十八行?

其实原因是,系统检测两个引号之间的代码,所以报错具体位置是下一个引号的代码位置。

这种报错在十七行代码后面加上必要的引号就可以了。

2、标签属性错误,把标签名称写错

(1)如下图所示的示例代码,package 错误写错 packages :

在这里插入图片描述

(2)报错信息和分析解决

在这里插入图片描述

报错关键信息:

Main AndroidManifest.xml at AndroidManifest.xml.fixed 
manifest:package attribute is not declared

这种报错信息,虽然没写明第几行报错,但是冲这个报错信息是很容易就看出 缺少了必要属性“package”。

检查“package”属性是否写正确就可以解决这个错误了;

同时packages属性没有报错,说明多加一个没用的属性是不影响的。

3、缺少必要标签

(1)缺少Activity 的 name 属性 示例

也是上面错误标签图片的代码,第十八行缺少了去除了name属性。

(2)报错信息分析和解决

在这里插入图片描述

关键错误信息:

 Missing 'name' key attribute on element activity at AndroidManifest.xml.fixed:9:9-16:20

这里错误的明明是第十八行,为啥报错是9-16行,这个估计和具体编译环境有关。

但是冲这个错误信息还是比较容易知道,该错误是activity标签 缺少了"name" 属性造成的错误。

检查“name”属性是否写了,就可以解决这个错误了。

(3)缺少Activity 的 exported 属性

也是第十八行代码,保留activity 的name属性代码,去除 android:exported=“true” 代码

(4)报错信息分析和解决:

在这里插入图片描述

关键错误信息:

android:exported needs to be explicitly specified for <activity>. 
Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` 

但是冲这个错误信息虽然没写那行报错,但是也是可以看出:

该错误是activity标签 缺少了"exported" 属性造成的错误,并且说明了Android12开始这个属性就是强制要求的。

检查“exported”属性是否写了,就可以解决这个错误了。

Android12 开始AndroidManifest.xml里面的四大组件都是要写 exported 属性的,否则可能会编译报错。

4、包冲突问题

以前Android11 遇到过,那时候support、android、androidx 都可能有相同的类,导入相同的包就会遇到这个问题。

这种情况,参考上面的代码,在application标签中添加appComponentFactory 和 replace 属性可能就没有问题。

现在基于Android13或者更新的代码,估计不好复现,所以不进行演示了。

网上其他相关冲突解决参考:

Android Studio Manifest冲突和库冲突解决方法:

https://blog.csdn.net/qq_56222266/article/details/125578883

三方包冲突AndroidManifest冲突如何解决:

https://blog.csdn.net/big_sea_m/article/details/86536928

Android12 AndroidManifest使用uses-library编译报错解决:

https://blog.csdn.net/zcyxiaxi/article/details/121555788

5、如果多一个无用标签会报错吗?

一般是不会报错的,但是有些情况也会报错

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    aa="defalut" //(1)这不会报错
    tett:xx="xox"//(2)这个会报错,error: unbound prefix: line 2, column 0
    package="com.demo.jnicallback">

	<application
        android:allowBackup="true"
        android:mytest="nihao" //(3)会报错, error: attribute android:mytest not found.
        ab = "tesst">  //(4)这不会报错
        <activity android:name=".MainActivity" 
        android:exported="true" bb = "nihao" > //(5)这不会报错
        ....

从上面定义的属性看,直接写没用的key=“value”属性是不会报错的,

但是如果写写错固定前缀的属性,写错是会报错的,

比如上面的 android:mytest=“nihao” ,android没有定义mytest属性,所以会报错 error: attribute

或者乱写属性前缀 tett:xx=“xox” 也会报错 error: unbound prefix。

6、其他相关

Android13 Studio新建的代码编译报错INSTALL_PARSE_FAILED_MANIFEST_MALFORMED解决:
https://blog.csdn.net/wenzhi20102321/article/details/138010309

Android Studio 新建Android13 代码提示Build Tools revision XX is corrupted无法编译解决:
https://blog.csdn.net/wenzhi20102321/article/details/138010007

上面两个都是针对Android Studio代码报错的,第一个是编译报错,第二个是直接提示无法编译。

四、总结

AndroidManifest.xml.fixed … 报错情况千千万,具体情况具体分析,

编译报错的信息肯定是有用的,只是有时候看起来没啥用而已,

有时候要结合编译脚本mk/bp具体内容分析,不要放过任何一个细节。

AndroidManifest 大致会存在的报错情况:

1、缺少必要的字符信息,比如缺少一个冒号,会导致格式完全不对

2、标签属性写错,缺少必要的属性信息

3、activity等四大组件缺少name

4、从Android12 开始四大组件缺少 android:exported 属性

5、从Android13 开始 导入系统recyclerview 必须加上一个 provider 标签信息

6、一些导包编译冲突导致错误
  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值