Android应用闪退异常java.lang.RuntimeException: Unable to instantiate application


1.闪退异常的出现

开发过程中测试的时候一般都是打的debug包来测试,但是昨天打的debug包突然出现一个很棘手的问题,一直没找到原因,本来项目在手机上直接部署是没问题的,但是打个debug包给测试,安装之后一打开就闪退,捕捉一下日志,发现闪退异常java.lang.RuntimeException: Unable to instantiate application。当时以为是配置文件的问题,可以查看之后发现配置文件是正常的,于是只能求助于百度了。

2.蒙圈的解决方案(事实证明不可行)

当时以为是配置文件的问题,可以查看之后发现配置文件是正常的,于是百度了一下,有好多博客的解决方案是修改工程下 build.gradleclasspath 'com.android.tools.build:gradle:x.x.x',然后问题果然解决了,完美。

(后来发现我还是太天真,只能说当时赶巧而已)

dependencies {
        //classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.android.tools.build:gradle:2.2.3'
}

3.自以为更好的解决方案(事实再次证明不可行)

但是之后我想了一个问题,难道软件升级之后变垃圾了吗,还不如老版本吗,我想Google的不会这么傻,新版本肯定会出新功能,更加便于我们开发,难道以后遇到这个问题之后就只能用老的版本号吗,那岂不是无法用到新的功能了,于是我又想到在stackoverflow上面搜索类似问题的解答,还真让我找到了一个更好的解决方案 Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication ?。(PS:不要问我为啥一开始不在stackoverflow找解决方案,我会告诉你每次打开stackoverflow需要花5分钟吗)

File → Settings → Build, Execution, Deployment → Instant Run
关闭 Enable Instant Run

  • 但是为什么关闭Instant Run之后问题就解决了呢?本着求知的态度,我有查找了Instant Run的资料。

Instant Run 也就是即时运行,为了减少我们开发过程中每次更改后的部署时间,就有了即时运行的机制,也就是说我们只要build的过一次之后,之后我们再次部署出来的APP只是在初次部署的基础上直接加入我们的更改,而不是从新构建一个新的,能够节省我们时间。

提供两个比较好的博主写的关于即时运行的帖子
android studio 2.0即时运行功能探秘 这篇介绍的Instant Run比较详细,又想去的可以仔细研读。
Android Studio 2.3版本 Run项目不能自动启动APP(即时运行)问题 这篇文章同时也解答了为什么更改gradle版本号可以解决问题的原因。

事实再次证明,这次又是赶巧了 (我也搞不懂为啥当时那么巧)


2020-01 更新

首先说声抱歉,这篇文章上面提到的解决方案确实不可行,给大家带来不便还请谅解。

上面提到的一些方法,我当时验证时可行是有太多的巧合存在。后来开发过程中又遇到过这种问题,但是一直未解决,后来咨询了好多朋友之后才知道这种问题的本质所在。我查看博客时,发现评论中 @醒太迟 已经给出了解决方案,然后我直接在评论中写了Android官网可查看对应关系,但是发现还有好多人没解决,这里更新一下。

  • 原因所在
    Android Gradle 插件版本与所需的 Gradle 版本不一致导致的。

  • 官方文档解释
    Gradle是开源的构建自动化工具。而Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于 Android Studio 运行并单独更新。

在项目中的build.gradle可看到Android Gradle 插件版本。

    buildscript {
        repositories {
            google()
            ...
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.2'
        }
    }

在项目根目录下找到gradle/wrapper/gradle-wrapper.properties文件中可查看Gradle版本。

...
distributionUrl = https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
...

这两者是存在对应关系,当两者版本不对应时,我们的构建系统就会有问题,这也是我们会遇到打包失败或打的包安装闪退的原因。

插件版本所需的 Gradle 版本
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1+
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0 - 3.2.14.6+
3.3.0 - 3.3.24.10.1+
3.4.0 - 3.4.15.1.1+
3.5.0+5.4.1-5.6.4

具体详细内容,可查看官方文档Android Gradle 插件版本说明

  • 最后
    gradle更新有时候会失败,这是国内网络环境决定的,整个代理再试试吧。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值