之前写过一篇Android gradle统一依赖版本:kotlin+buildSrc的集成使用,
两者的区别可以参照再见吧 buildSrc, 拥抱 Composing builds 提升 Android 编译速度
1.新建一个module(名字任意),删掉不必要的东西,保留以下内容即可:
1.DependencyManager.kt
package com.test.versionplugin
/**
* <pre>
* desc : 如果数量少的话,放在一个类里面就可以,如果数量多的话,可以拆分为多个类
* </pre>
*/
object BuildVersions {
const val compileSdkVersion = 31
const val buildToolsVersion = "30.0.3"
const val minSdkVersion = 21
const val targetSdkVersion = 31
const val versionCode = 1
const val versionName = "1.0"
}
object Versions {
const val kotlin = "1.5.0"
const val retrofit = "2.9.0"
const val appcompat = "1.1.0"
const val material = "1.3.0"
const val coreKtx = "1.2.0"
const val constraintLayout = "2.0.4"
const val recyclerview = "1.0.0"
const val glide = "4.9.0"
const val junit = "4.13.2"
const val junitExt = "1.1.2"
const val espressoCore = "3.3.0"
}
object AndroidX {
const val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"
const val coreKtx = "androidx.core:core-ktx:${Versions.coreKtx}"
const val constraintLayout =
"androidx.constraintlayout:constraintlayout:${Versions.constraintLayout}"
const val recyclerview = "androidx.recyclerview:recyclerview:${Versions.recyclerview}"
}
object Kt {
const val stdlibJdk = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
const val stdlibJdk8 = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}"
}
object Retrofit {
const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
const val gson = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}"
}
object Depend {
const val junit = "junit:junit:${Versions.junit}"
const val androidTestJunit = "androidx.test.ext:junit:${Versions.junitExt}"
const val espressoCore = "androidx.test.espresso:espresso-core:${Versions.espressoCore}"
const val material = "com.google.android.material:material:${Versions.material}"
// glide
const val glide_runtime = "com.github.bumptech.glide:glide:${Versions.glide}"
const val glide_compiler = "com.github.bumptech.glide:compiler:${Versions.glide}"
}
2.VersionPlugin
package com.test.versionplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* <pre>
* desc : 如果出现红色警告可以忽略,不会影响项目的编译和运行
* </pre>
*/
class VersionPlugin : Plugin<Project> {
override fun apply(project: Project) {
}
companion object {
}
}
3.build.gradle
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
// 因为使用的 Kotlin 需要需要添加 Kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
}
}
apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
repositories {
// 需要添加 jcenter 否则会提示找不到 gradlePlugin
jcenter()
mavenCentral()
}
dependencies {
implementation gradleApi()
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32"
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
gradlePlugin {
plugins {
version {
// 在 app 模块需要通过 id 引用这个插件
id = 'com.test.versionplugin'
// 实现这个插件的类的路径
implementationClass = 'com.test.versionplugin.VersionPlugin'
}
}
}
上面的id 以及implementationClass 要写实际的路径包名,不然找不到。
2.项目根目录下的settings.gradle
需要使用 includeBuild
rootProject.name = "Composing builds demo"
include ':app'
includeBuild ("versionPlugin")
3.根目录下的build.gradle
注意plugins 的位置,需要放到buildscript 后面,前面不能有 apply plugin 这种,不然就报错。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.5.0"
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
/**
* 如果在多项目构建中,可能想把插件应用到子项目中,apply false 来告诉 Gradle 不要应用插件
*
* plugins {} 默认的行为是解析和应用插件
*/
plugins {
// 这个 id 就是在 versionPlugin 文件夹下 build.gradle 文件内定义的id
id "com.test.versionplugin" apply false
}
allprojects {
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
subprojects { subproject ->
// 默认应用所有子项目中
apply plugin: 'com.test.versionplugin'
// 如果想应用到某个子项目中,可以通过 subproject.name 来判断应用在哪个子项目中
// subproject.name 是你子项目的名字,示例如下
// 官方文档地址:https://guides.gradle.org/creating-multi-project-builds/#add_documentation
if (subproject.name == "app") {
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
4.app下的build.gradle使用:
plugins {
// id 'com.android.application'
// id 'kotlin-android'
id 'kotlin-kapt'
}
import com.test.versionplugin.*
android {
compileSdkVersion BuildVersions.compileSdkVersion
buildToolsVersion BuildVersions.buildToolsVersion
defaultConfig {
applicationId "com.ssq.composingbuildsdemo"
minSdkVersion BuildVersions.minSdkVersion
targetSdkVersion BuildVersions.targetSdkVersion
versionCode BuildVersions.versionCode
versionName BuildVersions.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation Kt.stdlibJdk
implementation AndroidX.coreKtx
implementation AndroidX.appcompat
implementation Depend.material
implementation AndroidX.constraintLayout
testImplementation Depend.junit
androidTestImplementation Depend.androidTestJunit
androidTestImplementation Depend.espressoCore
//glide
implementation Depend.glide_runtime
kapt Depend.glide_compiler
//retrofit
implementation Retrofit.retrofit
implementation Retrofit.gson
implementation AndroidX.recyclerview
}