Android Gradle文件 一次通关

前言

Android的Gradle是每个项目一定包含的文件,用来定义构建配置的脚本文件,通常包括两个主要文件:build.gradle(项目级别)和build.gradle(模块级别)。

项目级别的 build.gradle 文件

项目级别的 build.gradle 文件位于项目的根目录,通常包括全局配置、插件和依赖管理等内容。

Groovy 复制代码
// 项目级别的 build.gradle 文件
buildscript {
    // 构建脚本的仓库配置
    repositories {
        google()
        mavenCentral()
    }
    // 构建脚本的依赖配置
    dependencies {
        
    }
}

// 所有项目的通用配置
allprojects {
    // 通用的仓库配置
    repositories {
        google()
        mavenCentral()
    }
}

// 任务定义
task clean(type: Delete) {
    delete rootProject.buildDir
}
  • buildscript:

    • repositories :指定构建脚本的仓库,如 google() 和 mavenCentral()。
    • dependencies:定义构建脚本所需的依赖,如 Android Gradle 插件和 Kotlin Gradle 插件。
  • allprojects:

    • repositories:为所有模块指定公共的仓库。
  • task clean:

    • 定义清理任务,用于删除项目的构建目录。

模块级别的 build.gradle 文件

模块级别的 build.gradle 文件位于每个模块(如 app)的目录下,定义具体模块的构建配置和依赖关系。

Groovy 复制代码
// 模块级别的 build.gradle 文件
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdkVersion 30

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            // debug 配置
        }
    }

    flavorDimensions "version"
    productFlavors {
        free {
            dimension "version"
            applicationIdSuffix ".free"
            versionNameSuffix "-free"
        }
        paid {
            dimension "version"
            applicationIdSuffix ".paid"
            versionNameSuffix "-paid"
        }
    }
}

dependencies {

}
  1. plugins:

    • 定义该模块使用的插件,如 com.android.application 和 kotlin-android。
  2. android:

    • compileSdkVersion:指定编译时使用的 SDK 版本。
    • defaultConfig :定义默认的配置,包括 applicationId、minSdkVersion、targetSdkVersion、versionCode 和 versionName。
    • buildTypes :定义构建类型,如 release 和 debug,可以配置是否启用代码压缩(Proguard)。
    • flavorDimensions 和 productFlavors:用于配置多种产品风格(flavors),如免费版和付费版。
  3. dependencies:

    • 列出该模块的依赖库,如 Kotlin 标准库、AndroidX 库、JUnit 等。

全局配置:

  • 在项目级别的 build.gradle 文件中,通过 buildscript 块定义构建脚本所需的仓库和依赖,例如 Android Gradle 插件和 Kotlin Gradle 插件。
  • allprojects 块定义了所有模块通用的仓库,例如 google() 和 mavenCentral(),这些仓库配置会被所有模块共享。
  • 项目级别的 build.gradle 文件中定义了全局任务,例如 clean 任务,用于删除项目的构建目录。这个任务可以在根项目中执行,影响所有模块。

模块配置:

  • 每个模块有自己的 build.gradle 文件,定义具体的构建配置,例如 compileSdkVersion、defaultConfig、buildTypes、flavorDimensions 和 productFlavors。
  • 模块级别的文件中还定义了模块的依赖关系,例如 Kotlin 标准库、AndroidX 库等。
  • 通过在模块级别的 build.gradle 文件中定义 flavorDimensions 和 productFlavors,可以生成不同的构建变体。例如,通过组合 free 和 paid 这两个 productFlavors,可以生成免费版和付费版的应用。

项目划分成模块

一个电商应用,可以划分成如下模块:

App 模块(主模块)Network 模块(网络模块)Database 模块(数据库模块)

User 模块(用户模块)Product 模块(产品模块)Cart 模块(购物车模块)

Payment 模块(支付模块)

此时,利用settings.gradle文件在 Android 项目中用于定义项目的结构和包含的模块,告诉 Gradle 该项目包含哪些模块以及如何组织这些模块。

Groovy 复制代码
// settings.gradle 文件
// 项目根目录名称
rootProject.name = 'MyApplication'

include ':app'
include ':network'
include ':database'
include ':user'
include ':product'
include ':cart'
include ':payment'

同时,在APP模块的dependencies块中包含其他模块即可把其他模块作为依赖添加到项目

Groovy 复制代码
dependencies {
    implementation project(':network')
    implementation project(':database')
    implementation project(':user')
}

同一模块打包成不同的应用apk

通过构建变体可以实现 使用相同的模块打包出不同的应用(APK)。构建变体结合了 构建类型 (Build Types)和 产品风格(Product Flavors),允许创建不同版本的应用,比如免费版和付费版、调试版和发布版等。

Groovy 复制代码
    buildTypes {
        debug {
            // 调试版配置
            applicationIdSuffix ".debug"
            versionNameSuffix "-debug"
            minifyEnabled false
        }
        release {
            // 发布版配置
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
Groovy 复制代码
    productFlavors {
        free {
            dimension "version"
            applicationIdSuffix ".free"
            versionNameSuffix "-free"
        }
        paid {
            dimension "version"
            applicationIdSuffix ".paid"
            versionNameSuffix "-paid"
        }
    }

与此同时,在gradle里面使用buildConfigField字段,可以在代码中使用条件编译来根据构建变体选择性地包含代码片段。

gradle中

Groovy 复制代码
android {
    ...
    buildTypes {
        debug {
            buildConfigField "String", "ENVIRONMENT", "\"development\""
        }
        release {
            buildConfigField "String", "ENVIRONMENT", "\"production\""
        }
    }

    productFlavors {
        free {
            buildConfigField "boolean", "IS_FREE_VERSION", "true"
        }
        paid {
            buildConfigField "boolean", "IS_FREE_VERSION", "false"
        }
    }
}

代码中

Groovy 复制代码
if (BuildConfig.IS_FREE_VERSION) {
    // Free version specific code
} else {
    // Paid version specific code
}

String environment = BuildConfig.ENVIRONMENT;
相关推荐
用户3126874877204 分钟前
JVM 内存结构全链路:堆、栈、方法区、元空间
java
IT枫斗者枫哥4 分钟前
Spring Boot导入返回409,为什么第一行还是入库了?
java·spring boot·后端
xiaoqiMikko4 分钟前
JVM 线上排查实战(五):升 JDK 17 后进程起不来,十几个老 GC 参数挨个实测(完结)
java·jvm
mmsx4 分钟前
Android GIS系列 栅格怎么存、格网怎么归算:两个容易混淆的 GIS 链路
android·性能优化·app
Flynt5 分钟前
Java 27 悄悄改了 3 个默认值,我在 1 核小机器上逐个验证了一遍
java·jvm·性能优化
天天被压力5 分钟前
【Python 量化取数指南 #09】Python 拿港股通数据:港股通成交与港股财报实测
java·人工智能·python
陈柒吖5 分钟前
安卓代码加固(1):加密DEX
android·前端
吃饱了得干活5 分钟前
数据放哪儿:从 HashMap 到一致性哈希
java·后端
mmsx6 分钟前
Android GIS系列 串口、蓝牙、USB、网络:一套统一抽象怎么扛住四种通道
android·app·产品
二流小码农7 分钟前
鸿蒙开发:ArrayList,可不会让UI更新哦
android·ios·harmonyos