7

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

 2 years ago
source link: https://www.cnblogs.com/stars-one/p/16150055.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

本文为作者原创,转载请注明出处,谢谢配合
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/16150055.html

本篇大约有1994个字,阅读预计需要2.49分钟


原文地址:关于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()即可

1210268-20220415163521192-109366149.png

4.权限未申请

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

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

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

5.apk签名问题

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

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

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

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

1210268-20220415164440870-1642263535.png

感兴趣的可看此链接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

即下面截图这种情况

1210268-20220415165231542-691268701.png

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

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

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

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

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


提问之前,请先看提问须知 点击右侧图标发起提问
联系我
或者加入QQ群一起学习
Stars-One安卓学习交流群
TornadoFx学习交流群:1071184701
1210268-20200316120825333-1551152974.png
1210268-20190508151523126-971809604.gif

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK