原文地址:关于Android安装apk出现解析包异常问题情况总结 | Stars-One的杂货小窝
说之前,可以推荐下各位使用这个开源库AndroidUtilCode,下面提及到的工具类,都是在此库中
以下说的解析包异常,是指进到安装页面就立马出现了错误提示
而不是在可以正常进入安装界面,然后点击了安装按钮之后后,最后弹出个安装失败的提示
这两个情况是有所区别的,需要注意!!
而下面总结的6种情况,第6种情况就是进入到安装界面了,然后点击安装按钮,出现了127的错误码提示
当然,遇到的情况不多,可能总结不全,若是有所遗漏,各位有所见解或补充可以在评论区回复下
这个情况,没有太多展开可以说的,比较少见,及网络下载过程中,apk文件损坏了,导致解析包出现异常
这里统一推荐使用AppUtils.installApp();方法去安装apk,里面进行了Android8.0的版本兼容处理,包含安装第三方应用的权限申请
动态申请前,别忘了需要在清单文件中声明此权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
这个问题是我目前排查apk出现过的问题,由于之前的项目中,是固定下载在Download文件夹中,但是,在Android10之后,存储权限发生变更,导致无法直接将文件下载到Download文件夹,从而导致文件下载失败,进而导致出现解析包异常
解决方法只要适配下Android10之后的路径问题即可
这里推荐下载在app自己的files文件夹中即可解决问题,使用此路径PathUtils.getExternalAppDownloadPath()即可

这里需要说下有两种权限,一个是存储权限,另外一个则是安装第三方应用的权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
存储权限的话,Android6.0需要手动申请,这里不再过多赘述
这里也是比较常见的问题了,原因是我项目使用了360加固,然后,进行了重签名导致
之前一直都是使用命令行进行重签名,没太注意到,其实v2的参数需要声明,加固后的安装包一直没有v2签名
而Android7.0版本都是需要验证v2版本签名,自然是出现了问题
之后进行了尝试,并且稍微封装了一个用来签名的工具,就不用每次都要输入命令了

感兴趣的可看此链接ASCTool: apk签名验证破解工具 Apk Signature Crack Tool
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里面声明的权限重复了。
公司的一个项目,之前因为需求的关系接入了腾讯云IM(由于图快,就把腾讯云IM的demo没改就接入了)
然后客户反馈说在红米Note 10上安装出现错误码-112

查了下资料,这个错误吗是说明用到了相同的权限
由于是接入了腾讯云IM之后才会出现这个问题,所以就准备从腾讯云IM的相关AndroidMainfest.xml文件入手排查
于是尝试改了下权限的声明,测试发现已经ok了

| 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系统 |
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e