从第 3 方库导入 class。 Android Studio 3.1,Gradle 3.1

Import class from 3rd Party Library. Android Studio 3.1, Gradle 3.1

将 Android Studio 和 gradle 更新为 3.1 后,我将所有 compile 语句更改为 implementation。但是当我构建时,android studio 无法解析在第 3 方库中找到的导入。

场景:主项目导入子模块,子模块也导入 jar 文件。

当我尝试将 class 从 jar 文件导入主项目时,android studio 无法解析它。

如何导入单个文件而不必在主项目中添加 jar 文件作为依赖项?

您应该改用 api,它是新的 compile 或在您的主项目中直接 具有依赖项。只需将 implementation 更改为 api 即可解决问题,但您考虑尽可能使用 implementation 以缩短构建时间。

你可以看到 apiimplemenation here 之间的区别。

@nongthonbam-tonthoi的回答是正确的,但他没有解释原因。

短版

实现 - 对其他模块(依赖于此模块)隐藏此依赖项。如果 B 依赖于 A,它不能使用 A 中使用 implementation.

声明的任何 dep

api - 使依赖此 module.i 的其他模块可用。e 如果您添加说 GSON 作为模块 A 中的 dep 使用 api 而不是 implementation,所有其他依赖 A 的模块都可以使用 GSON无需再次声明。

长版

implementation 是一种仅声明给定模块的依赖关系的方法。这意味着,依赖项只能在该特定模块中使用。 compile 另一方面 "leaks" 对其他模块的依赖,因此您可以导入和使用 dep 在其他模块中引入的 类。如果您想要这种行为,新的方法是使用 api

此更改特别针对 multi-module 项目,因为它可以帮助 gradle 避免 re-compiling 在构建期间未更改的模块。

但是,如果您是从一个旧项目迁移过来的,您很可能正在(ab)使用编译来使用在其他模块中声明的依赖项,而没有再次显式声明它们。

您可以继续使用 compile,但请记住,它已被弃用,很快就会被删除。

请参阅 here 以获得更深入的解释。

编辑 build.gradle (Module:app) 并将 SDK 版本更改为 27.1.1 例如:

defaultConfig {
        applicationId "com.projectname"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

implementation 'com.android.support:appcompat-v7:27.1.1'

并重建项目并重新启动 android studio