1
看到AS每天提醒更新,所以没忍住还是从3.0更新到了3.1.3,于是乎项目就跑不起来了。另外由于之前把android studio 的配置文件改了,更新完又变成了默认的配置路径,所以还要把配置文件改一下。以下是踩坑记录

1、Gradle 编译问题的修改

(1)gradle 编译版本对应的build gradle插件版本详情 官网
https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin

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

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}
buildscript定义了全局的相关属性
repositories定义仓库:一个仓库代表着依赖包的来源,例如jcenter仓库dependencies用来定义构建过程:仅仅需要定义默认的Android插件,该插件可以让你执行相关Android的tasks,注意:不应该在该方法体内定义子模块的依赖包。
allprojects用来定义各个模块的默认属性:不仅仅局限于默认的配置,也可以自己创造tasks在allprojects方法体内,这些tasks将会在所有模块中可见。
我升级完android studio 使用的是 Gradle 4.4 以及插件 classpath 'com.android.tools.build:gradle:3.1.3'

(2) compile 2018年底要废弃,使用implementtabion 和api 替换
官网
http://d.android.com/r/tools/update-dependency-configurations.html
https://developer.android.com/studio/build/dependencies

依赖库中所有的compile全部替换为 api,主程序的compile 替换为implementation

2、 compile和 implementation 和api 有什么区别

(1)implementation:
Gradle将依赖项添加到编译类路径,并将依赖项打包到构建输出。但是,当您的模块配置implementation依赖项时,它让Gradle知道您不希望模块在编译时将依赖项泄漏给其他模块。也就是说,依赖性仅在运行时可用于其他模块。
使用这种依赖性配置,而不是 api或compile(不建议使用)可导致 显著编译时间的改进,因为它减少了构建系统需要重新编译的模块的数量。例如,如果implementation依赖项更改其API,则Gradle仅重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应使用此配置。
(2)api
Gradle将依赖项添加到编译类路径并构建输出。当一个模块包含一个api依赖项时,它让Gradle知道该模块想要将该依赖项传递给其他模块,以便它们在运行时和编译时都可用。
此配置的行为就像compile (现在已弃用),但您应谨慎使用它,并且只能将您需要的依赖项可传递地导出到其他上游使用者。这是因为,如果api依赖项更改其外部API,Gradle将重新编译在编译时有权访问该依赖项的所有模块。因此,拥有大量api依赖项可以显着增加构建时间。除非您希望将依赖项的API公开给单独的模块,否则库模块应该使用implementation 依赖项。
小结:
api 等同于 compile ,并且是可以引用传递,比如A Library 依赖了B Library,而B Library 依赖了 C Library,使用 api或compile(已废弃)的话,A Library 就可以调用 C Library 的代码。实现了一层层的依赖,这种方式耦合度高一点,并且编译的话都需要编译一遍。

implementation 就是只管当前 moudle, 比如A Library 依赖了B Library,而B Library 依赖了 C Library,使用implementation的话,A Library 就不可以调用 C Library 的代码。implementation 依赖的库,其他moudle是访问不到的。
建议:在Google IO 中提到了一个建议,依赖首先应该设置为implementation的,如果没有错,那就用implementation,如果有错,那么使用api指令。使用implementation会使编译速度有所增快。

3、解决 升级完 使用java 8 LifecycleObserver 时出现错误,
依赖 implementation "android.arch.lifecycle:common-java8:$lifecycle_version" 时的错误

Default interface methods are only supported starting with Android N (--min-api 24):
 void ndroid.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner)
Message{kind=ERROR, text=Default interface methods are only supported starting with Android N 
(--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate
(android.arch.lifecycle.LifecycleOwner), sources=[Unknown source file], tool name=Optional.of(D8)}

如果依赖这个库,那么只能使用最小24 版本,这就太坑了。解决办法如下
在 build.gradle 的 android{} 闭包下 添加如下代码,重新编译就好了

 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

3、顺便更新几个好用的插件

(1)Android Parcelable code generator

     JavaBean序列化,快速实现Parcelable接口。

(2)CodeGlance
在右边快速浏览代码缩略,快速定位代码,特别好用
(3)findBugs-IDEA
一款查找bug的插件
(4)JsonOnlineViewer
在android studio 内部打开api接口测试的窗口,进行接口调试
(5)ECTranslation
一款翻译插件
(6)AndroidWiFiADB
通过WiFi 无线调试手机的 插件
(7)Alibaba Java Coding Guidelines
阿里巴巴的 java开发约束扫描插件


杨旭
189 声望24 粉丝

专注,摩羯