前言
前天在使用Studio时,误删了.gradle文件,然后就出现不能Run,Preview不能使用的情况,因为以前遇到过,这次再犯,却一时记不起如何修复,虽然这种问题一般都是偶发的,但是时间隔得久了就会忘记.所以决定把平时开发时Studio遇到的问题记录在这篇文章中.
Gradle
Gradle是一个基于JVM构建项目依赖库的工具,Java是其支持的其中一种,在Eclipse时代,我们导入第三方库一般以jar包或者libarary项目的方式引入。但是有了Gradle之后,很多第三方库只需要在project和app的gradle做几句代码配置,即可自动导入到我们开发的项目中。如果做过IOS开发的人,会发现Gradle很像Mac平台上的Cocoapods,后者导入第三方库,也是在Podfile文件中添加指定格式的几句话,即可自动下载导入.
这么方便的工具,Studio上少不了它,不过日常我们也会有诸多问题和它有关:
1.打开别人的项目时,遇到Gradle构建失败
基本上检查以下三个文件可以解决大部分情况:
(1)SDK路径错误,找到local.properties文件,sdk.dir改成本地路径

(2)项目构建的SDK版本在本地没有,在app的gradle文件中修改一下构建版本即可:

(3)项目一直在显示Refresh/Build the Gradle.或者报gradle-x.x.zip文件找不到的错误,这个是遇到最多的,首先我们去手动去网上下载这个构建或者找不到的zip文件,然后在系统盘找到类似这种名字的文件,将这个zip文件直接放进去,不需要解压缩:

然后在gradle-wrapper.properties文件中,将distributionUrl改成刚才那个zip文件的绝对路径

最后,在setting中点选,清除缓存重启Studio即可.

2.Preview无法显示 / 误删Gradle文件导致run和Preview无法使用
对于这两个问题(如点了下图的按钮),解决方法很简单,在app的build.gradle文件中,修改compileSdkVersion为其他版本,比如版本25报的错,改成24,然后点击Sync Now,就会发现run和Preview都正常了,此时再切回出错的版本 Sync Now 一次就可以了。

3.在当前项目新建一个Project,会出现一直显示正在Build xxx Gradle的进度弹窗:

其实新的Project已经创建成功了,只是打开的时候Gradle找不到,进入该Project所在的文件夹,同样的找到 图4 所示的gradle-wrapper.properties文件,将distributionUrl路径改成本地Gradle.zip文件可访问的路径,再打开该项目即可.

4.项目写到一定体量后,编辑时突然冒出下面的错误信息,就是65535方法数限制

第一,在app的gradle文件里面的defaultConfigs属性里面加入以下这句

第二,同时在dependencies 加入依赖

最后,如果用到了自定义的Application,则需要继承MultiDexApplication.

5.Android Studio连网时,会自动检查更新,打开Sudio时,右下角总是有个提示更新的小弹窗,一般人都会点close,如果手滑点到了update,那升级完基本都是各种问题.
(1)升级完后,第一次打开,选择了使用以往版本的setting文件,如下图:

第一个是选择是否使用以往版本的Studio配置文件,如果选择第一个,基本都是各种Plugin插件报下面的错误:
Plugin error:
Plugin "XXX" was not loaded:requeired plugin "XXXX" is disabble.......
此时去到C盘,删掉 .Android Studio 2.3 文件夹,然后重新启动,或者重新安装,选择第二个,不过这样只能重新在setting里面设置了.
(2)开发时,偶然出现某个studio的插件报错,去到 setting-Plugins,报红的插件都卸载后重新在线安装.

6. Android 5.0 的SDK移除了org.apache.http包里面的类,如果项目用到了这个包里面的类,而开发版本选择了5.0及以上,会报错.

这个问题通过jar导入的方式直接导入的话,还是会报上面的异常的,正确的方式是在app的build.gradle中添加以下 useLibrary 'org.apache.hhtp.legacy' 即可,不需要手动导入相关jar包.

Android Studio 2.33/3.0系列版本
升级到Studio3.0之后,会遇到不少坑,虽然3.0正式版已经发布,但正式版出来后也立马暴露了不少问题.
通过Android Studio版本的后缀可以知道自己用的是哪些版本,一般情况下,一个版本号按开发和发布的先后,分为以下5种。
Canary-金丝雀 PreView-预览版 Beta-测试版 RC-稳定版 无后缀-正式版
1. Studio3.0不再支持apt,gradle中如果有第三方库用到了apt,会报错
解决方式
首先需要注释掉project.gradle中的

然后再注释掉app.gradle中的

最后,需要将用到apt的第三方库替换成非apt版本.
2.Studio3.0,app.gradle中导入的 com.android.support:xxxx 包报错,显示存在多个版本

解决方式 ,在dependencies中使用到的第三方库和modle中,逐个检查其构建的用到的对应的com.android.support:xxxx包版本是否和app.gradle中使用的一致,更新第三方库版本和modle中的版本,使其一致.
3.遇到方法数超过限制,设置multiDexEnabled后,有时仍然会报Unable to merge dex 的错误.

Studio3.0有个很坑爹的地方,就是开启instant run 设置后,当代码和gradle文件改动后,直接点Run,会发现改动经常是没有生效的,甚至Rebuild后仍有低几率会不生效,这时就需要关闭Studio重启了,上面的问题只是其中一个例子。
4.资源文件resource报错,
5.如果你的项目用到了威富通支付的SDK,而Studio版本刚好是Studio 3.03 Canary3 那么在Run编译时,你肯定会遇见下面这个异常

解决方式,目前所知,只能换其它版本的Studio,极其坑爹.
6.Studio3.0 通过Generate Signed APK,会分为V1和V2,如果只勾选V2,apk在安卓7.0以下的系统安装有可能闪退。
两者的区别是只勾选前者,相当于之前版本的Studio的打包,两个都勾选,apk会在安卓7.0及以上的机子做一个优化,具体差别可以参照该的链接.

7.Studio3.0打包后的apk安装闪退,如果没有超过65535方法数限制,那么打包时,可以检查以下几个地方
第一:关闭instant run。

第二:JDK的版本和路径设置需要和系统环境变量的路径一致,Studio3.0安装后会默认勾选Use
embedded JDK选项,有可能会导致debug调试和打包后闪退。

第三:如果设置了NDK,检查以下两处地方,local.properties的NDK路径是否和project构建配置的NDK路径一致。


,如果没有,则去掉以上两处地方的NDK相关配置。
8.项目打包后,安装正常,运行时会报NoClassDefFoundErro的异常,然后闪退,这种情况,如果是下面这样的BUG,一般很难发现.
现在okhttp3使用的比较广泛,一般导入okhttp3还需要导入一个okio,说明这个问题,我们新建一个项目,导入若干的第三方库.
(1).先导入以下包,okio版本为1.13.0,然后打包项目

可以观察apk的大小为642kb.(后面测定,删除掉okhttp3和okio后,打包大小差不多为648kb).

(2).然后删除okio包后,再重新打包,会发现apk神奇的变成了1866kb

(3).重新导入okio包,这次导入的版本为1.9.0,然后打包

apk的大小为1892kb.

很明显,导入版本1.13.0的okio包,会导致打包时,okhttp3包和okio包(这个后面有去测,就不贴出来了)没有打进apk包中,从而导致安装时出现NoClassDefFoundErro.
因此,如果发现项目打包后,突然出现了这种闪退的BUG,用了问题7的方法无效,又找不出问题所在的,可以新建一个空项目,逐批添加用到的第三方库,打包运行,很容易就会发现出问题的库,比如问题8这种,一般人也不会想到是项目十几个第三方库中,某个库的版本问题导致异常打包,而debug时又可以正常使用,这种隐蔽的BUG很容易卡住很久.
结语
暂时想起这些,以后有新的问题都会集中到这里,关于SVN/GIT的问题就汇总到另一篇文章里了,免得文章太长不好查阅.虽然不是什么大事情,但可以方便自己在遇到重复的问题时找到解决方法,毕竟没人会喜欢在开发时被这些工具的琐事打断.
网友评论