Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决
文章目录
- [Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决](#Android13 源码环境编译app源码报错AndroidManifest.xml.fixed分析解决)
-
- 一、前言
- 二、Android13源码下简单demo应用代码编译报错和分析解决
-
- 1、AndroidManifest.xml文件代码:
- [2、AndroidManifest.xml 原始代码报错和分析:](#2、AndroidManifest.xml 原始代码报错和分析:)
- 3、其实具体原因和编译脚本Android.mk有关:
- [4、最终没有问题的AndroidManifest.xml 代码](#4、最终没有问题的AndroidManifest.xml 代码)
- [三、其他AndroidManifest.xml.fixed 报错分析解决](#三、其他AndroidManifest.xml.fixed 报错分析解决)
-
- 1、缺少必要字符,比如缺少一个引号
- 2、标签属性错误,把标签名称写错
- [(1)如下图所示的示例代码,package 错误写错 packages :](#(1)如下图所示的示例代码,package 错误写错 packages :)
- 3、缺少必要标签
- [(1)缺少Activity 的 name 属性 示例](#(1)缺少Activity 的 name 属性 示例)
- (2)报错信息分析和解决
- [(3)缺少Activity 的 exported 属性](#(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应用代码编译报错和分析解决
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、一些导包编译冲突导致错误