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、一些导包编译冲突导致错误
相关推荐
openinstall全渠道统计3 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫3 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫3 小时前
一句话说透Android里面的查找服务
android
双鱼大猫3 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫3 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫4 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫4 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫4 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
苏金标5 小时前
android 快速定位当前页面
android
雾里看山8 小时前
【MySQL】内置函数
android·数据库·mysql