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-kotlinGradle 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"
                }
            }
        }
    }

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐