Android Gradle实用知识点

新旧指令对比

Android Studio 2.XAndroid Studio 3.X
apkruntimeOnly
providedcompileOnly
compileapi
 implementation
debugCompiledebugImplementation
releaseCompilereleaseImplementation
testCompiletestImplementation
androidTestCompileandroidTestImplementation

apk & runtimeOnly

只在生成apk的时候参与打包,编译时不会参与

provided & compileOnly

provided只提供编译支持,但是不会写入apk。使用provide可以避免支持包版本冲突。

compile & api、implementation

compile 是和 api 对应的,两者效果相同。
api 与 implementation 的区别在于对外的可见性。

例如:

A api B,B api C
那么 A 模块不仅可以引用 B 模块,还可以引用 C 模块的接口和类。
A implementation B,B implementation C
那么 A 模块只能引用 B 模块的接口和类,不能引用 C 模块,也就是说 C 对于 A 是不可见的。这样做的好处是提高了编译和链接的速度。
 

testCompile(testImplementation)

testCompile 只在单元测试代码时有效。

debugCompile(debugImplementation)

debugCompile 只在debug模式的编译和最终的debug apk打包时有效

releaseCompile(releaseImplementation)

Release compile 仅仅针对Release 模式的编译和最终的Release apk打包。

 

一、implementation & api依赖配置的对比

  • 被引入的依赖模块,简称 依赖模块
  • 引入了被依赖模块的当前模块,简称 当前模块
  • 依赖了当前模块的上层模块,简称 其他上层模块

 

1、implementation

     此依赖配置,使Gradle意识到,当前模块引入的依赖模块,在编译期间对其他上层模块不可见,仅在运行时对其他上层模块可见。这将会加快多模块依赖的项目整体编译速度,因为通过implementation引入的依赖模块,如果依赖模块内部有进行过Api的改动,由于其对其他上层模块不可见,因此只需重新编译依赖模块自身以及使用到此改动的Api的当前模块即可。

 

2、api

     等同于原有的compile,此依赖配置,使Gradle意识到,其引入的依赖模块,无论在编译期还是在运行时,都对其他上层模块可见,即通过api配置引入的依赖模块,在依赖关系上具有传递性。这将会使得其他上层模块可以直接使用依赖模块的Api,但这同时意味着一旦依赖模块发生Api的改动,将导致所有已经使用了依赖模块改动了的Api的上层模块都需要重新执行编译。因此,一般会加大整个项目的编译时间,如非必要,一般建议优先使用implementation依赖配置。

新增类,新增或修改非private的对外方法名等,在api引入的方式下,都会使得上层模块重新编译,因为上层模块可能会直接用到此类方法,但在上层模块的实际编译过程中,并不会对模块内的类都进行重新编译,而是只会编译确实已经使用了依赖模块的API的类。

项目中引入的marven库中的构件,其内部的依赖配置对当前项目的Gradle是失效的。

 

例如:

  • :app api 依赖 :LibB
  • :LiB api依赖 :LibD
  • :LibD api依赖了 marven库中的构件 :LibX
  • :LibX项目内部implementation依赖了marven库中的另一构件 :LibY
     

此时,LibD依然可以直接使用LibY中的对外Api,也就是说,此时即使:LibX项目通过implementation引入的:LibY,但:LibY对:LibD 依然具有依赖传递,具有可见性。

总结:

implementationapi依赖配置主要是控制依赖模块对上层模块的依赖关系传递及可见性,在实际进行项目构建时,编译期和运行时,又可能具有不同的依赖传递关系。理解不同的依赖配置,对具体的编译期和运行时的依赖关系具有重要意义,也是解决依赖冲突等问题的关键。

 

二、dependencies {} 语块的简单写法

1、新建config.gradle

ext {
    supportLibrary = "28.0.0"

    // 第三方库
    dependecies = [
            appcompat : "com.android.support:appcompat-v7:${supportLibrary}",
            constraint: "com.android.support.constraint:constraint-layout:1.1.3"
    ]
}

2、在全局项目(rootPrejec)中的build.gradle文件中头部引入

apply from:"config.gradle"

3、在子项目中的dependencies语块中引用自定义的数组变量

def support = rootProject.ext.dependecies
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])  
    support.each { k, v -> implementation v}
}

 

参考文献:

https://www.cnblogs.com/lwbqqyumidi/p/10256690.html

https://blog.youkuaiyun.com/chy555chy/article/details/85134165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值