Gradle基础到进阶——依赖管理和配置编译版本(四)

资源库

Gradle中存储模块的地方叫做资源库

  • 资源库有两种:本地库和远程库
  • 在运行时,如果响应的任务需要,那么gradle就需要定位依赖的声明,依赖可能需要从远程库下载,也可能从本地检索,这个过程叫做依赖解析
  • 解析完之后,就会存储这些解析文件,之后的构建就会重用这些文件,而不会再去下载
  • 模块还能或者一些其他元数据,如资源库坐标系,项目的信息等

添加仓库依赖

image.png

依赖范围
官网:https://developer.android.google.cn/studio/build/dependencies

image.png

image.png

查看模块的依赖项

  • 命令:
gradlew app:dependencies --configuration releaseRuntimeClasspath
  • x.x.x (*) 该依赖已经有了,将不再重复依赖
  • x.x.x -> x.x.x 该依赖的版本被箭头所指的版本代替
  • x.x.x -> x.x.x(*) 该依赖的版本被箭头所指的版本代替,并且该依赖已经有了,不再重复依赖


    image.png

Gradle的依赖优化

  • 如果项目存在同一个依赖库的多个版本,默认选择最高版本
  • Gradle会自动排除重复的依赖
  • Gradle默认支持依赖传递

既然Gradle已经自动做了这些优化,为何还会出现冲突?

  • 当引入一个第三方库,该库中也依赖了Android支持库,且支持库的版本和当前版本不一致。这种情况下,Gradle会自动选择最高的版本,导致不兼容的问题
  • 本质:一个类出现2次以上

排除传递依赖项

  • 随着应用的范围不断扩大,它可能会包含许多依赖项,包括直接依赖项和传递依赖项(应用中导入的库所依赖的库)。如需排除不再需要的传递依赖项,可以使 exclude关键字
    example:


    image.png

排除代码

    implementation ("androidx.room:room-runtime:2.3.0"){
        exclude group:'androidx.room', module:'room-common'
    }

结果


image.png
  • 使用全部排除
configurations{
    configuration{
        all*.exclude module: "kotlin-stdlib"
    }
}

example:


原本的结果.png

之后的结果


image.png
  • 强制版本
configurations.all {
    resolutionStrategy {
        force 'androidx.appcompat:appcompat:1.1.0'
    }
}

关于依赖传递

  • 依赖传递针对的是编译时能被上层模块直接使用
  • 使用implementation添加依赖项,在编译时不进行依赖传递,但是在运行时依然可以使用其内部依赖项 (通过反射的方式调用)
  • 使用api添加依赖项会进行依赖传递,但只针对上一层模块而言
  • 依赖传递始终遵循Gradle依赖管理的优化:即默认情况下选择最高版本的依赖项 (除非对依赖项设置了force为true强制优先使用该版本),同一个依赖项会自动被排除
   implementation('com.squareup.retrofit2:retrofit2:2.3.0'){
       transitive false //关闭依赖传递,即内部的所有依赖将不会添加到编译时和运行时的类路径
       //force true //冲突时强制使用改版本
   }
默认情况.png

transitive设置false之后的结果.png

example:

  • A implemetation B,B implemetation C,则A不能使用C。
  • A implemetation B,B api C,则A可以使用C。
  • A implemetation B,B implemetation C,C api D,则B可以使用D,但A不能使用D。
  • A implemetation B,B api C,C api D,这样A可以使用D
  • 不管ABCD在何处被添加到类路径都一样,在运行时这些模块中的class都是要被加载的

配置编译版本

  • 官网:https://developer.android.google.cn/studio/build

android{}

  • compileSdkVersion:编译时使用版本
  • buildToolsVersion:buildTools版本,编译工具(aapt,abd,dx等)
  • defaultConfig:默认产品风味(针对一次Android应用构建的设置)
  • productFlavors:自定义产品风味
  • buildTypes:构建类型
  • compileOptions:编译选项
  • signingConfigs:签名设置

defaultConfig

  • applicationId:应用唯一的身份识别,也是包名(但此包名非java类的包名)
  • applicationSuffix:applicationId添加后缀
  • minSdkVersion:最小支持的sdk版本
  • targetSdkVersion:针对开发使用的AndroidSDK版本,一般compileSdkVersion保持一致
  • manifestPlaceholders:设置AndroidManifest占位符类型
  • flavorDimensions:产品风味选项维度
  • versionCode/versionName:版本号/版本名

productFlavors

    flavorDimensions "channel"//维度,针对一种类型产品风味的描述
    //自定义产品风味
    productFlavors{
        huawei{
            dimension 'channel'
        }
    }

结果如下

image.png

buildType

  • Android Studio 会自动为您创建“debug”build 类型和“release”build 类型
  • 虽然“debug”build 类型没有出现在构建配置文件中,但 Android Studio 会使用 debuggable true 配置它。这样,您就可以在安全的 Android 设备上调试应用,并使用常规调试密钥库配置 APK 签名
  • initWith:相当于继承
  • minifyEnabled:是否启用混淆
  • proguardFiles:指定混淆代码的文件
  • shrinkResources:清理无效资源,并不是特别准(有些资源可能是通过反射获取到的,可通过设置keep)
  • zipAlignEnabled:是否开启zipAlign

signingConfigs

    signingConfigs {
        release {
           //文件的位置
            storeFile file('/Users/zhouchengdong/peakmain/androidStudio/github/BasicUI/basicuUI.keystore')
            storePassword '123456'//密码
            keyAlias 'peakmain'//别名
            keyPassword '123456'//别名密码
        }
    }
  • debug会有一个默认的签名
    目录在用户/.android目录下


    image.png

resValue

  • 使用resValue可以为当前的构建产品添加资源文件属性
  • resValue 'string','name','value'
    • string表示资源标签的类型。name,资源属性名称,value,对应的属性值
    • 注意,name如果已经存在,不能进行覆盖
  • 不同的产品风味都可以添加自己的resValue,如果要所有产品风味都添加到,可以在defalutConfig{}进行添加
    flavorDimensions "channel"//维度,针对一种类型产品风味的描述
    //自定义产品风味
    productFlavors{
        huawei{
            dimension 'channel'
            manifestPlaceholders = [CHANNEL_VALUE: 'huawei']
            resValue 'string','custom_name',"自定义名字"
        }
    }

image.png

buildConfigField

  • buildConfigField为产品修改BuildConfig中的类型
  • buildConfig是构建时自动生成得java类,里面存放一些静态变量,编译后可以直接使用类中的常量
  • buildConfigField 'string','fieldName','value'
    • String表示字符串类型,可以是其它Java类型,但是要注意,这里做的是文本的替换。所以,如果是其它类型,可以使用全类名的方式。
    • filedName表示属性名,value则是对应的值,由于是文本替换,如果value是字符串,需要自己加入双引号

sourceSets

  • 在android{}中,可以为构建类型添加SourceSet设置。
  • sourceSets{}中主要通过main{}来设置源码文件的位置、资源文件存放的位置等。
  • manifest.srcFile:AndroidManifest文件存放的路径;
  • java.srcDirs:Java源文件存放的路径;
  • resources.srcDirs:resources文件 (java项目中的) 存放的路径;
  • aidl.srcDirs:aidl文件存放的路径;
  • res.srcDirs:res文件夹路径;
  • assets.srcDirs:assets文件夹路径;
  • jniLibs.srcDirs:jniLibs文件夹路径;

adbOptions

  • 在android{}中,可以为构建类型添加adb设置
  • adb install有 l, r, t, s, d, g 这6个选项
    • -l: 锁定该应用程序
    • -r: 替换已经存在的应用程序,强制安装
    • -t: 允许测试包
    • -s: 把应用装到sd卡上
    • -d: 允许进行降级安装,也就是应用的版本比手机上的版本低
    • -g: 为该应用授予所有运行时的权限

实战启用multiDex

为什么需要启用multiDex?

  • DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。这个链表的长度是用short类型来保存的,这就使得方法数id不能超过65535
  • 一个dex文件不能超过65535个方法数量,通过打包多个dex文件来解决问题

怎么启用?

  • 在响应的产品风味中设置multiDexEnabled true
  • 添加依赖
implementation 'androidx.multidex:multidex:2.0.1'
  • 自定义Application继承MultiDexApplication,并在AndroidManifest中指定自定义的Application
  • 如果不方便使用继承MultiDexApplication,可以通过重写attachBaseContext方法,在方法中调用MultiDex.install(this)

你可能感兴趣的:(Gradle基础到进阶——依赖管理和配置编译版本(四))