1.闪退异常的出现
开发过程中测试的时候一般都是打的debug包来测试,但是昨天打的debug包突然出现一个很棘手的问题,一直没找到原因,本来项目在手机上直接部署是没问题的,但是打个debug包给测试,安装之后一打开就闪退,捕捉一下日志,发现闪退异常java.lang.RuntimeException: Unable to instantiate application。当时以为是配置文件的问题,可以查看之后发现配置文件是正常的,于是只能求助于百度了。
2.蒙圈的解决方案(事实证明不可行)
当时以为是配置文件的问题,可以查看之后发现配置文件是正常的,于是百度了一下,有好多博客的解决方案是修改工程下 build.gradle
的 classpath '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.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1+ |
2.3.0+ | 3.3+ |
3.0.0+ | 4.1+ |
3.1.0+ | 4.4+ |
3.2.0 - 3.2.1 | 4.6+ |
3.3.0 - 3.3.2 | 4.10.1+ |
3.4.0 - 3.4.1 | 5.1.1+ |
3.5.0+ | 5.4.1-5.6.4 |
具体详细内容,可查看官方文档Android Gradle 插件版本说明
- 最后
gradle更新有时候会失败,这是国内网络环境决定的,整个代理再试试吧。