Android-Gradle的一些依赖

本文详细介绍了Gradle中各种依赖类型的功能及应用场景,如implementation、compileOnly等,并解释了它们如何影响编译速度和APK大小。同时,还探讨了本地依赖、aar包依赖和.so文件依赖的具体配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

compile

在Gradle升级到4.+版本的时候,已经会提示compile被废弃掉了,替换它的是api指令

Implementation

“访问隔离”作用于编译器,好处是,编译速度快,比如,我在一个library中使用implementation依赖了gson库,然后我的主项目依赖了library,那么,我的主项目就无法访问gson库中的方法。我换了一个版本的Gson库,但只要library的代码不改动,就不会重新编译主项目的代码。

坏处是,我们可能要写更多的implementation,但是阅读性更好,同时如果我们的library依赖了Gson的1.0版本,同时主工程依赖了Gson的2.0版本,但最终打到apk中的是2.0版本(通过依赖树可看到)。所以对运行并不影响。

compileOnly

等同于provided,只在编译时有效,不会参与打包,不会包含到apk文件中。可以用来解决重复导入库的冲突

annotationProcessor

编译期注解的依赖
用过butterknife或者Dagger的同学可能对这种annotationProcessor引入方式有所印象,这种方式是只在编译的时候执行依赖的库,但是库最终不打包到apk中。结合编译期注解的作用,他是用来生成代码的,本身在运行时是不需要的。

apk(runtimeOnly)

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

testCompile(testImplementation)

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

debugCompile(debugImplementation)

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

releaseCompile(releaseImplementation)

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

本地依赖

jar包依赖

jar包依赖的导入还是比较简单的:

  • implementation files(‘hibernate.jar’,’libs/spring.jar’)//列出每个jar包的相对路径
  • implementation fileTree(dir: ‘libs’, include: [‘*.jar’])//列出包含jar包的文件夹路径

但和远程仓库依赖引入方式不同,如果本地同时存在两个不同的jar包,或者本地已有jar包,再去远程依赖不同版本的jar包,就会报错。

解决方式:将其中的一个采用compileOnly替换implementation。顾名思义,compileOnly只在编译时起作用,不会包含到APK里面,在运行时也就避免找到重复的类了。

aar包依赖
生成aar包,rebuild一下就可以的,生成目录在library工程的build->outputs->aar下。aar和jar不同的地方在于aar文件可以打包进去资源文件
和jar包不同,aar包存放的路径声明和依赖引入是分开的:

repositories {
    flatDir {
        dir "../${project.name}/libs"
    }
}
dependencies {  
    implementation(name: 'aar名字', ext: 'aar')  
} 

如果aar包有很多,也可以一样象jar包统一添加一个文件夹下的所有包:

def dir = new File('app/libs')
dir.traverse(
        nameFilter: ~/.*\.aar/
) { file ->
    def name = file.getName().replace('.aar', '')
    implementation(name: name, ext: 'aar')
}

当一个library类型的module需要引用aar文件时,也要在所在模块的build.gradle文件中加入上面的话,但是当其他 Module引用此library的module时,也需要在他的build.gradle中加入如下配置,否则会提示找不到文件:

repositories {  
    flatDir {  
        dirs 'libs', '../包含aar包的模块名/libs'  
    }  
} 

即如果当前Module需要一个aar包内容,不论aar包是不是在当前Module中,都需要在build.gradle中声明它所在的路径。如果项目中这样的Module比较多,每个都需要声明路径,不便于管理的话,推荐在项目的根build.gradle中统一添加,将所有包含aar包的模块名列出,这样不论是本Module或其他Module都不需要单独配置路径了:

allprojects {
    repositories {
        jcenter()
        google()
        flatDir {
             dirs "../moudle-A/libs,../moudle-B/libs,../moudle-C/libs".split(",")
        }
    }
}

.so文件依赖
这个和jar包差不多,声明下so文件的存放路径就行了:

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

或者直接在main目录下新建jniLibs目录,这是so文件默认的放置目录,不过不常用。值得一提的是aar包里面也可以包含so文件,但依赖这种包含so文件的aar包时不需要做特定的配置,编译时so文件会自动包含到引用AAR压缩包的APK中。

但比较特殊的一点是,so文件需要放到具体的ABI目录下,不能直接放libs目录下所以你见到的结果可能是这样的:
这里写图片描述
所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的so文件。所以为了减小包体积,为了减小 apk 体积,可以只保留 armeabi 一个文件夹。但如果你想引入多个平台的,那么需要保持 so 文件的数量一致,就是说 armeabi 文件下的每个so文件都要在armeabi-v7a下找到对应的so文件,但这样apk包的体积就会增大。

还有一种做法是生成指定ABI版本的APK,然后按需上传到应用商店,让用户自己选择下载适合自己手机的版本,这个可能更多的用在安卓游戏APP上,build.gradle配置如下:

android {
    ... 
    splits {
        abi {
            enable true  //启用ABI拆分机制
            reset()  //重置ABI列表为只包含一个空字符串
            include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //与include一起使用来可以表示要使用哪一个ABI
            universalApk
            true//是否打包一个通用版本(包含所有的ABI)。默认值为 false。
        }
    }

    // ABI的code码
    project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
    android.applicationVariants.all { variant ->
        // 最终标记
        variant.outputs.each { output ->
            output.versionCodeOverride =
                    project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode
        }
    }
 }

参考:https://juejin.im/post/5acd6daaf265da238a30ca73
对于gradle一些语法不是很了解的可以看下《实战Gradle》

<think>根据您的问题,您想知道在Android Studio 2024.3.1版本中,如何正确添加Hilt和ButterKnife的Gradle插件依赖。这两个插件依赖需要添加到项目根目录下的`build.gradle`(有时也叫做`build.gradle.kts`,如果是Kotlin脚本)文件中。 注意:在较新的Android Studio版本中,项目结构可能有两种构建脚本: 1. 项目根目录的`build.gradle`(或`build.gradle.kts`) - 用于配置整个项目的构建脚本和插件依赖。 2. 每个模块(如app模块)的`build.gradle`(或`build.gradle.kts`) - 用于配置特定模块的构建。 您提到的两个插件依赖- `classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41'` 是Hilt的Gradle插件。 - `classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.1'` 是ButterKnife的Gradle插件。 这些插件依赖应该添加到项目根目录的`build.gradle`文件中的`buildscript.dependencies`块内。 以下是具体的步骤和代码: ### 步骤1:打开项目根目录的build.gradle文件 通常,项目根目录的`build.gradle`文件位于项目的顶层目录,与`settings.gradle`文件同级。 ### 步骤2:在buildscript块中添加依赖 在`buildscript`块中,确保有`repositories`(如google()和mavenCentral())和`dependencies`块。然后在`dependencies`块中添加这两个插件的classpath。 ### 示例代码(Groovy DSL - 即使用.gradle文件) ```groovy // 项目根目录的build.gradle文件 buildscript { repositories { google() mavenCentral() // 如果有其他仓库也可以添加 } dependencies { // 其他classpath,例如Android Gradle插件 classpath 'com.android.tools.build:gradle:8.3.2' // 请使用与您项目匹配的版本 // 添加Hilt插件 classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41' // 添加ButterKnife插件 classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.1' // 注意:如果您使用Kotlin,还应该添加Kotlin插件 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22" // 请使用与您项目匹配的Kotlin版本 } } // 所有模块的配置,通常放在allprojects块中 allprojects { repositories { google() mavenCentral() } } ``` ### 注意事项: 1. **版本兼容性**:请确保您使用的插件版本与您的项目其他依赖(如Android Gradle插件版本、Kotlin版本)兼容。特别是Hilt版本2.41可能不是最新,建议查看官方文档获取最新版本。 2. **ButterKnife的使用**:请注意,ButterKnife已经不再维护,官方推荐使用ViewBinding或DataBinding。如果您的项目是新项目,建议不要使用ButterKnife。 3. **应用插件**:在模块的`build.gradle`中,您还需要应用这些插件。例如,在app模块的`build.gradle`中,您需要添加: ```groovy // 对于Hilt plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'dagger.hilt.android.plugin' // 应用Hilt插件 } ``` 对于ButterKnife,如果您仍要使用,在模块的`build.gradle`中应用: ```groovy apply plugin: 'com.jakewharton.butterknife' ``` 或者使用plugins块(注意ButterKnife插件可能不支持新的plugins DSL,所以可能需要使用apply方式)。 4. **同步项目**:添加依赖后,同步项目(Sync Project with Gradle Files)。 ### 如果使用Kotlin DSL(build.gradle.kts) 如果您的项目使用Kotlin DSL(即`build.gradle.kts`文件),则添加方式如下: ```kotlin // 项目根目录的build.gradle.kts buildscript { repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:8.3.2") // Android Gradle插件 classpath("com.google.dagger:hilt-android-gradle-plugin:2.41") // Hilt classpath("com.jakewharton:butterknife-gradle-plugin:10.2.1") // ButterKnife classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22") // Kotlin插件 } } allprojects { repositories { google() mavenCentral() } } ``` ### 最后 请根据您的项目实际情况调整版本号,特别是Android Gradle插件版本和Kotlin版本。您可以在[Android Gradle插件版本说明](https://developer.android.com/studio/releases/gradle-plugin)中查看推荐版本。 §§相关问题§§: 1. 如何在模块的build.gradle中应用Hilt和ButterKnife插件? 2. ButterKnife和ViewBinding有什么区别?为什么ButterKnife不再推荐使用? 3. Hilt依赖注入框架中,如何定义和注入一个依赖? 4. 如何解决Gradle同步时出现的插件版本冲突问题?</think>### 在 Android Studio 2024.3.1 中配置 Hilt 和 ButterKnife 在 Android Studio 2024.3.1 (Giraffe) 中,您需要将插件依赖添加到项目根目录的 `build.gradle` 文件中。以下是具体步骤: #### 1. 打开项目根目录的 `build.gradle` 文件 路径:`YourProject/build.gradle`(不是 app 模块的 build.gradle) #### 2. 添加依赖到 `buildscript.dependencies` 块 ```groovy // 项目根目录的 build.gradle buildscript { repositories { google() mavenCentral() } dependencies { // Android Gradle 插件(必须与你的 AS 版本兼容) classpath 'com.android.tools.build:gradle:8.3.2' // 2024.3.1 推荐版本 // Hilt 插件 classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48' // 建议使用最新版 // ButterKnife 插件 classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.1' // 如果你使用 Kotlin classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22" // 使用与项目兼容的版本 } } allprojects { repositories { google() mavenCentral() } } ``` #### 3. 在 app 模块中应用插件 在 app 模块的 `build.gradle` 中: ```groovy // app/build.gradle plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' // 如果使用 Kotlin id 'kotlin-kapt' // Kotlin 注解处理 id 'dagger.hilt.android.plugin' // Hilt 插件 } apply plugin: 'com.jakewharton.butterknife' // ButterKnife 插件 dependencies { // Hilt 依赖 implementation 'com.google.dagger:hilt-android:2.48' kapt 'com.google.dagger:hilt-android-compiler:2.48' // ButterKnife 依赖 implementation 'com.jakewharton:butterknife:10.2.1' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1' } ``` ### 版本兼容性说明 | 组件 | 推荐版本 | 说明 | |------|----------|------| | Android Gradle Plugin | 8.3.2 | 与 AS 2024.3.1 完全兼容 | | Hilt | 2.48 | 最新稳定版 | | ButterKnife | 10.2.1 | 最终维护版本 | | Kotlin | 1.9.22 | AS 2024.3.1 内置版本 | ### 重要注意事项 1. **同步 Gradle**:修改后点击 "Sync Now" 2. **JDK 要求**:确保使用 JDK 17(File > Project Structure > SDK Location) 3. **ButterKnife 替代**:考虑迁移到 View Binding 或 Jetpack Compose ```gradle // 替代 ButterKnife 的 View Binding android { buildFeatures { viewBinding true } } ``` 4. **Hilt 应用类**:确保 Application 类使用 `@HiltAndroidApp` ```java @HiltAndroidApp public class MyApplication extends Application { // ... } ``` ### 常见问题解决 如果遇到 "Plugin [id: 'dagger.hilt.android.plugin'] was not found": 1. 检查根 build.gradle 中的仓库配置(必须有 google() 和 mavenCentral()) 2. 确保网络可以访问 Maven 仓库 3. 尝试清理缓存:File > Invalidate Caches / Restart
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值