当前位置: 首页 > news >正文

Android Gradle文件 一次通关

前言

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

项目级别的 build.gradle 文件

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

// 项目级别的 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)的目录下,定义具体模块的构建配置和依赖关系。

// 模块级别的 build.gradle 文件
plugins {id 'com.android.application'id 'kotlin-android'
}android {compileSdkVersion 30defaultConfig {applicationId "com.example.myapp"minSdkVersion 21targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles 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.applicationkotlin-android
  2. android

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

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

全局配置

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

模块配置

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

项目划分成模块

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

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

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

Payment 模块(支付模块)

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

// settings.gradle 文件
// 项目根目录名称
rootProject.name = 'MyApplication'include ':app'
include ':network'
include ':database'
include ':user'
include ':product'
include ':cart'
include ':payment'

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

dependencies {implementation project(':network')implementation project(':database')implementation project(':user')
}

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

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

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

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

gradle中 

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

代码中 

if (BuildConfig.IS_FREE_VERSION) {// Free version specific code
} else {// Paid version specific code
}String environment = BuildConfig.ENVIRONMENT;

相关文章:

  • 全能集成开发平台Team·IDE
  • MySQL的SQL语句
  • SUPRA:无须额外训练,将Transformer变为高效RNN,推理速度倍增
  • 网络安全等级保护2.0(等保)是什么
  • InTouch历史报警、历史事件按时段查询,导出
  • springboot+vue+mybatis基于java web的公益网站的设计与实现+jsp+PPT+论文+讲解+售后
  • 2000.1-2022.06.17中国经济政策不确定性指数日度数据
  • spring boot3整合邮件服务实现邮件发送功能
  • DB2学习笔记--1
  • grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案
  • 【大模型】fineturn Q-wen
  • 洛谷 P10374 操作
  • 【面试必看】Java并发
  • 经典面试题:MySQL如何调优?
  • JAVA实现图书管理系统(初阶)
  • SegmentFault for Android 3.0 发布
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • android图片蒙层
  • Create React App 使用
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • EventListener原理
  • flask接收请求并推入栈
  • Js基础知识(四) - js运行原理与机制
  • ViewService——一种保证客户端与服务端同步的方法
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 翻译--Thinking in React
  • 力扣(LeetCode)56
  • 全栈开发——Linux
  • 树莓派 - 使用须知
  • 学习JavaScript数据结构与算法 — 树
  • 责任链模式的两种实现
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2)Java 简介
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (rabbitmq的高级特性)消息可靠性
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)Flask之app.route装饰器函数的参数
  • (二)linux使用docker容器运行mysql
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (三)uboot源码分析
  • (生成器)yield与(迭代器)generator
  • (转)memcache、redis缓存
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .cn根服务器被攻击之后
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 8.0 发布到 IIS
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 反射 Reflect
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析