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

server/2024/9/25 21:20:57/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

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

文章目录

  • Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决
    • 一、前言
    • 二、Android13源码下简单demo应用代码编译报错和分析解决
      • 1、AndroidManifest.xml文件代码:
      • 2、AndroidManifest.xml 原始代码报错和分析:
      • 3、其实具体原因和编译脚本Android.mk有关:
      • 4、最终没有问题的AndroidManifest.xml 代码
    • 三、其他AndroidManifest.xml.fixed 报错分析解决
      • 1、缺少必要字符,比如缺少一个引号
        • (1)示例代码:
        • (2)报错信息:
        • (3)报错分析和解决:
      • 2、标签属性错误,把标签名称写错
      • (1)如下图所示的示例代码,package 错误写错 packages :
      • 3、缺少必要标签
      • (1)缺少Activity 的 name 属性 示例
      • (2)报错信息分析和解决
      • (3)缺少Activity 的 exported 属性
      • (4)报错信息分析和解决:
      • 4、包冲突问题
      • 5、如果多一个无用标签会报错吗?
      • 6、其他相关
    • 四、总结

一、前言

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应用代码编译报错和分析解决

xml_32">1、AndroidManifest.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.demo.jnicallback"><applicationandroid: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文件就可以正常编译里面的代码了。

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

xml__73">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 节点

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

编译就没有问题了。

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

LOCAL_PACKAGE_NAME := JNIDemo1LOCAL_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 定义:

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

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

        <providerandroid: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 定义:

      <providerandroid: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 标签。

xml__229">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)根目录添加toolpackage="com.demo.jnicallback"><applicationandroid:allowBackup="true"android:appComponentFactory="com.demo.jnicallback" //(2)添加appComponentFactorytools:replace="android:appComponentFactory" //(2)添加replaceandroid: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>

xmlfixed__276">三、其他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、androidandroidx 都可能有相同的类,导入相同的包就会遇到这个问题。

这种情况,参考上面的代码,在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 0package="com.demo.jnicallback"><applicationandroid: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等四大组件缺少name4、从Android12 开始四大组件缺少 android:exported 属性5、从Android13 开始 导入系统recyclerview 必须加上一个 provider 标签信息6、一些导包编译冲突导致错误

http://www.ppmy.cn/server/27044.html

相关文章

Linux从入门到精通

第一章> 1、文件、用户、组、权限 2、Linux运行级别指定 3、文件目录指令 4、基础指令 第二章> 5、搜索、过滤、压缩 6、Shell脚本 7、配置JDK …

Git学习笔记(五)IDEA使用Git

在前面几篇文章中&#xff0c;我们已经介绍了git的基础知识&#xff0c;知道了其主要作用是用来进行代码的版本管理&#xff1b;并且已经介绍了Git操作的常用命令。在日常的开发环境下&#xff0c;除了通过Bash命令行来操作Git之外&#xff0c;我们另外一种常用的操作方式则是直…

数据结构----顺序表详解

顺序表的定义 顺序表&#xff08;SeqList&#xff09;属于线性表的同一种&#xff0c;它同样具有线性的存储结构&#xff0c;以下是百度百科关于顺序表的定义&#xff1a; 总结下来&#xff0c; 在结构上&#xff0c;顺序表实际上的底层结构就是数组&#xff0c;而顺序表本身也…

高德地图API入门使用vue

文章目录 最终效果一、在高德的开放平台申请key二、下载依赖&#xff1a;三、完整代码 最终效果 页面显示高德地图 一、在高德的开放平台申请key 在高德的开放平台申请key&#xff1a; https://console.amap.com/dev/key/app 申请的类型为web端&#xff08;js api&#xff…

Vitis HLS 学习笔记--S_AXILITE 寄存器及驱动

目录 1. 简介 2. S_AXILITE Registers 寄存器详解 2.1 “隐式”优势 2.2 驱动程序文件 2.3 硬件头文件 2.4 硬件头文件中 SC/COR/TOW/COH 的解释 2.5 驱动控制过程 3. 总结 1. 简介 回顾此博文《Vitis HLS 学习笔记--Syn Report解读&#xff08;1&#xff09;-CSDN博…

弹性网络回归(概念+实例)

目录 前言 一、基本概念 1. 弹性网络回归的原理 2. 弹性网络回归的优点 3. 弹性网络回归的应用 4. 弹性网络回归的调参 二、实例 前言 弹性网络回归&#xff08;Elastic Net Regression&#xff09;是一种用于处理回归问题的机器学习算法&#xff0c;它结合了岭回归&…

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机&#xff0c;但是Hostease这边的虚拟主机都是基于Apache的&#xff0c;尽管二者是不同的服务器软件&#xff0c;但是大多数情况下&#xff0c;通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件&#xff0c;…

Go语言基础语法(一):变量的声明与赋值

四种声明 变量声明 Go语言是静态类型语言&#xff0c;因此变量&#xff08;variable&#xff09;是有明确类型的&#xff0c;编译器也会检查变量类型的正确性。在数学概念中&#xff0c;变量表示没有固定值且可改变的数。但从计算机系统实现角度来看&#xff0c;变量是一段或…