情况一

介绍

在安卓开发添加依赖的过程中出现问题

> Could not find method compile() for arguments [directory 'libs'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

当以为是compile与implementation版本替代的问题时,更改完却再次报错

> Could not find method implementation() for arguments [directory 'libs'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

解决

这就是添加错了位置导致的,更改添加的build.gradle位置即可(果然是小白才能犯的错误~)

原理

仔细观察项目结构不难发现有两个build.gradle

在这里插入图片描述

我们不难发现在src文件下存在一个build.gradle:

(module构建文件)每个app详细的gradle配置是在这个位置


gradle文件下也有一个build.gradle:

(顶级构建文件,为整个项目添加配置)该文件中指定了该项目需要的Android Plugin for Gradle版本是什么,从哪里下载该版本的Android Plugin for Gradle

注意:在添加具体依赖时是使用APP目录中的那个build.gradle

情况二

CSDN中有很多介绍此相同报错情况的文章,再次,也给和我一样刚刚学习安卓开发的小白朋友们提个醒,博客中的主流解决方法是在添加对位置的前提下再次出错的解决方法,这里也大致总结一下

出现原因

  • Android Studio升级到3.0之后,gradle版本也随之升级到了3.0.0版本,3.0.0之前我们一般都是用compile依赖库文件,升级完之后出现了implementation与api的依赖方式。
  • 当gradle插件升级到3.0.0及以上后,我们会发现在gradle中添加依赖的时候,会推荐你使用implementation或者api,而不再推荐你使用compile。

api

api依赖方式等同于compile方式,你将所有的compile改成api,完全没有错

implementation

使用implementation方式依赖的特点是,将依赖的库文件隐藏在内部,不让外部访问,使用implementation指令的依赖不会传递。
例如:有一个module为myLib,myLib依赖于okhttputils, implementation
deps.common_okhttputils 这时候,在myLib里边的java代码是可以访问Glide的。
另一个module为app,app依赖于myLib:implementation project(’:myLib’)
这时候,因为myLib使用的是implementation 指令来依赖okhttputils,所以app里边不能引用okhttputils。
但是,如果myLib使用的是api来引用okhttputils: api
deps.common_okhttputils,app里边就可以引用okhttputils了,这就是api和implementation的区别。

compile方式

compile方式的效果和api完全一样,在3.x版本的gradle中已被废弃,在2018年底,被google移除,所以不要使用compile了

依赖首先应该设置为implementation,如果没有错误,那就用implementation ,如果有错,那么使用api指令

常见替代

compile(api)
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。

provided(compileOnly)
只在编译时有效,不会参与打包,可以在自己的moudle中使用该方式依赖。比如com.android.support,gson这些使用者常用的库,避免冲突。

apk(runtimeOnly)
只在生成apk的时候参与打包,编译时不会参与,很少用。

testCompile(testImplementation)
testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。

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

releaseCompile(releaseImplementation)
releaseCompile 仅仅针对Release模式的编译和最终的Release apk打包。

e.g.
compile fileTree(dir: 'libs', include: ['*.jar'])-->
implementation fileTree(dir: 'libs', include: ['*.jar'])
或
api fileTree(dir: 'libs', include: ['*.jar'])


参考资料

Gradle依赖配置compile、implementation与api的区别介绍

Android Studio build.gradle中dependencies依赖由compile变为implementation的区别

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐