美文网首页
Android Studio的build.gradle文件常用配

Android Studio的build.gradle文件常用配

作者: 珩珩保镖 | 来源:发表于2025-01-21 16:25 被阅读0次

[TOC]

Android Studio的build.gradle文件常用配置项

目录
Android Studio的build.gradle文件常用配置项
  1.build.gradle用途和功能
  2.常用配置
  3.其他

build.gradle简介
build.gradle 文件是 Android 开发中的核心组件之一,它不仅决定了应用程序是如何构建的,还影响着项目的组织方式、依赖管理以及与其他工具和服务的交互。正确配置 build.gradle 文件对于确保项目的顺利开发、测试和发布至关重要。

1.build.gradle用途和功能

以下是 build.gradle 文件的主要用途和功能:

  1. 定义构建脚本
    构建逻辑:指定如何编译源代码、处理资源文件、生成 APK 或 AAB 等。
    任务定义:定义自定义任务或覆盖默认任务,以实现特定的构建步骤。

  2. 管理依赖关系
    库依赖:声明项目所需的第三方库或模块依赖,如支持库、测试库等。
    插件应用:应用必要的 Gradle 插件(例如 com.android.application 或 com.android.library),以便为 Android 项目提供特定的功能。

  3. 配置构建参数
    全局配置:设置适用于整个项目的属性,如编译 SDK 版本 (compileSdkVersion)、目标 SDK (targetSdk)、最低 SDK (minSdk) 等。
    模块配置:每个模块(如应用模块或库模块)都有自己的 build.gradle 文件,用于指定该模块特有的构建配置。

  4. 多环境支持
    构建类型:定义不同的构建类型(如 debug 和 release),并为每种类型指定特定的设置,如签名配置、混淆规则等。
    产品风味 (Product Flavors):允许创建不同版本的应用程序,例如免费版和付费版,每个风味可以有不同的配置、资源或代码。

  5. 集成开发工具
    与 Android Studio 集成:build.gradle 文件被 Android Studio 使用来同步项目结构、下载依赖项、配置模拟器等。
    持续集成/持续部署 (CI/CD):在 CI/CD 管道中执行构建任务,确保代码更改经过自动化测试和质量检查后能够顺利部署。

  6. 其他高级特性
    代码混淆:通过 ProGuard 或 R8 规则进行代码混淆和优化。
    动态替换:使用 manifestPlaceholders 动态修改 AndroidManifest.xml 中的值。
    扩展功能:添加额外的构建逻辑,如增量构建、性能优化等。

  7. 文件层次

通常,一个 Android 项目会有两个级别的 build.gradle 文件:

项目级 build.gradle:位于项目的根目录下,主要用于定义所有模块共用的插件和依赖项。
模块级 build.gradle:位于每个模块的目录下,包含该模块特有的构建配置和依赖项。

2.常用配置

plugins {
    id 'com.android.application'     //application依赖插件
    //id 'com.android.library'       //library 依赖插件 
    id 'org.jetbrains.kotlin.android'//JetBrains 插件 
    id 'kotlin-android'              //Android Kotlin 支持插件
    id 'maven-publish'               //Maven 仓库插件
    id 'kotlin-kapt'                 //Kotlin 注解处理插件  
}
//上面的写法 老版本写法为
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
....
    
android {
    compileSdk 30                 //编译时使用的 Android SDK 版本
    buildToolsVersion '30.0.3'    //Build Tools 包含了诸如 aapt 、dx 或 d8 (Dex 编译器) 等工具版本
    namespace 'com.example.xxx'   //命名空间,影响生成的 R 类、BuildConfig 类

    defaultConfig {
        applicationId "com.example.xxx"   //应用程序的唯一标识符,生产apk后覆盖manifest里面package
        minSdk 24                   //应用程序支持的最低 API 级别
        targetSdk 34                //针对哪个 API 级别进行了测试和优化
        versionCode 1             // 用程序的版本, 应用商店用它来判断是否应该向用户推送更新
        versionName "1.0"         // 版本名称(给用户展示)
        flavorDimensions "DEVICE" // 多渠道的时候可以进行配置,也可以配置多个逗号隔开,对应productFlavors.xxx.dimension

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //使用 AndroidJUnitRunner 进行单元测试
        
        //externalNativeBuild 设置与外部原生构建系统(如 CMake 或 ndk-build)集成的方式,使得 Gradle 能够编译 C/C++ 代码。
        externalNativeBuild {
            cmake {
                cppFlags ''  //没有特殊的编译器标志被添加
                arguments "-DANDROID_STL=c++_shared" //CMake 使用共享的标准模板库(STL),c++_static表示静态链接
            }
            ndk { //配置限制了生成的原生库所支持的 ABI
                //指定针对 arm64-v8a架构的原生库,果你需要可添加ABI过滤器,例如'armeabi-v7a'、'x86' 或 'x86_64'
                abiFilters 'arm64-v8a' 
            }
        }
        
        //manifest占位符,例如BUGLY_APPID在manifest使用${BUGLY_APPID} ; 也可以在buildTypes中分release和debug设置
        manifestPlaceholders = [
                "BUGLY_APPID"      : "xxx",
                "BUGLY_APP_VERSION": "${versionName}",
                "BUGLY_APP_CHANNEL": "algorithms",
        ]
    }
        
    resourcePrefix 'set_' //资源命名前缀,只能限定Xml资源,并不能限定图片资源,例如<string name="set_start">开始</string>
    resConfigs "zh-rCN", "en"   // 只打包指定的语言包进apk
    
    signingConfigs {
        release { 
            keyAlias = 'xxx'     //keystore 中使用的别名
            storeFile file('platform.keystore') //指向包含私钥的 keystore 文件的位置,相对路径
            storePassword 'xxx' //keystore密码
            keyPassword 'xxx'   //私钥的密码
        }

        debug {
            keyAlias = 'xxx' 
            storeFile file('platform.keystore')
            storePassword 'xxx'
            keyPassword 'xxx'
        }
    }
    
    buildTypes {
        release {           
            buildConfigField('boolean', 'LOG_ENABLE', 'false')// 日志打印开关     
            buildConfigField('String', 'HOST_URL', '"https://release.host.com"')// 测试服务器的主机地址
            
            signingConfig signingConfigs.release  //指定此构建类型应使用 release 签名配置进行签名
            minifyEnabled false                   //控制是否启用代码混淆
            //指定 ProGuard 或 R8 使用的规则文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [
                    "BUGLY_APPID"      : "xxx",
                    "BUGLY_APP_VERSION": "${versionName}",
                    "BUGLY_APP_CHANNEL": "algorithms",
            ]
        }

        debug {
            // 日志打印开关 定义了一个:BuildConfig.LOG_ENABLE 字段,可供Java代码调用
            buildConfigField('boolean', 'LOG_ENABLE', 'true')
            // 测试服务器的主机地址 定义了一个:BuildConfig.HOST_URL 字段,可供Java代码调用
            buildConfigField('String', 'HOST_URL', '"https://debug.host.com"')
            
            testCoverageEnabled true             //启用代码覆盖率报告,这对于调试和测试非常有用
            signingConfig signingConfigs.debug
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            
            applicationIdSuffix ".debug"    // 为applicationId添加后缀 如:com.aegis.module_search.debug
            versionNameSuffix '_debug'  // 在版本号后面添加后缀 如:1.0.0_debug
            manifestPlaceholders = [
                    "BUGLY_APPID"      : "xxx",
                    "BUGLY_APP_VERSION": "${versionName}",
                    "BUGLY_APP_CHANNEL": "algorithms",
            ]
        }
    }
    
    packagingOptions {
        //pickFirst 这种编译冲突的时候回报错提示, 按提示添加即可
        pickFirst '**/*.so'                  // 当so出现重复时,打包自动选择第一个
        pickFirsts = ['META-INFO/LICENSE']   // 当 LICENSE 出现重复时,打包自动选择第一个
        merge 'META-INFO/LICENSE'            // 合并打包,会自动忽略 pickFirst 配置
        //exclude 'META-INF/DEPENDENCIES.txt'   // 排除指定文件
    }
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17 //指定了源代码兼容性级别为 Java 17 (新的关键字、API 等,影响代码编写)
        targetCompatibility JavaVersion.VERSION_17 //指定了目标兼容性级别为 Java 17 (编译器将生成何种字节码版本)
    }
    
    buildFeatures {
        dataBinding = true //启用了 Data Binding 功能  (使用 <layout> 标签来包装你的 XML 布局文件)
        viewBinding true   //启用了 View Binding 功能 (减少 findViewById() 调用)
        aidl true          //启用了 AIDL 支持
        buildConfig true   //启用了 BuildConfig 类的生成
    }
    
    lintOptions {
        abortOnError false //Lint 报告了错误,构建过程仍然会继续
    }
    
    sourceSets { // 指定源代码文件路径,一般不修改
        main {
            jniLibs.srcDirs = ['libs']  // so文件目录指向libs, (通常,这些文件位于 src/main/jniLibs 目录下)
            manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
            java {
                exclude 'src/main/module'   // 排除 src/main/module 目录编译打包
            }
        }
    }
    
    productFlavors {    // 多渠道配置,名字自定义,对于app/src下的路径
        wandoujia {...}
        xiaomi {...}
        BAxxx {
            dimension 'DEVICE'
            applicationId "com.example.xxx"
            buildConfigField("String", "DEVICE", '"BA202"')
            versionCode xx
            versionName 'xxx'
            ...
        }
        BAxxx {
            dimension 'DEVICE'
            applicationId "com.example.xxx"
            buildConfigField("String", "DEVICE", '"BA201"')
            ...
        }
    }
    productFlavors.all {    // 遍历多渠道版本
        // 配置示例: <meta-data android:name="UMENG_CHANNEL_NAME" android:value="${UMENG_CHANNEL_NAME}" />
        // 设置清单文件 UMENG_CHANNEL_NAME 占位符值 为对应渠道的 name
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_NAME: name]  
    }
    
    applicationVariants.all { variant ->
        variant.outputs.all { apkData ->
            //给生成的apk文件重新命名,添加上渠道,版本,时间标签到文件名上
            apkData.outputFileName = project.rootProject.name +                      //也可以用 variant.name(渠道名)
                    "_C" + variant.versionCode + "_N" + variant.versionName + "_" +  //版本信息
                    new Date().format("yyMMdd_HHmmss", TimeZone.getTimeZone("Asia/Shanghai")) + "_" + //时间信息
                    variant.buildType.name +                                         //编译类型debug/release
                    ".apk"
        }
    }
}

dependencies {//依赖库
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    
    testImplementation 'junit:junit:4.13.2'                  //依赖测试库
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'//依赖Android测试库
    
    implementation project(":settings-module")              //依赖settings-module模块
    implementation("androidx.activity:activity-ktx:1.2.1") {
        exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx'
    }
    //依赖库, 后续有时间在整理
}

afterEvaluate {
    publishing {//Maven 仓库插件,对应的配置项
        publications {
            maven(MavenPublication) {
                //com.test.settings:sdk:1.0.18
                groupId = "com.test.settings"
                artifactId = "sdk"
                version = "1.0.18"
                artifact tasks.findByName("bundleReleaseAar")
            }
        }

        repositories {
            maven {
                allowInsecureProtocol true
                url = "http://xxx" //仓库地址; 本地仓库url = 'file://D:/libs/localMaven'
                //仓库的用户名及密码
                credentials {
                    username 'xxx_user'
                    password 'xxx'
                }
            }
        }
    }
}

3.其他

相关参考文档和链接

Android Gradle 构建概览 (google官方文档) https://developer.android.google.cn/build/gradle-build-overview?hl=zh-cn

Android Studio常用 gradle 配置项 https://www.jianshu.com/p/c920d5e8e1c9

相关文章

网友评论

      本文标题:Android Studio的build.gradle文件常用配

      本文链接:https://www.haomeiwen.com/subject/jszryjtx.html