gradle - build.gradle中 'implementation'的优势

标签 gradle dependencies

假设我有一个项目 ProjectA,其中包含我构建到 .aar 中的 ClassInProjectA。
我还有一个项目 ProjectB,它在内部使用 ClassInProjectA。

public class ClassInProjectB {
    public ClassInProjectB() {
        new ClassInProjectA();
    }
}

ProjectB的build.gradle如下:
android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation(name:'projA', ext:'aar')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

我使用实现是因为 ClassInProjectA 仅在 ProjectB 内部使用。

然后我有一个主应用程序并希望使用 ClassInProjectB。
主app的build.gradle如下:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.project.projectc"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation(name:'projB', ext:'aar')
    implementation(name:'projA', ext:'aar')

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

projB 需要显式导入,否则我无法构造 ClassInProjectB,因为需要 ClassInProjectA。

一切都很好,所有编译和 ClassInProjectB 都可以构建。

如果 ProjectB 的 build.gradle 发生更改,使得 projA 成为 api 要求:
api(name:'projA', ext:'aar')

主应用程序的 build.gradle 没有任何变化。

在这种情况下实现关键字的优势是什么?纯粹是因为它允许我在主应用程序中替换 ProjectB 并避免触发项目 A 的重新编译吗?

我也对 this post 有点困惑, 和 this one ,每一个都暗示如果 ProjectB 通过 api 关键字依赖于 ProjectA,则主项目实际上根本不需要隐式导入 ProjectA。我误解了什么吗?编辑:只有当依赖项是通过同一项目中的子模块而不是导出的 .aar 时,才会出现这种情况。

最佳答案

What is the advantage of the implementation keyword in this context? Is it purely that it allows me to replace ProjectB in the main app and avoid triggering a recompilation of Project A?



implementation 关键字的唯一优点,也是引入它的原因,是它可以避免完整的项目重建。 This blogpost 在解释细节方面做得很好。总而言之,如果 :projectA 对 :projectB 有实现依赖,那么 :projectA 只需要在 :projectB 的接口(interface)发生变化时重新编译。

关于gradle - build.gradle中 'implementation'的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53987124/

相关文章:

java - 如何通过Gradle在Java中使用其他项目的库

spring-boot - gradle: Task :jar SKIPPED 当我使用 gradlew build 获取 jar 时

Scala/Play 2 - 无法运行示例 specs2 测试

java - Maven 停留在旧版本的系统依赖

Symfony2 : How solve two bundles requirements conflicts when using composer?

Gradle 多项目构建——全局资源放哪?

android - Gradle Android 测试

objective-c - 在 Objective-C 中包含头文件的代价

java - args4J 不适用于 gradle

android - 在将admob gradle添加到android应用时,依赖冲突发生错误