jjzjj

android12-targetsdk31报错Failed to install-write all apks

mawei7510 2023-04-11 原文

一、错误描述

本人用的红米手机,android12的版本,原来的targetsdk为30,在android studio上直接run到手机上调试正常,但是将targetsdk调整为31后,一直install不上去,最后300秒超时,报错如下:

Installation did not succeed.
The application could not be installed.

List of apks:
[0] 'L:\xxx\app\build\outputs\apk\debug\app-debug.apk'
Installation failed due to: 'Failed to install-write all apks'

二、爬坑经历

在网上找了一圈,有一些解决方案,但是都不适用,如下

1. 打开usb调试、打开usb安装。(这些正常的开发都会打开的,而且30的版本都能安装成功,能没有打开吗)

2.手机内存空间满了,权限问题。(这些当然也不存在)

3.android版本问题。(30的能成功,这个自然也不存在)

三、问题分析

1.小米手机有个很坑的问题,开发的时候如果有版本系统适配错误,不会明确指出哪个第三方库、程序里面配置文件哪个地方错误,只会统一报一个错误(“Failed to install-write all apks”),所以,如果你用的是小米手机,就不要一直纠结这个错误找问题。

2.从"targesdk迁移31后报错"这个方向找问题,最终找到了一些实质可以解决的方案。

3.targetsdk从低版本迁移到31及以上后,程序改动比较大,并且第三方库也需要跟随改动。所以是件很麻烦的事情。

四、问题解决

以下是我的综合解决方案,不清楚到底是哪一条生效,哪一条没有生效,最终结果是综合生效,供大家借鉴,切勿生搬硬套,每个app每个环境都不一样。

1.开发者选项中usb调试、usb安装重开,miui优化开关关闭,重启手机

2.Android 12 自动适配 exported 深入解析避坑众所周知,从Android12开始,使用了TargetSDK31之后,四大组件如果使用了intent-filter,但是没显性质配置exportedApp将会无法安装,甚至编译不通过。比如启动的Activity就需要设置exported为true,至于其他组件是否设置为true则看它是否需要被其它应用调用。然而这个事情的状态是这样的:如果出现问题的AndroidManifest文件是你本地的,那手动修改即可;但如果出现问题的是第三方远程依赖,那就需要升级第三方依赖库为最新版本,要么用网上的一个脚本文件,运行的时候自动将其在清单文件中加入exported。

参考链接1:Android 12 自动适配 exported 深入解析避坑 - 思创斯聊编程

参考链接2:Android 12 快速适配要点 - 掘金

com.android.tools.build:gradle:4.0.0 以及其下版本用如下脚本

/**
 * 修改 Android 12 因为 exported 的构建问题
 */
android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        output.processResources.doFirst { pm ->
            String manifestPath = output.processResources.manifestFile
            def manifestFile = new File(manifestPath)
            def xml = new XmlParser(false, true).parse(manifestFile)
            def exportedTag = "android:exported"
            ///指定 space
            def androidSpace = new groovy.xml.Namespace('http://schemas.android.com/apk/res/android', 'android')

            def nodes = xml.application[0].'*'.findAll {
                //挑选要修改的节点,没有指定的 exported 的才需要增加
                (it.name() == 'activity' || it.name() == 'receiver' || it.name() == 'service') && it.attribute(androidSpace.exported) == null

            }
            ///添加 exported,默认 false
            nodes.each {
                def isMain = false
                it.each {
                    if (it.name() == "intent-filter") {
                        it.each {
                            if (it.name() == "action") {
                                if (it.attributes().get(androidSpace.name) == "android.intent.action.MAIN") {
                                    isMain = true
                                    println("......................MAIN FOUND......................")
                                }
                            }
                        }
                    }
                }
                it.attributes().put(exportedTag, "${isMain}")
            }

            PrintWriter pw = new PrintWriter(manifestFile)
            pw.write(groovy.xml.XmlUtil.serialize(xml))
            pw.close()
        }
    }

}

如果你的项目不复杂,或者用到的第三方的库不多,先查看manifest.xml文件底部的MergedManifest 这个tab里面的报错信息,如果有报错,那么可以手动的去修改manifest文件,将exported属性添加上去。

参考链接:Android12 依旧提示使用 intent-filter 需设置 android:exported 属性_Earliest-Mlr的博客-CSDN博客

3.修改targetsdk和buildtool版本号匹配,我的是(targetSdkVersion=31,compileSdkVersion=31,buildToolsVersion=31.0.0)

修改了版本号后,出现了报错,如下:

意思是31的构建工具已经损坏,重新卸载后安装还是报错。所以不是下载过程的问题。

修改两个文件名称。

(1)进入到自己SDK的目录;

(2)进入到build-tools\31.0.0,修改 d8.bat 文件,将其名字改为dx;

(3)进入到build-tools\31.0.0\lib目录,修改d8.jar文件,将其名字改为dx.jar

参考链接:关于安卓项目targetSdkVersion升级到31后报错问题_水很清的博客-CSDN博客

4.在此过程中,修改了build.gradle后,clean project、重启android studio、重启手机都需要,按需吧。

五、最后说一句

项目比较复杂,用到的第三方库又多,又用的是比较坑的小米手机作为调试机,导致搞了3天才搞好。心态有点崩,android studio说真心话,各种版本、组件、第三方库、gradle版本、androidx、merge manifest等等适配真心很稀烂,有一说一,欢迎拍砖。

先写到这,一是对问题的总结,一是对猿友有个借鉴参考。

有关android12-targetsdk31报错Failed to install-write all apks的更多相关文章

  1. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  4. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  5. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  6. ruby - 使用 OpenSSL ruby​​ 从一个 .p12 文件中提取多个 key - 2

    我想知道如何从Apple.p12文件中提取key。根据我有限的理解,.p12文件是X504证书和私钥的组合。我看到我遇到的每个.p12文件都有一个X504证书和至少一个key,在某些情况下有两个key。这是因为每个.p12都有一个Apple开发人员key,有些还有一个额外的key(可能是Appleroot授权key)。我只考虑那些具有两个key的.p12文件是有效的。我的目标是区分具有一个key的.p12文件和具有两个key的.p12文件。到目前为止,我已经使用OpenSSL来检查X504文件和任何.p12的key。例如,我有这段代码可以检查目录中的所有.p12文件:Dir.glob(

  7. ruby-on-rails - 报错 - 在 Snow Leopard 上安装 RVM - 2

    我正在尝试在我的SnowLeopard10.6.8上安装RVM,方法是:\curl-Lhttps://get.rvm.io|bash-sstable--ruby我得到这个错误:InstallingRubyfromsourceto:/Users/Villa/.rvm/rubies/ruby-2.0.0-p0,thismaytakeawhiledependingonyourcpu(s)...ruby-2.0.0-p0-#downloadingruby-2.0.0-p0,thismaytakeawhiledependingonyourconnection...ruby-2.0.0-p0-#e

  8. ruby - 为什么 openssl 在 windows 上产生错误但在 centos 上不产生错误:PKCS12_parse: mac verify failure (OpenSSL::PKCS12::PKCS12Error) - 2

    require'openssl'ifARGV.length==2pkcs12=OpenSSL::PKCS12.new(File.read(ARGV[0]),ARGV[1])ppkcs12.certificateelseputs"Usage:load_cert.rb"end运行它会在Windows上产生错误,但在Linux上不会。错误:OpenSSL::PKCS12::PKCS12Error:PKCS12_parse:macverifyfailurefrom(irb):21:ininitializefrom(irb):21:innewfrom(irb):21fromC:/Ruby192/

  9. Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart - 2

    亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour  systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g

  10. ruby-on-rails - macOS 10.12 Sierra 上的 bundle 错误 - 2

    Ignoringbinding_of_caller-0.7.2becauseitsextensionsarenotbuilt.Try:gempristinebinding_of_caller--version0.7.2Ignoringbyebug-9.0.6becauseitsextensionsarenotbuilt.Try:gempristinebyebug--version9.0.6Ignoringcapybara-webkit-1.11.1becauseitsextensionsarenotbuilt.Try:gempristinecapybara-webkit--versio

随机推荐