原文地址:关于Android12安装apk出现-108异常INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的解决方法 - Stars-One的杂货小窝

问题描述

用户的小米手机上出现以下界面问题

小米手机为Android12系统,根据安装错误码得知,这个是由于AndroidManifest资源结构存在错误导致的

解决方法

解决方法其实在之前一文关于Android安装apk出现解析包异常问题情况总结 - Stars-one - 博客园也已经提到过了,这次来此详细的说明

如果您的应用以 Android 12 或更高版本为目标平台,且包含使用 intent 过滤器的 activity、服务或广播接收器,您必须为这些应用组件显式声明 android:exported 属性。

警告:如果 activity、服务或广播接收器使用 intent 过滤器,并且未显式声明 android:exported 的值,您的应用将无法在搭载 Android 12 或更高版本的设备上进行安装。

如果应用组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,请将 android:exported 设置为 false。

翻译成通俗的语言就是说,当你的AndroidManifest.xml中文件中,如果存在Activity,Receiver,Service使用到了<intent-filter>标签,则是要显示声明android:exported的值

大部分常规设置为android:exported="false"即可,如下面一个简单的例子:

<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>

如果包含启动(LAUNCHER)类别,则声明为true(实际上说的是App首次启动打开的那个Activity),如下面代码:

<activity android:name=".MainActivity" android:exported="true" android:theme="@style/MySplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

如果自己去一个个排查就比较麻烦,可以用Android Studio去辅助调整,在Android Studio 2020.3.1 Canary 11 或更高版本会有对应的Lint提示,打开AndroidManifest.xml会有提示警告,且编译的时候会报错(如果你不调整的话)

进一步排查三方aar

一般来说,按照上面改完AndroidManifest文件就差不多了

但是,我验证过了,使用高版本确实是能够编译成功,但还是会报错

于是想到了,IM模块还有依赖其他aar(如各大手机厂商的推送SDK),里面的清单文件可能没改?

于是通过左侧项目管理器的依赖查看功能,可以一个个查看AndroidManifest文件,于是便是发现是存在有某些有用到了<intent-filter>标签的,但是没有声明exported属性的

这个时候有两种解决思路:

  • 1.升级第三方SDK版本
  • 2.使用Manifest的合并功能

1.升级第三方SDK版本

这个就比较简单,一般用的第三方SDK都会积极更新,我们去拿到最新的版本,然后重新依赖即可

这里,我是直接参考了腾讯IM最新的demo代码,对版本进行了升级

// 主包
implementation 'com.tencent.tpns:tpns:1.3.1.1-release'
// 小米
implementation "com.tencent.tpns:xiaomi:1.3.1.1-release"
// 魅族
implementation "com.tencent.tpns:meizu:1.3.1.1-release"
// OPPO
implementation "com.tencent.tpns:oppo:1.3.1.1-release"
// vivo
implementation "com.tencent.tpns:vivo:1.3.2.0-release"
// 华为
implementation 'com.tencent.tpns:huawei:1.3.1.1-release'

然后发现,腾讯IM的demo并没有升级华为推送,华为推送SDK里面还有存在对应没有声明exported的组件,于是就去华为推送官网找了个新版本下载,就成功解决问题了

implementation 'com.huawei.hms:push:6.7.0.300'

当然,这里还需要添加一下华为的maven仓库源

maven {url 'https://developer.huawei.com/repo/'}

最终问题得以解决

2.合并功能

当然,如果SDK提供方不积极更新,且更新后也没有注意去适配Android12,那么这个时候我们只好自力更生了,可以用Android特有的清单文件合并功能来变相地修改SDK里的AndroidManifest的配置

Android清单文件,最终会将多个Module的AndroidManifest合并成一个,如果有冲突的,需要我们配置对应的冲突策略,如replace替换或ignore忽略

我们可以在app模块下的AndroidMainfest.xml,将SDK对应的那个组件声明标签复制出来,然后手动去加上exported属性,并加上replace的合并替换策略,如下代码所示

<receiver tools:replace="android:exported" android:exported="false" android:name="com.tencent.qcloud.tim.demo.thirdpush.TPNSPush.TPNSMessageReceiver">
<intent-filter>
<!-- 接收消息透传 -->
<action android:name="com.tencent.android.xg.vip.action.PUSH_MESSAGE" />
<!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 -->
<action android:name="com.tencent.android.xg.vip.action.FEEDBACK" />
</intent-filter>
</receiver>

PS:不过这个方法具体我还没有尝试过,各位可以自行尝试下哈

参考

关于Android12安装apk出现-108异常INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的解决方法的更多相关文章

  1. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  2. Java并发编程:Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  3. [转载]关于安装Android Studio的一些问题的解决方法

    最近在研究Android编程,在Android Studio安装和使用时遇到了麻烦,从园子里找到了<关于安装Android Studio的一些问题的解决方法>的,很多问题找到了解决办法. ...

  4. windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法

    windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...

  5. 【转】Java ConcurrentModificationException异常原因和解决方法

    原文网址:http://www.cnblogs.com/dolphin0520/p/3933551.html Java ConcurrentModificationException异常原因和解决方法 ...

  6. 安装Wamp后 Apache无法启动的解决方法

    安装Wamp后 Apache无法启动的解决方法,网上的解决方案可以说是五花八门,有些说了一大推,一点作用都起不到. 其实解决方法只需两步: 1.安装路径不能包含有中文,这个我不知道为什么,总之如果安装 ...

  7. adobe reader安装完成之前被中断,错误代码150210解决方法

    adobe reader安装完成之前被中断,错误代码150210解决方法出现这种情况是因为之前安装过adobe reader但是没有卸载删除干净进而导致重新安装时无法安装.为什么卸载不了大多数是因为3 ...

  8. 安装CAD出现Error 1904.Module的解决方法

    在安装AutoCAD2008时,安装过程中出现了一个小错误,虽然说不影响使用,也不影响功能,但还是需要把这个问题解决,今天就和大家分享解决这个问题的方法. 错误描述 会在安装过程中出现错误提示:Err ...

  9. win7下安装Ubuntu后进不去win7的解决方法

    win7下安装Ubuntu后进不去win7的解决方法 刚刚给同学在win7下安装了Ubuntu16.04,结果在安装完后竟然无法在电脑重启后,找到win7的进入选项. 在网上找了找,都不行!就差点重装 ...

  10. 安装Wamp后 Apache无法启动的解决方法

    安装Wamp后 Apache无法启动的解决方法,网上的解决方案可以说是五花八门,有些说了一大推,一点作用都起不到. 其实解决方法只需两步: 1.安装路径不能包含有中文,这个我不知道为什么,总之如果安装 ...

随机推荐

  1. Springboot log4j2总结

    Log4j2 PS: Log4j 已不再维护,而最新的是Log4j2, Log4j2 是全部重写了Log4j,并拥有更加优秀的性能 1. 引入依赖,和去掉logging的依赖 <dependen ...

  2. React版/Vue版都齐了,开源一套【特别】的后台管理系统...

    本项目主要基于Elux+Antd构建,包含React版本和Vue版本,旨在提供给大家一个简单基础.开箱即用的后台管理系统通用模版,主要包含运行环境.脚手架.代码风格.基本Layout.状态管理.路由管 ...

  3. shell脚本自动化部署Zabbix4.2(修改脚本替换版本)

    #!/bin/bash # 检查操作系统版本,该脚本只能运行在 Centos 7.x 系统上 cat /etc/redhat-release |grep -i centos |grep '7.[[:d ...

  4. 一个注解解决ShardingJdbc不支持复杂SQL

    背景介绍 公司最近做分库分表业务,接入了 Sharding JDBC,接入完成后,回归测试时发现好几个 SQL 执行报错,关键这几个表都还不是分片表.报错如下: 这下糟了嘛.熟悉 Sharding J ...

  5. 编写 bzt 脚本的正确姿势

    这是今年1月24日的旧文,发现没在这里发过,就搬运过来了. 声明 本文讨论的使用场景主要为使用已有的 jmx 脚本,并配合 json 对 jmx 脚本进行部分参数的动态修改. 只补充一些官方文档上没有 ...

  6. thinkphp5.1打印SQL语句

    最近在写tp框架搭建的小玩具,有时候我们需要查看SQL语句.所以就诞生了这篇随笔,命令如下: $xxx=db('xxx')->where('x',xx)->select(); $sql=D ...

  7. ProxySQL(3):Admin管理接口

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9281199.html ProxySQL的Admin管理接口 当ProxySQL启动后,将监听两个端口: (1 ...

  8. Elasticsearch:Dynamic mapping

    Elasticsearch最重要的功能之一是它试图摆脱你的方式,让你尽快开始探索你的数据. 要索引文档,您不必首先创建索引,定义映射类型和定义字段 - 您只需索引文档,那么index,type和fie ...

  9. k8s中计算资源策略 Limit Range

    文章转载自:https://www.kuboard.cn/learning/k8s-advanced/policy/lr.html 默认情况下,容器在 Kubernetes 集群上运行时,不受 计算资 ...

  10. CAS核心思想、底层实现

    ★ 1.CAS 是什么 CAS 是比较并交换,是实现并发算法时常用到的一种技术.当内存的值和期望的值相等时,进行更新,否则 什么都不做 或 重来 . CAS 的底层实现:是靠硬件实现的,靠硬件的原子性 ...