Android kotlin build.gradle.kts配置

一叶飘舟 2024-06-13 12:35:02 阅读 62

1. 添加 maven 仓库

1. 1. settings配置

1. 1.1. settings.gradle

repositories { maven {url 'https://maven.aliyun.com/repository/public/'} mavenCentral()}

1. 1.2. settings.gradle.kts

repositories { maven { setUrl("https://maven.aliyun.com/repository/public/") } mavenCentral()}

1. 2. gradle配置

1. 2.1. build.gradle

implementation 'com.github.bumptech.glide:glide:4.12.0'

1. 2.2. build.gradle.kts

implementation(libs.glide)

版本号在gradle文件夹下 libs.versions.toml文件中添加

在这里插入图片描述

1. 2.2.1. build.gradle.kts

libs.versions.toml文件用来抽离依赖来加载,文件由 4 个主要部分组成:

(1)[versions]部分用于声明可以被依赖项引用的版本

(2)[libraries]部分用于声明坐标的别名

(3)[bundles]部分用于声明依赖包

(4)[plugins]部分用于声明插件

注意:不要使用驼峰命名方式,单词使用 - 分割:

[versions]groovy = "3.0.5"checkstyle = "8.37"[libraries]groovy-core = { module = "org.codehaus.groovy:groovy", version.ref = "groovy" }groovy-json = { module = "org.codehaus.groovy:groovy-json", version.ref = "groovy" }groovy-nio = { module = "org.codehaus.groovy:groovy-nio", version.ref = "groovy" }commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = { strictly = "[3.8, 4.0[", prefer="3.9" } }[bundles]groovy = ["groovy-core", "groovy-json", "groovy-nio"][plugins]versions = { id = "com.github.ben-manes.versions", version = "0.45.0" }

2. Android Studio 如何配置打包后的文件名称

我们在新建一个项目然后直接进行Build apk,可以生成一个app_debug.apk的apk文件,那么文件是怎么产生的呢?

在这里插入图片描述

2.1. build.gradle

//**********打包设置开始********** //自定义生成的apk的地址及名称 def apkName; signingConfigs { release { v1SigningEnabled true v2SigningEnabled true storeFile file('./keystore/insour_szyj.keystore') storePassword 'insour_szyj' keyAlias 'insour_szyj' keyPassword 'insour_szyj' } debug { v1SigningEnabled true v2SigningEnabled true storeFile file('./keystore/insour_szyj.keystore') storePassword 'insour_szyj' keyAlias 'insour_szyj' keyPassword 'insour_szyj' } } buildTypes { debug {// minifyEnabled false//混淆 minifyEnabled true shrinkResources true // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false apkName = "szyj.apk" signingConfig signingConfigs.release } release {// minifyEnabled false//混淆 minifyEnabled true shrinkResources true // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false apkName = "szyj.apk" signingConfig signingConfigs.release } } android.applicationVariants.all { variant -> variant.outputs.all { if (outputFileName.endsWith('.apk')) { //这里使用之前定义apk文件名称 outputFileName = apkName } } }// android.applicationVariants.all {// variant -> variant.outputs.all { output ->// def date = new Date().format("yyMMdd",// TimeZone.getTimeZone("GMT+08"))// if (variant.buildType.name == 'debug'){// output.outputFileName = "项目名称_" +// "${android.defaultConfig.versionName}_${date}_debug.apk"// }else if (variant.buildType.name == 'release'){// output.outputFileName = "项目名称_" +// "${android.defaultConfig.versionName}_${date}_release.apk"// }// }// } //**********打包设置结束**********

2.2. build.gradle.kts

//**********打包设置开始********** signingConfigs {// create("release") {// storeFile = file("./keystore/insour_szyj.keystore")// storePassword = "insour_szyj"// keyAlias = "insour_szyj"// keyPassword = "insour_szyj"// } getByName("debug") { enableV1Signing =true enableV2Signing =true enableV3Signing =true enableV4Signing =true storeFile = file("./keystore/insour_szyj.keystore") storePassword = "insour_szyj" keyAlias = "insour_szyj" keyPassword = "insour_szyj" } register("release") { enableV1Signing =true enableV2Signing =true enableV3Signing =true enableV4Signing =true storeFile = file("./keystore/insour_szyj.keystore") storePassword = "insour_szyj" keyAlias = "insour_szyj" keyPassword = "insour_szyj" } } buildTypes { debug { isMinifyEnabled = false isShrinkResources = false proguardFiles(getDefaultProguardFile( "proguard-android-optimize.txt"), "proguard-rules.pro") } release { isMinifyEnabled = false isShrinkResources = false proguardFiles(getDefaultProguardFile( "proguard-android-optimize.txt"), "proguard-rules.pro") } } // 输出类型 android.applicationVariants.all { // 编译类型 val buildType = this.buildType.name val date = SimpleDateFormat("yyyyMMddHHmmss").format(Date()) outputs.all { // 判断是否是输出 apk 类型 if (this is com.android.build.gradle .internal.api.ApkVariantOutputImpl) { this.outputFileName = "szyj" + "_${android.defaultConfig.versionName}_${date}_${buildType}.apk" } } } //**********打包设置结束**********

3. sourceSets配置

3.1. build.gradle

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

3.2. build.gradle.kts

//jniLibs目录指向libs目录 sourceSets { getByName("main") { jniLibs.srcDirs("libs") } }

4. BuildConfig不生成

新建了一个demo,其依赖的AGP版本是8.0.0。但是在运行过程中报了一个错误就是找不到BuildConfig。

重新build了下代码,然后找编译后的代码,发现确实没有生成BuildConfig。清缓存,重启AS都没有用。之前代码相比,也就是AGP的版本升级了下,那猜测是不是跟AGP8.0.0的版本有关,于是在BuildType中手动添加了个buildConfigField,想以此方式强制生成下BuildConfig。

在这里插入图片描述

运行报错

Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled.

在这里插入图片描述

提示BuildConfig 处于禁用状态…看来是新版本的AGP默认禁用了生成BuildConfig。BuildFeatures源码看到了一个配置buildConfig的注释如下。

在这里插入图片描述

果然如此,默认是禁用状态。在buildFeatures配置中把buildConfig值手动设为true,重新build下就好了

//开启dataBinding buildFeatures { dataBinding = true buildConfig=true }

在这里插入图片描述

5. Kotlin Build.gradle脚本编写(build.gradle.kts)

plugins { id("com.android.application") kotlin("android") kotlin("kapt")}android { compileSdkVersion(29) defaultConfig { applicationId = "com.xxx.xxxxx" minSdkVersion(21) targetSdkVersion(29) versionCode = 27 versionName = "2.2.0" resConfigs("zh") ndk { abiFilters += listOf("armeabi-v7a","arm64-v8a") } } //开启dataBinding buildFeatures { dataBinding = true buildConfig=true } //图片已压缩 指定aapt不做图片压缩 因为可能会反而增加图片大小 aaptOptions {// cruncherEnabled = false } //关闭lint检查 lintOptions { disable("ResourceType")// abortOnError = false } //jniLibs目录指向libs目录 sourceSets { getByName("main") { jniLibs.srcDirs("libs") } } //优化transformClassDexBuilderForDebug的时间 dexOptions { preDexLibraries = true maxProcessCount = 8 } //禁止生成依赖元数据 不上play用不到 dependenciesInfo { includeInApk = false } //jdk1.8支持 compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } //签名配置 signingConfigs { getByName("debug") { storeFile = file("../xxx.jks") storePassword = "xxx" keyAlias = "xxx" keyPassword = "xxx" } } buildTypes { getByName("debug") { //签名 signingConfig = signingConfigs.getByName("debug") //git提交次数 作为测试包版本后缀 buildConfigField("int", "GIT_COMMIT_COUNT", getGitCommitCount()) } register("alpha") { //继承debug配置 initWith(getByName("debug")) //混淆 isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") //ZipAlignEnabled优化 isZipAlignEnabled = true //移除无用的resource文件 isShrinkResources = true } getByName("release") { //继承alpha配置 initWith(getByName("alpha")) //关闭debug debuggable(false) } } //release打包时自定义apk名字、输出路径 android.applicationVariants.all { outputs.all { if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl) { this.outputFileName = "xxxx.apk" } } }}//获取git提交次数fun getGitCommitCount(): String { val os = org.apache.commons.io.output.ByteArrayOutputStream() project.exec { commandLine = "git rev-list --count HEAD".split(" ") standardOutput = os } return String(os.toByteArray()).trim()}//依赖库apply(from = "depends.gradle")


Kotlin中的Gradle_build.gradle.kts-CSDN博客


官方文档Gradle-kotlin:Gradle Kotlin DSL Primer

全局配置文件:settings.gradle.kts

pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() }}dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() }}rootProject.name = "Test"include(":app")include(":mylibrary")

 全局配置文件build.gradle.kts

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { repositories { maven(uri("https://maven.aliyun.com/repository/public/")) google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:7.0.4") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }} allprojects { repositories { maven(uri("https://maven.aliyun.com/repository/public/")) google() mavenCentral() }}//clean Task tasks { val clean by registering(Delete::class) { delete(buildDir) }}//clean Task也可以这样写tasks.register<Delete>("clean") { delete(rootProject.buildDir)}

项目app配置文件build.gradle.kts

plugins { id("com.android.application") id("org.jetbrains.kotlin.android")}android { namespace = "com.baidu.main" compileSdk = 33 defaultConfig { applicationId = "com.baidu.main" minSdk = 24 targetSdk = 33 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } } buildTypes { release { isMinifyEnabled = 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" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.4.3" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } }}dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.activity:activity-compose:1.7.0") implementation(platform("androidx.compose:compose-bom:2023.03.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation(project(mapOf("path" to ":mylibrary"))) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest")}

配置flavor

flavorDimensions.add("platform") productFlavors { create("zim200") { dimension = "platform" } create("ysm8") { dimension = "platform" } }

根据 buildtypes配置签名

buildTypes { debug { isDebuggable = true isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = null productFlavors.getByName("ysm8") { signingConfig = signingConfigs.getByName("ysm8") } productFlavors.getByName("zim200") { signingConfig = signingConfigs.getByName("zim200") } } release { initWith(buildTypes.getByName("debug")) isMinifyEnabled = true isDebuggable = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } }

配置lib文件夹

dependencies { add( "zim200Implementation", fileTree(mapOf("dir" to "libszim", "include" to listOf("*.jar", "*.aar"))) ) add( "ysm8Implementation", fileTree(mapOf("dir" to "libsysm8", "include" to listOf("*.jar", "*.aar"))) ) implementation(project(":TtsTool")) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit-ktx:1.1.3") androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")}

对应的lib文件夹目录结构

不同flavor的应用,加载不同的lib,然后某些代码文件,资源也可以使用对应文件夹下的内容替代

配置密钥

signingConfigs { create("zim200") { storeFile = file("../signature/platform.keystore") storePassword = "xxx" keyAlias = "xxx" keyPassword = "xxx" } create("ysm8") { storeFile = file("../signature/ysm8.jks") storePassword = "xxx" keyAlias = "xxx" keyPassword = "xxx"// v1SigningEnabled = true// v1SigningEnabled = true isV1SigningEnabled = true } }

关于abi拆分和apk命名

//按abi拆分包 splits { abi { isEnable = true reset() include("armeabi-v7a", "arm64-v8a")//支持的ABIs isUniversalApk = true //要不要一个全量ABIs的包 } } val abiCodes = mapOf("armeabi-v7a" to 1, "arm64-v8a" to 2, "x86" to 3, "x86_64" to 4) android.applicationVariants.all { val buildType = this.buildType.name val flavorName = this.flavorName val variant = this outputs.all { val name = this.filters.find { it.filterType == com.android.build.api.variant.FilterConfiguration.FilterType.ABI.name }?.identifier val baseAbiCode = abiCodes[name] if (baseAbiCode != null) { //写入cpu架构信息 variant.buildConfigField("String", "CUP_ABI", "\"${name}\"") } if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl) { //修改apk名称 if (buildType == "release") { this.outputFileName = "apkname_${flavorName}_${name}_${buildType}_v${variant.versionName}.apk" } else if (buildType == "debug") { this.outputFileName = "apkname_${flavorName}_${name}_${buildType}_v${variant.versionName}.apk" } } } }



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。