侧边栏壁纸
博主头像
Stars-one博主等级

所有的创作都是具有价值的
Android Kotlin Java开发者,喜欢折腾搞机,开发小工具
赞赏发电,给予支持

  • 累计撰写 144 篇文章
  • 累计创建 42 个标签
  • 累计收到 12 条评论

目 录CONTENT

文章目录

关于Android安装apk出现解析包异常问题情况总结

Stars-one
2022-04-15 / 0 评论 / 0 点赞 / 895 阅读 / 2,199 字

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

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

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

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

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

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

情况总结

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

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里面声明的权限重复了。

7.安装出现-112错误码

公司的一个项目,之前因为需求的关系接入了腾讯云IM(由于图快,就把腾讯云IM的demo没改就接入了)

然后客户反馈说在红米Note 10上安装出现错误码-112

查了下资料,这个错误吗是说明用到了相同的权限

由于是接入了腾讯云IM之后才会出现这个问题,所以就准备从腾讯云IM的相关AndroidMainfest.xml文件入手排查

于是尝试改了下权限的声明,测试发现已经ok了

这里,补充下,假如有第三方库没做适配的话,那我们不可能一个个去改第三库,可以使用gradle脚本设置解决此问题,详情可参考此文Android 12 自动适配 exported 深入解析避坑 - 掘金

补充-apk安装错误码及说明

error code 解释
INSTALL_SUCCEEDED = 1 success
INSTALL_REASON_USER = 4 包安装由用户发起
INSTALL_REASON_DEVICE_SETUP = 3 包安装了,作为设备设置的一部分
INSTALL_REASON_DEVICE_RESTORE = 2 表明这个包安装的从另一个设备恢复
INSTALL_REASON_POLICY = 1 代码表明这个包安装由于企业政策
INSTALL_REASON_UNKNOWN = 0 代码表明安装这个包的原因是未知的
INSTALL_FAILED_ALREADY_EXISTS = -1 程序已经存在
INSTALL_FAILED_INVALID_APK = -2 无效的APK
INSTALL_FAILED_INVALID_URI = -3 无效的链接
INSTALL_FAILED_INSUFFICIENT_STORAGE = -4 没有足够的存储空间
INSTALL_FAILED_DUPLICATE_PACKAGE = -5 已存在同名程序
INSTALL_FAILED_NO_SHARED_USER = -6 共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7 更新不兼容(旧包没有删除)
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8 共享用户不兼容 如果新包请求一个共享的用户已安装在设备上,没有匹配的签名
INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9 共享库已丢失
INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10 替换时无法删除,如新的包使用一个共享库是不可用的
INSTALL_FAILED_DEXOPT = -11 空间不足或验证失败
INSTALL_FAILED_OLDER_SDK = -12 系统版本过旧
INSTALL_FAILED_CONFLICTING_PROVIDER = -13 存在同名的内容提供者
INSTALL_FAILED_NEWER_SDK = -14 系统版本过新
INSTALL_FAILED_TEST_ONLY = -15 不被允许测试的测试程序
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16 包含的本机代码不兼容CPU_ABI
INSTALL_FAILED_MISSING_FEATURE = -17 使用了一个无效的特性
INSTALL_FAILED_CONTAINER_ERROR = -18 SD卡访问失败
INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19 无效的安装路径
INSTALL_FAILED_MEDIA_UNAVAILABLE = -20 SD卡不可用
INSTALL_FAILED_VERIFICATION_TIMEOUT = -21 验证超时
INSTALL_FAILED_VERIFICATION_FAILURE = -22 验证失败
INSTALL_FAILED_PACKAGE_CHANGED = -23 预期的应用被改变
INSTALL_FAILED_UID_CHANGED = -24 新的包分配一个与过去不同的UID
INSTALL_FAILED_VERSION_DOWNGRADE = -25 安装旧版本
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26 如果旧包目标SDK支持运行时允许和足够高的新方案目标SDK足够低到不支持运行时权限
INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE = -27 新包试图下调目标沙箱版本的应用程序
NSTALL_PARSE_FAILED_NOT_APK = -100 解析失败,不是APK
INSTALL_PARSE_FAILED_BAD_MANIFEST = -101 解析失败,无法提取
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102 解析失败,无法预期的异常
INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103 解析失败,找不到证书
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104 解析失败,证书不一致
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105 解析失败,证书编码异常
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106 解析失败,manifest中的包名错误或丢失
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107 解析失败,manifest中的共享用户错误
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108 解析失败,manifest中出现结构性错误
INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109 解析失败,manifest中没有actionable tags (instrumentation or application)
INSTALL_FAILED_INTERNAL_ERROR = -110 系统问题导致安装失败
INSTALL_FAILED_USER_RESTRICTED = -111 因为用户限制安装应用程序,系统没有安装
INSTALL_FAILED_DUPLICATE_PERMISSION = -112 权限重复定义使用
INSTALL_FAILED_NO_MATCHING_ABIS = -113 native code不匹配任何支持的abi系统

参考

0

评论区