原文地址:关于Android安装apk出现解析包异常问题情况总结 | Stars-One的杂货小窝

说之前,可以推荐下各位使用这个开源库AndroidUtilCode,下面提及到的工具类,都是在此库中

以下说的解析包异常,是指进到安装页面就立马出现了错误提示

而不是在可以正常进入安装界面,然后点击了安装按钮之后后,最后弹出个安装失败的提示

这两个情况是有所区别的,需要注意!!

而下面总结的6种情况,第6种情况就是进入到安装界面了,然后点击安装按钮,出现了127的错误码提示

当然,遇到的情况不多,可能总结不全,若是有所遗漏,各位可以在评论区回复下

总结

  1. apk下载过程中损坏
  2. 安装的代码有问题(没有申请对应权限)
  3. 高版本下载apk不成功(apk文件读取不到导致报错)
  4. 存储权限未申请,Android8以上,没有申请允许应用安装未知应用的权限
  5. apk要使用v1+v2签名,v2是适用于Android7.0以上版本的安装
  6. Android12版本安装才出现的问题,原因是清单文件中需要声明exported属性

1.apk下载过程中损坏

这个情况,没有太多展开可以说的,比较少见,及网络下载过程中,apk文件损坏了,导致解析包出现异常

2.安装apk代码有问题

这里统一推荐使用AppUtils.installApp();方法去安装apk,里面进行了Android8.0的版本兼容处理,包含安装第三方应用的权限申请

动态申请前,别忘了需要在清单文件中声明此权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

3.高版本下载apk不成功

这个问题是我目前排查apk出现过的问题,由于之前的项目中,是固定下载在Download文件夹中,但是,在Android10之后,存储权限发生变更,导致无法直接将文件下载到Download文件夹,从而导致文件下载失败,进而导致出现解析包异常

解决方法只要适配下Android10之后的路径问题即可

这里推荐下载在app自己的files文件夹中即可解决问题,使用此路径PathUtils.getExternalAppDownloadPath()即可

4.权限未申请

这里需要说下有两种权限,一个是存储权限,另外一个则是安装第三方应用的权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

存储权限的话,Android6.0需要手动申请,这里不再过多赘述

5.apk签名问题

这里也是比较常见的问题了,原因是我项目使用了360加固,然后,进行了重签名导致

之前一直都是使用命令行进行重签名,没太注意到,其实v2的参数需要声明,加固后的安装包一直没有v2签名

而Android7.0版本都是需要验证v2版本签名,自然是出现了问题

之后进行了尝试,并且稍微封装了一个用来签名的工具,就不用每次都要输入命令了

感兴趣的可看此链接ASCTool: apk签名验证破解工具 Apk Signature Crack Tool

6.Android12版本安装出现问题

targetSdkVersion为31【以Android 12为目标】的应用务必要加入v2签名,务必要对使用的activity,service,broadcast receiver含有intent-filter,显示声明android:exported属性。

AndroidManifest文件中,有intent-filter的属性的四大组件,需要声明exported属性为true

即下面截图这种情况

如果适配安卓12的系统,调用的sdk是31的话。可能需要进行适配。

出现安装失败22的,有可能是因为activity或者receiver,service里面没有加上android:exported="false"这个字段。

注意在launcheractivity里面一定要设置android:exported为true。这个是外部引用的意思。

如果在launcheractivity里面没有设置为true。那么APP图标点击就会出现未安装该应用程序。

如果出现安装失败-127的话。是因为你的manifest里面声明的权限重复了。

关于Android安装apk出现解析包异常问题情况总结的更多相关文章

  1. Unity打包android的apk与数据包.obb分离和apk签名

    那么,通过以上图片.我相信大多数人已经知道怎么创建了,apk签名比較简单,假设之前没有签名文件.那么选择图中的Create New Keystore然后在以下两个password框中输入passwor ...

  2. android安装apk

     * 安装apk */ private void installApk() { // 获取当前sdcard存储路径 File apkfile = new File(Environment.getE ...

  3. Android 获取android安装apk框的安装状态(如点击取消、返回)

    最近鼓捣android,碰到个问题,因为没有root权限,需要调用Intent安装apk,但需要获取用户是否安装了(如,用户点击了返回或取消),查了很多文章,最后可以解决,但有瑕疵,解决方法如下: p ...

  4. android -------- 安装APK报错:Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE解决方法

    记录一个 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK问题 之前遇到这个问题 方案1 将data/data/目录下该应用的包名的目录删 ...

  5. Android安装APK报错:Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE解决方法

    今天调试一个android应用的时候,安装报了Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE错误,代码如下: [2015-12-28 15 ...

  6. Android安装apk时报错:INSTALL_FAILED_NO_MATCHING_ABIS

    问题背景 OS:无关 AS:无关 Genymotion:2.5.2 Virtual Device:Google Nexus 5 - 5.1.0 - API 22 原因分析 CPU架构不符 解决方案 对 ...

  7. android手机上安装apk时出现解析包错误的一个解决办法

    今天下午在学习安卓开发时,学习开发文档中的gridview时,在模拟器上调试程序一切正常,如下图所示: 但当将bin目录下的HelloGridView.apk拷贝到M8安卓系统后进行安装时,出现了“解 ...

  8. Android包管理机制(二)PackageInstaller安装APK

    前言 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInsta ...

  9. android之apk自动更新解析包失败问题

    在apk自动更新(相关问题可以看我的博客http://blog.csdn.net/caicongyang) 从服务器下载完成后,点击notification提示安装时,每次都报解析包失败错误!首先我想 ...

随机推荐

  1. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  2. Golang之框架篇-Windows环境bee工具运行beego

    bee工具简介及好处     bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 你可以很容易的进行 beego 项目的创建.热编译.开发.测试.和部署. 强烈推荐新手或J ...

  3. javascript的比较运算符

    JavaScript一共提供了8个比较运算符: > 大于运算符 < 小于运算符 <= 小于等于运算符 >= 大于等于运算符 == 相等运算符 === 严格相等运算符 != 不相 ...

  4. kafka如何保证不重复消费又不丢失数据_Kafka写入的数据如何保证不丢失?

    我们暂且不考虑写磁盘的具体过程,先大致看看下面的图,这代表了 Kafka 的核心架构原理. Kafka 分布式存储架构 那么现在问题来了,如果每天产生几十 TB 的数据,难道都写一台机器的磁盘上吗?这 ...

  5. vue3.0的更新和defineProperty优化?

    放弃 Object.defineProperty ,使用更快的原生 Proxy (访问对象拦截器, 也成代理器) 提速, 降低内存使用, Tree-shaking更友好 支持IE11等 使用Types ...

  6. List 和 Map 区别?

    表面来看,List是一个只是存放单个元素的集合,List集合所包含的元素可以重复,元素按放入的先后顺序来存放,程序可以通过元素的索引来读取元素,因此List相当于一个动态数组:Map则是一个存放key ...

  7. BTree和B+Tree 简单区别

    本篇作用于各种树之间的区别,非算法详细介绍,只是给我们这种非科班出身的一种大概的印象,现在网上更多是讲各种树的怎么实现的细节问题,本篇不涉及那么高深,如果详细了解可以查阅他人的资料,很多大神已经说的很 ...

  8. volatile 有什么用?能否用一句话说明下 volatile 的应用场景?

    volatile 保证内存可见性和禁止指令重排. volatile 用于多线程环境下的单次操作(单次读或者单次写).

  9. 面试问题之C++语言:说一说C++中四种cast转换

    C++中四种类型转换是:static_cast.dynamic_cast.const_cast.reinterpret_cast 1.const_cast 常量转换,用于将const变量转为非cons ...

  10. volist标签的各种属性

    volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出. 在控制器中首先对模版赋值: $User = ...