文章已过时:请查看google 官方配置
https://developer.android.com/studio/build/migrate-to-catalogs?hl=zh-cn
先贴一下gradle 配置
外层 build.gradle
buildscript {
ext {
compileSdkVersion = 33
minSdkVersion = 21
targetSdkVersion = 33
applicationId = 'com.aaa.bbb'
versionName = '1.4.8'
versionCode = 148
debugStoreFile = '../platform.jks'
debugKeyAlias = 'android'
storeFile = '../platform.jks'
storePassword = 'android'
keyAlias = 'android'
keyPassword = 'android'
coreKtxVersion = '1.9.0'
appcompatVErsion = '1.5.1'
materialVersion = '1.6.1'
constraintlayoutVersion = '2.1.4'
lifecycleLivedataKtx = '2.5.1'
lifecycleViewmodelKtx = '2.5.1'
coroutinesVersion = "1.6.4"
junitVersion = '1.1.3'
espressoCoreVersion = '3.4.0'
estExtJunit = '1.1.3'
recyclerViewVersion = '1.3.0-rc01'
retrofitVersion = '2.9.0'
roomVersion = '2.4.3'
viewPagerVersion = '1.0.0'
workVersion = '2.7.1'
gsonVersion = '2.9.0'
glideVersion = '4.12.0'
fragmentVersion = '1.3.0'
hiltVersion = '2.3.5'
navigationVersion = '2.5.2'
okhttpLoggingVersion = '4.9.3'
hiltVersion = '2.44'
gradleVersion = '7.3.1'
kotlinVersion = '1.5.30'
startupVersion = '1.1.0'
aspectjVersion = '1.8.9'
toastyVersion= '1.5.0'
aspectjrtVersion='1.9.5'
BaseRecyclerViewAdapterHelperVersion = '3.0.4'
switchViewVersion='1.1.7'
utilcodexVersion='1.30.1'
hawkVersion = '2.0.1'
easypermissionsVersion = '3.0.0'
legacySupportVersion='1.0.0'
dialogx_version = "0.0.45.beta17"
EasyPhotosVersion = '3.1.4'
PickerViewVersion = '4.1.9'
updateVersion= '1.1.0'
}
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }//jcenter
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }//gradle-plugin
maven { url 'https://maven.aliyun.com/repository/central' }//central
maven { url 'https://maven.aliyun.com/repository/google' }//google
maven { url "https://jitpack.io" }
maven {
allowInsecureProtocol = true
url 'http://xx.xx.xx.xx:8081/repository/maven-public/'
}
google()
}
dependencies {
//classpath 'com.github.2017398956:AspectPlugin:2.4'
classpath "com.android.tools.build:gradle:$gradleVersion"
//classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
内层 gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'androidx.navigation.safeargs.kotlin'
id 'kotlin-kapt'
//id 'AspectPlugin'
id 'dagger.hilt.android.plugin'
}
static def buildApkTime() {
return new Date().format("yyyyMMddHHmmss")
}
android {
signingConfigs {
debug {
storeFile file(rootProject.debugStoreFile)
storePassword rootProject.storePassword
keyAlias rootProject.debugKeyAlias
keyPassword rootProject.keyPassword
}
release {
storeFile file(rootProject.storeFile)
storePassword rootProject.storePassword
keyAlias rootProject.keyAlias
keyPassword rootProject.keyPassword
}
}
compileSdk rootProject.compileSdkVersion
buildFeatures {
dataBinding true
}
flavorDimensions "versionCode"
defaultConfig {
applicationId rootProject.applicationId
minSdk rootProject.minSdkVersion
targetSdk rootProject.targetSdkVersion
versionCode rootProject.versionCode
versionName rootProject.versionName
vectorDrawables.useSupportLibrary true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
signingConfig signingConfigs.debug
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
ndk {
abiFilters 'armeabi', 'armeabi-v7a'
}
}
buildTypes {
debug {
minifyEnabled false
signingConfig signingConfigs.release
jniDebuggable true
debuggable true
renderscriptDebuggable true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
renderscriptDebuggable false
debuggable false
jniDebuggable false
signingConfig signingConfigs.release
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi"
freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.FlowPreview"
}
lint {
abortOnError false
checkReleaseBuilds false
}
namespace 'com.aaa.bbb'
android.applicationVariants.all { variant ->
def fileName
variant.outputs.all {
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name == 'release') {
fileName = "aaa_android_v${defaultConfig.versionName}_${variant.buildType.name}.apk"
} else if (variant.buildType.name == 'debug') {
fileName = "aaa_android_v${defaultConfig.versionName}.apk"
}
outputFileName = fileName
println(outputFileName)
}
}
variant.assemble.doLast {
File out = new File("E://Apk打包文件夹/aaa")
variant.outputs.forEach { file ->
copy {
from file.outputFile
into out
}
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar", '*.aar'])
implementation "androidx.core:core-ktx:$rootProject.coreKtxVersion"
implementation "androidx.appcompat:appcompat:$rootProject.appcompatVErsion"
implementation "com.google.android.material:material:$rootProject.materialVersion"
implementation "androidx.constraintlayout:constraintlayout:$rootProject.constraintlayoutVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$rootProject.lifecycleLivedataKtx"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.lifecycleViewmodelKtx"
implementation "com.google.code.gson:gson:$rootProject.gsonVersion"
implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttpLoggingVersion"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.coroutinesVersion"
implementation "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion"
implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"
implementation "androidx.work:work-runtime-ktx:$rootProject.workVersion"
implementation "com.github.bumptech.glide:glide:$rootProject.glideVersion"
annotationProcessor "com.github.bumptech.glide:compiler:$rootProject.glideVersion"
implementation "com.google.dagger:hilt-android:$rootProject.hiltVersion"
implementation "androidx.navigation:navigation-fragment-ktx:$rootProject.navigationVersion"
implementation "androidx.navigation:navigation-ui-ktx:$rootProject.navigationVersion"
implementation "androidx.recyclerview:recyclerview:$rootProject.recyclerViewVersion"
kapt "com.google.dagger:hilt-android-compiler:$rootProject.hiltVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
implementation "androidx.room:room-runtime:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
implementation "androidx.startup:startup-runtime:$rootProject.startupVersion"
androidTestImplementation "androidx.test.ext:junit:$rootProject.estExtJunit"
androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.espressoCoreVersion"
implementation "org.aspectj:aspectjrt:$rootProject.aspectjrtVersion"
implementation "com.github.CymChad:BaseRecyclerViewAdapterHelper:$rootProject.BaseRecyclerViewAdapterHelperVersion"
implementation "com.ld:switchView:$rootProject.switchViewVersion"
implementation "com.blankj:utilcodex:$rootProject.utilcodexVersion"
implementation "com.orhanobut:hawk:$rootProject.hawkVersion"
implementation "com.github.GrenderG:Toasty:$rootProject.toastyVersion"
implementation "pub.devrel:easypermissions:$rootProject.easypermissionsVersion"
implementation "androidx.legacy:legacy-support-v4:$rootProject.legacySupportVersion"
implementation "com.github.kongzue.DialogX:DialogX:$rootProject.dialogx_version"
implementation "com.github.HuanTanSheng:EasyPhotos:$rootProject.EasyPhotosVersion"
implementation "com.contrarywind:Android-PickerView:$rootProject.PickerViewVersion"
implementation 'com.caverock:androidsvg-aar:1.3'
}
看了最新的更新,决定切换到kotlin和version catalogs
首先,不要按照官网的说法,先把文件名改成build.gradle.kts,这样做你很难搞清楚到底哪里出问题了。
第一步,先升级android studio
目前最新版是 Android Studio Dolphin | 2021.3.1 Patch 1,升级过程中注意 compileSdk和targetSdk,为了避免麻烦,直接升级到33就行了,能省去后面很多麻烦。
第二步,升级kotlin 版本
主要过程是:File->setting->Plugins,如图
升级到最新即可,目前最新版本是1.7.20,对应gradle 版本是 7.1+,升级过程中有个小技巧,即gradle 的位置。
如果每次都从
https://services.gradle.org/distributions/gradle-7.5.1-bin.zip
下载,挺浪费时间的,建议从
https://gradle.org/releases/
下载需要的版本,放在硬盘上一个文件夹内。(注意不要解压),然后在此文件
中修改 distributionUrl
注意由原来的 https://services.gradle.org/distributions/gradle-7.5.1-bin.zip 修改为 file:///E:/gradle/gradle-7.4-all.zip 即可
此步骤要注意的是 Plugins 中的kotlin版本一定要和 setting 中的kotlin Compiler 版本对应,Project 的build.gradle 中的 gradle版本和上图中的gradle 版本对应。一旦出错,先检车这两个方面
第三步,升级各依赖包版本版本和 java 版本
这一步没什么好说的,鼠标放在module 中的dependencies 各依赖包上,有新版本会弹出对应提示,按照提示升级即可。另外,如果检查有没有新版本,可以前往maven中检查
http://mvnrepository.com/ 对应版本
另外 java版本的问题,不建议安装 java 11 JDK,但是可以这样用
然后,选择11即可
至此,升级kotlin和 catalogs 前置工作准备完毕。另外说一下版本的问题。有同学认为程序能运行就可以,不必升级最新稳定版本,其实笔者认为这是不正确的,很多时候程序运行过程中的bug就是由于版本低引起的。
现在可以重现编译项目,然后能够正常运行的话可以准备升级 catalogs 了
第四步,升级gradle 为kotlin 语法
在gradle 仍然使用 groovy的时候 管理gradle 依赖可以使用 buildSrc, ext,以及外链 apply 不嫌麻烦的话其实 外链apply最好用,ext也不错。
当然我们现在要升级 kotlin了,当然要使用 datalogs。我建议大家第一次用的话,慢慢来,先修改其中一句代码,然后同步一下gradle,看看有没有问题,有问题就查查gradle api,看看具体怎么解决,这样虽然慢,但是总体来说比较简单。
首先我们先修改 settting.gradle,这是gradle的入口,要注意几点
-
maven { url 'https://maven.aliyun.com/repository/public'}
要改成maven { setUrl("https://maven.aliyun.com/repository/public") }
- 有使用自建仓库的,如果没有https, 原来是
maven { allowInsecureProtocol = true url 'http://xx.xxx.xx.xx:8081/repository/maven-public/' }
要改成maven { isAllowInsecureProtocol = true url = uri("http://xx.xx.xx.xx:8081/repository/maven-public/") }
然后把 setting.gradle 直接重命名为 setting.gradle.kts ,重新编译一下,就可以了
第五步,创建catalogs文件
在gradle 文件夹中创建 file,名称为 libs.versions.toml
先写 [versions] 这是版本号的标签 以 名称 = “版本号“ 格式,其中名称可以随便写,符合自己习惯即可。
然后写 [libraries] ,这里的格式为 名称= { module = " group ID : artifact ID", version.ref = "版本号" } ,这里的名称最好是artifact ID ,然后把其中的点改成下划线,如com.google.dagger:hilt-android-gradle-plugin:2.44
改成符合格式的就是hilt-android-gradle-plugin= { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hiltVersion" }
,其中 hiltVersion就是在[versions] 中定义
注意:名称不能以大写字母开头
第五步,修改Module 的build.gradle
到这里就简单多了,主要配置dependencies ,配置成 implementation(libs.gson) 这种格式,其中libs 是datalogs 文件名称,后面的就是在 [libraries] 中定义的响应名称,这里不需要写版本。
关于如何把groovy 改成kotlin 请参考大神文章https://zhuanlan.zhihu.com/p/381942140,这是我目前看到最明白的。
第五步,修改Project 的build.gradle
最后一步,直接改完 重新编辑就可以。
最新更新:看到大神写的一篇,https://www.jianshu.com/p/7ccdca8199b8 牛