资源库
Gradle中存储模块的地方叫做资源库
- 资源库有两种:本地库和远程库
- 在运行时,如果响应的任务需要,那么gradle就需要定位依赖的声明,依赖可能需要从远程库下载,也可能从本地检索,这个过程叫做依赖解析
- 解析完之后,就会存储这些解析文件,之后的构建就会重用这些文件,而不会再去下载
- 模块还能或者一些其他元数据,如资源库坐标系,项目的信息等
添加仓库依赖
image.png依赖范围
官网:https://developer.android.google.cn/studio/build/dependencies
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都是要被加载的
配置编译版本
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'
}
}
结果如下
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)
网友评论