gradle中compile、api、provided、implementation

一、gralde中compile,api,provided,implementation的区别:

  1. compile ‘com.android.support:appcompat-v7:23.4.0’
  2. provided ‘com.squareup.dagger:dagger-compiler:1.2.1’(网络下载)
  3. provided fileTree(include: ‘*.jar’, dir: ‘…/…/…/core/Base/Gdroid/libs’)(本地路径)
  4. compile files(‘libs/picasso-2.4.0.jar’)
  5. compile project(’:androidPullToRefresh’)
  • compile是从repository(默认是jCenter())里下载一个依赖包进行编译并打包。

  • provided只提供编译支持,但是不会写入apk。比如我在编译的时候对某一个jar文件有依赖,但是最终打包apk文件时,我不想把这个jar文件放进去,可以用这个命令。

  • compile files是从本地的libs目录下寻找picasso-2.4.0.jar这个文件进行编译并打包。类似的命令有compile fileTree(dir: 'libs', include: '*.jar')意思是将libs目录下所有jar文件进行编译并打包。 compile project是将另一个module(等同eclipse中的library库文件)进行编译并打包。

  • api 指令 :完全等同于 compile指令,没区别,你将所有的compile改成api,完全没有错。

注:gradle tools升级到3.0.0以上,compile关键字 已经明确写明废弃了(api关键字的作用等同于之前的compile),但是google官方文档上说“还会保留一段时间,直到下个比较大的gradle tools版本发布”。所以现在仍然使用compile,不会报错。

implementation说明:

implementation指令:这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。

implementation的“访问隔离”只作用在编译期

implementation的“访问隔离”只作用在编译期。什么意思呢?如果lib C 依赖了lib A 2.0版本,lib B implementation依赖了lib A 1.0版本:

  • 那么编译期,libC 可访问2.0版本的libA
    ,libB可访问1.0版本的libA。但最终打到apk中的是2.0版本(通过依赖树可看到)。

  • 在运行期,lib B 和lib C都可访问lib
    A的2.0版本(因为apk的所有dex都会放到classLoader的dexPathList中)。

使用implementation有什么好处

  • 如果项目中有很多级联的工程依赖,比如上图中lib A B C的依赖是工程依赖。如果使用的依赖方式是compile/api,那么当lib A接口修改后重新编译时,会重新编译libA B C(即使lib C中并没有用到修改的libA的接口)。如果使用implementation依赖,因为“编译期隔离”的原因,不相关的lib就不会进行重新编译。

  • 如果项目中都是aar依赖,编译减少时长这个优点就没有了(因为aar已经是编译好的字节码了)。那么还有什么用呢?还是以上图为例。之前我们都是compile依赖,如果lib A已经依赖了lib B,那么在libC的build.gradle中就不用写lib A的依赖了。但这样会有问题:

    1. 我从lib C的build.gradle的依赖列表中不能完整的知道libC都需要依赖哪些lib。
    2. 假设这么一种情况,我知道项目中的依赖的libA的最高版本是2.0,那么app运行时就是使用的这个2.0版本的libA。这时候我需要打一个libC的aar。lib C如果通过compile传递依赖了libA,因此从lib C的build.gradle中不知道lib C 编译时依赖的是哪个版本的lib A。如果libC 打aar(编译)时,依赖的仍然libA 1.0,可能这个aar就有问题了。
<think>好的,用户想将Gradle从7.5升级到8.9,需要迁移指南和兼容性变化的说明。首先,我应该参考官方文档,特别是Gradle的发布说明和迁移指南。根据引用[1],用户之前升级到8.5时修改了gradle-wrapper.properties文件,所以同样的方法适用于8.9。需要检查Gradle 8.9的系统要求,比如JDK版本,可能要求Java 11或更高,这点需要提醒用户。 然后,考虑到Android项目的兼容性,引用[4]提到旧配置如compile已被废弃,可能在8.9中彻底移除,需要用户检查build.gradle文件,替换为implementation等新配置。另外,Gradle插件版本和Gradle版本的兼容性很重要,比如Android Gradle Plugin(AGP)的对应版本。用户需要确认当前AGP是否支持Gradle 8.9,可能需要升级AGP到8.x版本。 接下来,依赖管理的变化,比如依赖配置的变化或新语法,可能需要调整。用户可能遇到插件不兼容的问题,比如第三方插件是否支持Gradle 8.9,需要更新或寻找替代方案。构建脚本中的API变化,比如任务配置或自定义插件,可能需要调整代码。 测试和验证步骤也很重要,建议用户逐步升级,先到8.5再逐步到8.9,利用--warning-mode=all检查弃用警告。持续集成环境中测试构建,确保没有兼容性问题。此外,参考Spring Boot的迁移经验(引用[2]),可能涉及到Java版本的基线变化,比如Gradle 8.9是否需要Java 17,这点需要确认。 最后,生成相关问题,覆盖用户可能关心的点,比如JDK版本要求、常见错误、回滚方法、性能改进等。确保用户有全面的信息来完成升级,并避免常见陷阱。</think>### Gradle从7.5升级到8.9迁移指南 #### 一、版本兼容性检查 1. **JDK要求** Gradle 8.9要求至少**Java 17**环境,需验证开发环境是否满足[^2]。 2. **Android Gradle插件兼容性** 需将Android Gradle Plugin (AGP)升级到**8.2.0+**版本,否则会导致构建失败。在`build.gradle`中修改: ```groovy dependencies { classpath "com.android.tools.build:gradle:8.2.0" } ``` #### 二、关键配置修改 1. **Gradle Wrapper更新** 修改`gradle-wrapper.properties`文件: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip ``` 2. **废弃API替换** - 移除`compile`、`provided`等废弃配置,替换为`implementation`、`compileOnly`[^4] - 使用`tasks.register()`替代`tasks.create()`(Gradle 8.x强化了任务API的惰性注册) #### 三、构建脚本调整 1. **依赖管理语法** ```groovy // 旧格式 implementation group: 'org.springframework', name: 'spring-core', version: '5.3.0' // 新格式(推荐) implementation 'org.springframework:spring-core:5.3.0' ``` 2. **设置文件规范** `settings.gradle`需显式声明插件仓库: ```groovy pluginManagement { repositories { gradlePluginPortal() google() } } ``` #### 四、验证与调试 1. **增量升级建议** 推荐先升级到**Gradle 8.5**(如引用[1]所示),再逐步过渡到8.9版本。 2. **诊断命令** ```bash ./gradlew build --warning-mode=all # 检查所有弃用警告 ./gradlew dependencies --scan # 生成依赖树分析报告 ``` #### 五、已知问题解决 - **Kotlin DSL兼容性**:需同步升级Kotlin插件到**1.8.20+** - **Jacoco报告异常**:在`build.gradle`添加: ```groovy jacoco { toolVersion = "0.8.9" // 必须匹配Gradle 8.x支持版本 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值