宿迁专业网站三合一建设,邯郸专业做网站,男人最好用的浏览器,网站制作的流程是什么文章目录 Gradle基础总结#xff1a;gradle-wrapper项目根目录下的 build.gradlesetting.gradle模块中的 build.gradlelocal.properties 和 gradle.properties 组件化#xff1a;项目下新建一个Gradle文件定义一个ext扩展区域config.gradle全局基础配置#xff08;使用在项目… 文章目录 Gradle基础总结gradle-wrapper项目根目录下的 build.gradlesetting.gradle模块中的 build.gradlelocal.properties 和 gradle.properties 组件化项目下新建一个Gradle文件定义一个ext扩展区域config.gradle全局基础配置使用在项目build中确保属性的引用config_build.gradle通用配置使用在各个build里其实可用也可不用 在build.gradle中导入config.gradle Base基础层建立一个libBase模块修改libbase的builde.gradle 组件层业务建立一个login组件模块修改login的builde.gradle1.引入config_build文件2.不引入解释 app层修改App的build.gradle Gradle基础
Gradle 是一种基于 Groovy 的构建工具被用于 Android 项目的构建、编译和打包。它提供了强大的构建自动化功能使得在 Android 应用开发中管理依赖、设置环境和自定义构建流程变得更加方便和灵活。
在 Android 开发中Gradle 被广泛用于构建项目、处理依赖、运行测试、生成 APK 等任务。下面是一些关于 Android 中的 Gradle 的重要说明
构建脚本 Android 项目中的 build.gradle 文件是 Gradle 的核心配置文件。它定义了项目的构建设置、依赖关系和任务。通常一个 Android 项目包含根目录下的 build.gradle 文件和每个模块如 app 模块下的 build.gradle 文件。插件 Android Gradle 插件是为了与 Android 构建系统集成而设计的 Gradle 插件。在项目的 build.gradle 文件中通过引入 com.android.application 或 com.android.library 插件可以使 Gradle 成为适用于 Android 应用或库的构建工具。任务 Gradle 使用任务Task来定义构建过程中需要执行的操作。常见的任务包括编译代码、打包应用、运行测试、生成 APK 等。Gradle 支持自定义任务可以根据需要扩展构建过程。依赖管理 Gradle 管理 Android 项目的依赖关系。通过 dependencies 块可以指定项目所需的外部库和模块。Gradle 可以自动从远程 Maven 仓库或本地文件系统下载依赖项并将其包含到项目的构建路径中。变体 Android Gradle 插件引入了变体Variant的概念用于管理不同构建类型如 Debug 和 Release和不同产品风味如不同的应用标识符或资源配置的构建变体。通过变体可以针对不同的构建配置生成不同的 APK。构建类型和产品风味 Android Gradle 插件允许定义多个构建类型和产品风味以满足不同的需求。构建类型可以是 Debug、Release 或自定义的构建类型而产品风味可以设置不同的应用标识符、资源和其他配置。
Gradle在Android项目中有两个比较重要的文件那就是工程下的build.gradle和模块下的build.gradle如下图所示 当我们将项目结构切换为Android模式时打开Gradle Scripts就可以看到排在最前面的是工程的build.gradle然后是模块的build.gradle只要看文件括号后面的内容就知道这个build.gradle作用的范围是什么虽然两者都是build.gradle但因为作用范围不同实际的功能就不同。 ① 工程build.gradle
在 Android 工程中项目的根目录下有一个名为 build.gradle 的文件通常称为 “工程级 build.gradle”用于配置整个项目的构建设置。下面是一个简单的 Android 工程级 build.gradle 文件的示例
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {id com.android.application version 8.1.3 apply falseid org.jetbrains.kotlin.android version 1.9.0 apply false
}上述示例中的 plugins 块配置了插件并指定插件的版本这是新版本的工程build.gradle它将一些功能放到settings.gradle中下面我们会说到。
② 项目build.gradle
在 Android 项目中每个模块如 app 模块、library 模块等都有一个对应的模块级 build.gradle 文件用于配置该模块的构建设置和依赖项。下面是一个简单的 Android 模块级 build.gradle 文件的示例
plugins {id com.android.applicationid org.jetbrains.kotlin.android
}android {namespace com.example.hellokotlin compileSdk 33 // 指定编译使用的 Android SDK 版本defaultConfig {applicationId com.example.hellokotlin // 应用的唯一标识符minSdk 24 // 最低支持的 Android 版本targetSdk 33 // 目标 Android 版本versionCode 1 // 版本号versionName 1.0 // 版本名称testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release { minifyEnabled false // 是否开启代码混淆proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro // 混淆规则文件}}compileOptions { //编译选项sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions { //Kotlin编译基于Jvm的版本jvmTarget 1.8}// 其他配置项如构建变体、签名配置等
}dependencies { // 依赖项implementation androidx.core:core-ktx:1.9.0implementation androidx.appcompat:appcompat:1.6.1implementation com.google.android.material:material:1.8.0implementation androidx.constraintlayout:constraintlayout:2.1.4testImplementation junit:junit:4.13.2androidTestImplementation androidx.test.ext:junit:1.1.5androidTestImplementation androidx.test.espresso:espresso-core:3.5.1
}plugins 声明了所应用的插件例如 ‘com.android.application’ 表示应用 Android 应用插件org.jetbrains.kotlin.android表示Kotlin语言插件如果你使用Java语言开发则不需要这个插件。
android 块用于配置 Android 构建设置其中包括编译和构建的相关配置。例如compileSdkVersion 指定了编译使用的 Android SDK 版本defaultConfig 定义了默认的配置项如应用标识符、最低支持版本、目标版本等。
buildTypes 块用于定义不同构建类型如 release、debug的配置。通过这个块可以控制是否开启代码混淆、添加混淆规则等。
dependencies 声明了该模块的依赖项。使用 implementation 关键字可以引入所需的库和模块。例如androidx.appcompat:appcompat:1.6.1’ 引入了 AndroidX AppCompat 库。 如图中这些则保存在 可以在文件的其他部分定义自定义任务和其他配置块。这些可以根据项目需求进行个性化配置例如添加构建任务、自定义变体等。
需要注意的是每个模块都有自己的 build.gradle 文件但具体的配置选项和依赖项可能因模块类型和项目需求而有所不同。建议参考具体模块的 build.gradle 文件和官方文档来了解和调整配置。
③ settings.gradle
settings.gradle 是 Android 项目的根目录下的一个重要文件它用于配置项目的模块和构建设置。
这里需要说明一下实际上关于settings.gradle项目在旧版本的Android Studio上没有这么多内容只是对工程下面的模块进行管理我们看看之前的settings.gradle中有什么内容如下所示
rootProject.name FakeQQMusic
include :app之前的内容比较简单当你需要改动项目名称或者增加项目中的模块时这个文件才会发生变化。大概是在大黄蜂版本开始发生了变化将原本属于工程级build.gradle中的一些功能挪到了settings.gradle中新版本代码如下所示
下面是一个常见的 Android settings.gradle 文件的示例及其说明
// pluginManagement用于管理Gradle插件的仓库相关配置
pluginManagement {repositories {// google仓库配置用于获取特定的插件google {content {// 通过正则表达式匹配包含以com.android开头的插件组includeGroupByRegex(com\\.android.*)// 通过正则表达式匹配包含以com.google开头的插件组includeGroupByRegex(com\\.google.*)// 通过正则表达式匹配包含以androidx开头的插件组includeGroupByRegex(androidx.*)}}// 添加Maven中央仓库可获取众多开源插件和依赖mavenCentral()// Gradle官方的插件仓库用于获取Gradle插件gradlePluginPortal()}
}// dependencyResolutionManagement用于控制项目如何解析依赖
dependencyResolutionManagement {// 设置依赖仓库的模式FAIL_ON_PROJECT_REPOS表示如果项目级别的仓库配置不符合预期构建将失败repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {// 使用google仓库获取与Google和Android相关的依赖google()// 使用Maven中央仓库获取各种开源库依赖mavenCentral()}
}// 设置根项目的名称为FakeQQMusic方便在构建系统等环境中标识项目
rootProject.name FakeQQMusic// 在多模块项目中包含名为app的子模块通常是Android项目的主要应用模块会参与构建过程
include :app我们着重说明一下增加的部分 settings.gradle 文件中的 pluginManagement 和 dependencyResolutionManagement 配置块中的内容。
这些配置块用于配置 Gradle 插件的仓库和依赖项的解析方式。 在 pluginManagement 配置块中 repositories 声明了用于解析 Gradle 插件的仓库。示例中的配置包括 google()、mavenCentral() 和 gradlePluginPortal()。通过这些仓库Gradle 将查找并下载所需的插件。 在 dependencyResolutionManagement 配置块中 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 设置了仓库模式为 RepositoriesMode.FAIL_ON_PROJECT_REPOS。这表示如果项目中存在本地的仓库则构建过程将失败。该配置用于强制 Gradle 仅使用远程仓库解析依赖项而不依赖本地仓库。repositories 声明了用于解析项目依赖项的仓库。示例中的配置包括 google() 和 mavenCentral()。
通过这些仓库Gradle 将查找并下载项目所需的依赖项。
这些配置块的作用是为 Gradle 构建过程提供正确的插件和依赖项解析环境。配置中的仓库声明可以根据项目的需求进行调整以确保构建正常进行。
④ gradle.properties
gradle.properties 文件是一个位于根目录下的重要配置文件用于设置 Gradle 构建系统的全局属性。它可以包含一些常用的配置属性和自定义属性以影响项目的构建过程。其中让人印象最深刻的莫过于Google将库统一迁移到AndroidX下当时就需要改一个属性android.useAndroidXtrue现在这已经是一个常驻属性了之前的V4、V7的库你只会在一些老项目上看到属于时代的眼泪了下面我们看看这个gradle.properties中的内容
# 指定用于守护进程的 JVM 参数。
org.gradle.jvmargs-Xmx2048m -Dfile.encodingUTF-8
# 使用AndroidX
android.useAndroidXtrue
# Kotlin 代码样式“official 官方”或“obsolete 过时”
kotlin.code.styleofficial
//kotlin的
# 启用每个库的 R 类的命名空间以便其 R 类仅包含库本身中声明的资源而不包含库依赖项中的资源从而减小该库的 R 类的大小
android.nonTransitiveRClasstrue项目范围的 Gradle 设置。 IDE例如 Android Studio用户 通过 IDE 配置的 Gradle 设置 将会覆盖 本文件中指定的任何设置。 如需了解有关如何配置构建环境的更多详细信息请访问 http://www.gradle.org/docs/current/userguide/build_environment.html 指定用于守护进程的 JVM 参数。 该设置对于调整内存设置特别有用。 org.gradle.jvmargs-Xmx2048m -Dfile.encodingUTF-8 这一行表示设置最大堆内存为 2048MB并将文件编码指定为 UTF-8这样可以在 Gradle 守护进程运行时按照这个内存分配和编码规则来处理相关任务有助于避免因内存不足等问题导致的构建错误同时保证文件读写等操作时编码的一致性。 当进行配置后Gradle 将以试验性的并行模式运行。 此选项仅应在解耦项目中使用。如需了解更多详细信息请访问 https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects org.gradle.paralleltrue 这里如果启用了该设置当前被注释掉了意味着多个模块或者任务可以并行构建能够加快整体构建速度但要确保项目是符合解耦条件的不然可能会出现一些预料之外的构建问题。 AndroidX 包结构用于更清晰地表明哪些包是随 Android 操作系统捆绑在一起的以及哪些包是与你的应用程序的 APK 一起打包的。 https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidXtrue 这一设置启用了 AndroidXAndroidX 是对之前 Android 支持库的重构和改进采用了新的包名体系有助于更好地区分系统相关和应用自身相关的库包方便进行依赖管理以及适配不同版本的 Android 系统等操作。 启用每个库的 R 类的命名空间使得其 R 类仅包含在该库自身中声明的资源而不包含来自该库依赖项的资源 从而减小该库的 R 类的大小。 android.nonTransitiveRClasstrue 这一设置让每个库的资源管理更加独立避免因为依赖传递导致 R 类中包含过多不必要的资源引用进而减小了 R 类占用的空间对于优化 APK 大小等方面有一定帮助使得资源管理更加清晰和高效。 ⑤ gradle-wrapper.properties
在 Android 项目中gradle-wrapper.properties 文件位于根目录下的 gradle/wrapper 文件夹中它用于配置 Gradle Wrapper。Gradle Wrapper 是一个与项目一起分发的 Gradle 版本管理工具它可以确保每个构建都使用指定版本的 Gradle而无需手动安装或配置 Gradle。
gradle-wrapper.properties 文件包含了一些重要的配置属性用于指定 Gradle Wrapper 的行为和使用的 Gradle 版本。下面看一个示例
#Tue Oct 22 17:28:24 CST 2024
distributionBaseGRADLE_USER_HOME
distributionPathwrapper/dists
distributionUrlhttps\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBaseGRADLE_USER_HOME
zipStorePathwrapper/dists上述示例中的 gradle-wrapper.properties 文件包含了以下重要配置和说明
distributionBase 和 distributionPath 配置了 Gradle Wrapper 下载和缓存 Gradle 发行版本的基本路径。默认情况下它们指向 GRADLE_USER_HOME即用户的 Gradle 目录。zipStoreBase 和 zipStorePath 配置了压缩文件的基本路径Gradle Wrapper 会将下载的 Gradle 发布文件存储在这里。默认情况下它们也指向 GRADLE_USER_HOME。distributionUrl 指定了要使用的 Gradle 发布版本的 URL。通过指定这个 URLGradle Wrapper 会自动下载并使用该版本构建项目。
gradle-wrapper.properties 文件的作用是为项目提供一个指定版本的 Gradle。当你使用 Gradle Wrapper 执行构建时它会根据该文件中的配置自动下载所需版本的 Gradle。这有助于项目的一致性和可移植性因为每个开发者都可以使用相同的 Gradle 版本构建项目无需手动配置。
需要注意的是如果需要更改 Gradle 版本或其他配置属性可以在 gradle-wrapper.properties 文件中进行相应的修改。比如我可能Gradle需要升级8.1那么你在改动之后点击Sync Now进行下载配置具体的配置方式和详细说明可以参考官方文档。
⑥ local.properties
local.properties 文件是一个位于根目录下的本地配置文件它用于指定本地开发环境中的一些路径和属性。该文件通常用于定义 SDK 和其他构建工具的位置以便 Gradle 可以正确定位并使用它们。
以下是一个示例 local.properties 文件的内容及其说明
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dirD\:\\jetbrains\\Sdk//可能会有
//sdk.dirD\:\\Android\\Sdk
//ndk.dirD\:\\Android\\Sdk\\ndk\\26.1.10909125上述示例中的 local.properties 文件包含了以下重要配置和说明
sdk.dir 配置了 Android SDK 的位置。这个配置属性指定了 Android SDK 的根目录路径Gradle 将使用该路径来查找构建所需的 Android 库和工具。ndk.dir 配置了 Android NDK 的位置。这个配置属性指定了 Android NDK 的根目录路径Gradle 将使用该路径来支持使用 C/C 编写的本地代码。
通过在 local.properties 文件中设置这些属性Android 开发工具链如 Android Studio 和 Gradle可以找到和使用正确的 SDK、NDK 版本并确保项目的构建过程能够正常进行。
请注意local.properties 文件通常是在 Android 项目的每个开发者的本地环境中设置。这意味着每个开发者可以根据自己的系统配置和需求来设置这些属性而不会影响到其他开发者。默认情况下你是不需要配置ndk的路径的需要根据你的实际开发环境和需求来设置 local.properties 文件中的属性。确保路径和属性值与你的系统配置和目录结构一致。
总结
gradle-wrapper
gradle-wrapper 简单来说就是对 Gradle 的一层封装。为什么需要再封装一层呢主要有三点原因
确保 版本一致性 让团队成员都使用项目指定的相同版本进行构建避免因版本差异导致的构建问题方便 项目迁移和共享当项目需要迁移到其他环境或与他人共享时不需要担心 Gradle 版本的问题因为 Wrapper 会处理好版本的适配。版本更新管理项目可以方便地更新 Gradle 版本只需在 Wrapper 的配置中修改版本号所有使用 Wrapper 的开发者在下次构建时都会自动获取并使用新的版本。
从上图可以看到gradle-wrapper 相关的文件有四种分别是
gradle-wrapper.jar主要是Gradle的运行逻辑包含下载Gradlegradle-wrapper.propertiesgradle-wrapper 的配置文件核心是定义了Gradle版本gradlewgradle wrapper的简称linux下的执行脚本gradlew.batwindows下的执行脚本
由于这篇文章主要是讲配置文件的这里就主要看看 gradle-wrapper.properties 的文件
#Tue Oct 22 17:28:24 CST 2024
distributionBaseGRADLE_USER_HOME
distributionPathwrapper/dists
distributionUrlhttps\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBaseGRADLE_USER_HOME
zipStorePathwrapper/dists参数介绍如下
distributionBase下载的Gradle的压缩包解压后的主目录zipStoreBase同distributionBase不过是存放zip压缩包的主目录distributionPath相对于distributionBase的解压后的Gradle的路径为wrapper/distszipStorePath同distributionPath不过是存放zip压缩包的distributionUrlGradle版本的下载地址所有的版本可以看Gradle Distributions。这里有几种类型分别为doc用户文档bin二进制文件all包含源码、用户文档、二进制文件等
项目根目录下的 build.gradle
项目根目录下的 build.gradle的文件内容如下所示
plugins {
alias(libs.plugins.android.application) apply false
}plugins 声明的是用来构建应用的插件列表。其中 apply false 表示不将该 plugin 应用于当前项目一般是在需要使用的模块的 build.gradle 文件中声明使用。
在7.0以前Gradle 可以设置很多通用的配置现在在 7.0 版本之后这些配置移动到了 setting.gradle 文件。
setting.gradle
setting.gradle 文件内容如下所示
// pluginManagement用于管理Gradle插件的仓库相关配置
pluginManagement {repositories {// google仓库配置用于获取特定的插件google {content {// 通过正则表达式匹配包含以com.android开头的插件组includeGroupByRegex(com\\.android.*)// 通过正则表达式匹配包含以com.google开头的插件组includeGroupByRegex(com\\.google.*)// 通过正则表达式匹配包含以androidx开头的插件组includeGroupByRegex(androidx.*)}}// 添加Maven中央仓库可获取众多开源插件和依赖mavenCentral()// Gradle官方的插件仓库用于获取Gradle插件gradlePluginPortal()}
}// dependencyResolutionManagement用于控制项目如何解析依赖
dependencyResolutionManagement {// 设置依赖仓库的模式FAIL_ON_PROJECT_REPOS表示如果项目级别的仓库配置不符合预期构建将失败repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {// 使用google仓库获取与Google和Android相关的依赖google()// 使用Maven中央仓库获取各种开源库依赖mavenCentral()}
}// 设置根项目的名称为FakeQQMusic方便在构建系统等环境中标识项目
rootProject.name FakeQQMusic// 在多模块项目中包含名为app的子模块通常是Android项目的主要应用模块会参与构建过程
include :app顾名思义setting.gradle 文件主要存储项目相关的设置信息。比如说可以在 setting.gradle 文件中设置了插件仓库位置、依赖仓库位置这些通用的配置以及指定项目构建需要依赖哪些模块。
模块中的 build.gradle
plugins {// 当前模块应用的插件// 使用libs版本目录中定义的android.application插件通过前面的版本目录配置关联// 通常这个插件用于将当前模块配置为一个可运行的Android应用程序模块alias(libs.plugins.android.application)
}android {// android 相关的配置信息会被引入的 com.android.application 插件使用// 定义应用的命名空间用于在Android系统中唯一标识该应用类似于包名的作用namespace com.example.fakeqqmusic// 指定编译项目所使用的SDK版本这里设置为34表示使用Android SDK 34进行编译compileSdk 34defaultConfig {// 应用在Android系统中的唯一标识符等同于早期的包名概念用于安装、启动等操作applicationId com.example.fakeqqmusic// 定义应用支持的最低Android系统版本这里设置为28表示该应用能在Android 28及以上版本运行minSdk 28// 定义应用的目标Android系统版本即主要针对该版本进行功能优化和测试这里是34targetSdk 34// 应用的版本代码是一个整数用于在应用市场等场景区分不同版本每次发布新版本时通常需要递增versionCode 1// 应用的版本名称是一个字符串通常是方便用户识别的版本号形式如1.0可以按照自己的规则来命名versionName 1.0// 指定用于运行Android测试用例的测试运行器这里使用的是AndroidJUnitRunner它是Android测试框架中常用的运行器testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {// 是否启用代码压缩和混淆设置为false表示在生成发布版本release时不进行代码压缩和混淆操作。// 如果设置为true则会根据下面指定的proguardFiles进行代码的压缩和混淆处理minifyEnabled false// 指定Proguard代码混淆工具的配置文件// 第一个文件是Android SDK自带的默认优化配置文件第二个是项目自定义的规则文件// 两者结合起来用于确定具体的代码混淆规则和方式proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {// 指定项目源代码兼容的Java版本这里设置为Java 8版本意味着可以在项目中使用Java 8的语法特性进行编码sourceCompatibility JavaVersion.VERSION_1_8// 指定项目编译生成的字节码兼容的Java版本同样设置为Java 8确保生成的字节码能在Java 8及以上的运行环境正常运行targetCompatibility JavaVersion.VERSION_1_8}buildFeatures {// 启用ViewBinding功能ViewBinding是一种用于更方便地在代码中访问和操作XML布局文件中视图的机制// 它会为每个XML布局文件生成对应的绑定类减少了 findViewById 等操作的繁琐性和出错可能viewBinding true// 启用DataBinding功能DataBinding允许将数据和布局文件进行绑定方便实现数据驱动的UI展示// 可以在布局文件中直接使用数据对象和相关表达式使数据与视图的交互更加简洁直观dataBinding true}
}dependencies {// 引入appcompat库这个库提供了对Android早期版本的兼容性支持比如一些UI组件和功能// 它的版本信息从前面配置的libs.versions.toml文件中通过libs.appcompat获取implementation libs.appcompat// 引入material库用于在应用中使用符合Material Design规范的UI组件和样式// 同样其版本是根据libs.versions.toml里的配置通过libs.material获取implementation libs.material
}如上代码所示模块中的 build.gradle 文件中主要设置了构建需要的信息这些信息最后会被应用的插件来使用。
local.properties 和 gradle.properties
local.properties 和 gradle.properties 文件都是存储配置信息。不同的是local.properties 设置的是本地的特殊配置比如sdk的位置而gradle.properties 设置的是项目相关的配置。
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dirD\:\\jetbrains\\Sdk
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs-Xmx2048m -Dfile.encodingUTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.paralleltrue
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your apps APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidXtrue
# Enables namespacing of each librarys R class so that its R class includes only the
# resources declared in the library itself and none from the librarys dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClasstrue在使用上 local.properties 设置的属性不能直接使用只能通过文件读取。而 gradle.properties中自定义属性可以在gradle中可以直接使用。但是对于 xxx.xxx 格式的属性需要读取文件获取它的属性值不能直接使用。 local.properties 示例如下
// 创建Properties对象Properties properties new Properties();try {// 通过文件输入流加载local.properties文件FileInputStream fileInputStream new FileInputStream(project.getRootProject().getFile(local.properties));properties.load(fileInputStream);// 获取sdk.dir属性的值String sdkDir properties.getProperty(sdk.dir);// 打印sdk.dir的值System.out.println(sdkDir sdkDir);// 关闭文件输入流fileInputStream.close();} catch (IOException e) {e.printStackTrace();}gradle.properties 读取配置示例如下
//在build.gradle脚本中使用String test someValue; // 假设这是从某个地方获取的属性值System.out.println(test test);// 读取 gradle.properties 文件Properties properties new Properties();try {properties.load(new FileInputStream(gradle.properties));String androidx properties.getProperty(android.useAndroidX);System.out.println(androidx androidx);} catch (IOException e) {e.printStackTrace();}组件化
抽离共用的build.gradle版本数据
我们在APP开发过程中肯定会涉及到不同的手机版本信息系统信息等等。如果每个模块的信息都是独立的那么一旦出现版本问题需要修改的情况将会变得非常麻烦。
这时就需要使用config.gradle统一管理项目的依赖库
项目下新建一个Gradle文件
用于存储项目基本信息在这里面我们写上所有依赖库以及项目中sdk等等的版本号然后直接让build .gradle去apply它之后有什么版本的修改升级就可以直接在这里改。
定义一个ext扩展区域
config.gradle全局基础配置使用在项目build中确保属性的引用
用于定义额外的属性和变量以便在整个构建脚本中共享和重复使用。
//在 Gradle 构建脚本中定义了一些 Android 项目的配置和依赖项版本信息。
ext {isDebug false; //当为true时代表调试模式组件可以单独运行。如果是false代表编译打包/**compileSdkVersion指定用于编译应用程序的 Android SDK 版本。minSdkVersion指定应用程序可以运行的最低 Android 版本。targetSdkVersion指定应用程序目标的 Android 版本。versionCode用于标识应用程序版本的整数值。versionName用于标识应用程序版本的字符串值。*/android [compileSdkVersion: 33,minSdkVersion : 32,targetSdkVersion : 33,versionCode : 1,versionName : 1.0]/*** 这是每个模块的application地址*/applicationId [app : com.example.dome,live : com.example.module.live,net : com.example.module.net,login: com.example.module.login,router: com.example.module.librouter]//定义了一些常见的 Android 库的依赖项包括 AppCompat 库、Material Design 库和 ConstraintLayout 库。library [appcompat : androidx.appcompat:appcompat:1.6.1,material : com.google.android.material:material:1.5.0,constraintlayout: androidx.constraintlayout:constraintlayout:2.1.4]//第三方库单独放置libGson com.google.code.gson:gson:2.8.6libARouter com.alibaba:arouter-api:1.5.2libARouterCompiler com.alibaba:arouter-compiler:1.5.2
}config_build.gradle通用配置使用在各个build里其实可用也可不用
/*** 整个项目(app/module)的通用gradle配置* 需要自行确定namespace。需要自行动态判定module是属于application(并配置applicationId)还是library。* 默认依赖基础组件module(:modulesBase:lib_base)* 这段注释说明了该配置文件的整体用途它旨在为整个项目无论是应用模块还是库模块提供通用的Gradle配置信息。* 同时提到了需要手动处理一些事项比如确定命名空间以及判断模块类型并相应配置应用标识针对应用模块* 还指出默认会依赖一个名为modulesBase:lib_base的基础组件模块。*/// 应用org.jetbrains.kotlin.android插件这表明当前模块是使用Kotlin语言进行Android开发的
// 该插件会为Kotlin在Android项目中的编译、构建等流程提供相应的支持和配置
apply plugin: org.jetbrains.kotlin.androidandroid {// rootProject 是指项目的根项目这里从根项目的扩展属性ext中获取android.compileSdk的值// 用于指定当前模块编译所使用的Android SDK版本通过这种方式可以在根项目统一管理所有模块的编译SDK版本compileSdk rootProject.ext.android.compileSdkdefaultConfig {// 从根项目的扩展属性ext中获取android.minSdk的值来定义当前模块支持的最低Android系统版本// 确保模块能在该版本及以上的Android设备上正常运行避免在过低版本系统上出现兼容性问题minSdk rootProject.ext.android.minSdk// 同样从根项目扩展属性获取android.targetSdk的值确定模块的目标Android系统版本// 即开发过程中重点针对该版本进行功能优化和测试保证在该目标版本下功能表现最佳且兼容性良好targetSdk rootProject.ext.android.targetSdk// 从根项目扩展属性获取android.versionCode的值作为应用的版本代码它是一个整数// 用于在应用发布等场景下例如应用市场区分不同版本每次发布新版本时通常需要按照一定规则递增该数值versionCode rootProject.ext.android.versionCode// 从根项目扩展属性获取android.versionName的值作为应用的版本名称它是一个字符串// 一般采用方便用户识别的版本号形式如1.0开发团队可以按照自己的版本命名规则来设定versionName rootProject.ext.android.versionName// 指定用于运行Android测试用例的测试运行器这里使用的是AndroidJUnitRunner// 它是Android测试框架中常用的运行器便于编写和执行单元测试等各类测试任务testInstrumentationRunner androidx.test.runner.AndroidJUnitRunnerjavaCompileOptions {annotationProcessorOptions {// 为注解处理器传递参数这里将当前项目的名称通过project.getName()获取作为参数传递给ARouter模块相关的注解处理器。// ARouter是一个用于Android的路由框架在使用其注解处理器APT时需要传递模块名称这样的参数// 以便在编译阶段正确处理路由相关的注解信息生成相应的路由映射代码等arguments [AROUTER_MODULE_NAME: project.getName()]}}}buildTypes {release {// 是否启用代码压缩和混淆设置为false表示在生成发布版本release时不进行代码压缩和混淆操作。// 如果设置为true则会根据下面指定的proguardFiles进行代码的压缩和混淆处理// 代码压缩和混淆有助于减小APK大小以及保护代码逻辑不被轻易反编译分析minifyEnabled false// 指定Proguard代码混淆工具的配置文件// 第一个文件是Android SDK自带的默认优化配置文件第二个是项目自定义的规则文件// 两者结合起来用于确定具体的代码混淆规则和方式确保在进行代码混淆时按照期望的要求处理代码proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {// 指定项目源代码兼容的Java版本这里设置为Java 8版本意味着在项目中可以使用Java 8的语法特性进行编码// 例如Lambda表达式、Stream API等方便开发者利用更现代的语言特性来编写代码sourceCompatibility JavaVersion.VERSION_1_8// 指定项目编译生成的字节码兼容的Java版本同样设置为Java 8确保生成的字节码能在Java 8及以上的运行环境正常运行// 这保证了编译后的代码可以在符合要求的Java运行时环境中正确执行targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {// 针对Kotlin语言指定其编译后的字节码所兼容的JVM目标版本为Java 8// 这样在Kotlin代码中可以使用与Java 8兼容的特性以及语法糖等确保Kotlin代码能在相应的JVM环境下正确运行jvmTarget 1.8}
}dependencies {// 使用implementation不传递依赖可以防止重复依赖或依赖冲突。// 这种依赖方式意味着引入的库只会在当前模块内部使用不会将该依赖传递给依赖当前模块的其他模块// 有助于控制依赖关系的复杂性避免不必要的依赖传递导致的问题例如版本冲突等。// 引入项目中名为modulesBase:lib_base的模块这里推测是项目的一个基础组件模块// 可能包含了一些通用的功能、工具类或者资源等供当前模块使用implementation project(:modulesBase:lib_base)// ARouter 注解处理器 APT需要在每个使用的组件的build.gradle去添加并在defaultConfig里添加project.getName。这里属于通用配置一次配置完。// 从根项目扩展属性ext中获取arouter_compiler对应的注解处理器依赖引入该依赖用于处理ARouter框架相关的注解// 在编译阶段通过注解处理器自动生成路由相关的代码实现页面之间的路由跳转等功能// 这里通过在通用配置中添加避免在每个使用ARouter的模块中都重复配置该依赖annotationProcessor rootProject.ext.arouter_compiler// 引入JUnit测试框架版本为4.13.2用于在普通测试test环境下编写和执行单元测试// 帮助开发者验证模块内各个类和方法的功能正确性testImplementation junit:junit:4.13.2// 引入JUnit的扩展版本用于在Android测试androidTest环境下执行单元测试版本为1.1.3// 它提供了一些针对Android平台的测试功能扩展便于在Android设备或模拟器上进行更贴合实际情况的测试androidTestImplementation androidx.test.ext:junit:1.1.3// 引入Espresso测试框架版本为3.4.0用于在Android测试androidTest环境下编写和执行UI相关的测试用例// 可以方便地对Android应用的用户界面进行功能测试例如模拟用户点击、输入等操作来验证界面交互的正确性androidTestImplementation androidx.test.espresso:espresso-core:3.4.0
}在业务层中这样引用即可。
引入到主工程、功能层、基础层module
主工程build.gradle中只需要引入两行代码
apply plugin: com.android.application
apply from: ${rootProject.rootDir}/config_build.gradle功能层基础层build.gradle中也只需要引入两行代码 apply plugin: com.android.libraryapply from: ${rootProject.rootDir}/config_build.gradle注意注意对比原始配置和抽离出来的通用gradle文件的区别将特有的自行添加的特定的module。
在build.gradle中导入config.gradle
apply from:config.gradleBase基础层
建立一个libBase模块
修改libbase的builde.gradle
我们创建的library模块会自动设置启动模式为apply plugin: com.android.library这样基础模块就会被打包成一个arr文件配合其他的业务模块application使用。
// 应用com.android.library插件将当前模块配置为一个Android库模块
// 意味着这个模块可以被其他Android模块依赖使用而不是作为一个独立可运行的应用程序
apply plugin: com.android.library// 简化手写rootProject.ext的次数提高性能
// 通过将rootProject.ext赋值给cfg变量后续可以更方便地访问根项目中定义的扩展属性避免多次重复书写rootProject.ext提高代码可读性和编写效率
def cfg rootProject.extandroid {// 命名空间从根项目扩展属性cfg中获取applicationId.net作为当前模块的命名空间。// 命名空间用于在Android系统中唯一标识该库模块类似于包名的作用方便在不同模块间区分和引用namespace cfg.applicationId.net// 编译项目所使用的SDK版本从根项目扩展属性cfg的android.compileSdkVersion属性获取具体的版本号// 该属性应该在根项目中提前定义好这样便于统一管理和修改编译所依赖的SDK版本compileSdkVersion cfg.android.compileSdkVersiondefaultConfig {// 定义该库模块支持的最低Android系统版本从根项目扩展属性cfg的android.minSdkVersion属性获取相应数值// 这决定了该库能在哪些版本的Android系统上被使用避免在过低版本系统上出现兼容性问题minSdkVersion cfg.android.minSdkVersion// 定义该库模块的目标Android系统版本即主要针对该版本进行功能优化和测试从cfg.android.targetSdkVersion获取// 表示开发过程中重点考虑该目标版本下的功能表现和兼容性targetSdkVersion cfg.android.targetSdkVersion// 指定用于运行Android测试用例的测试运行器这里使用的是AndroidJUnitRunner// 它是Android测试框架中常用的运行器方便编写和执行单元测试等测试任务testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {// 是否启用代码压缩和混淆设置为false表示在生成发布版本release时不进行代码压缩和混淆操作。// 如果设置为true则会根据下面指定的proguardFiles进行代码的压缩和混淆处理minifyEnabled false// 指定Proguard代码混淆工具的配置文件// 第一个文件是Android SDK自带的默认优化配置文件第二个是项目自定义的规则文件// 两者结合起来用于确定具体的代码混淆规则和方式proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {// 指定项目源代码兼容的Java版本这里设置为Java 8版本意味着可以在项目中使用Java 8的语法特性进行编码sourceCompatibility JavaVersion.VERSION_1_8// 指定项目编译生成的字节码兼容的Java版本同样设置为Java 8确保生成的字节码能在Java 8及以上的运行环境正常运行targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {// 将cfg.library.appcompat对应的库以api依赖的方式引入。使用api依赖意味着该库不仅会在当前模块中使用// 而且当其他模块依赖当前模块时这个库也会被传递依赖过去适用于需要暴露给外部模块使用的依赖api cfg.library.appcompat// 同理将cfg.library.material对应的库以api依赖的方式引入方便在模块中使用符合Material Design规范的UI组件和样式等功能// 并可传递给依赖当前模块的其他模块api cfg.library.material// 将cfg.library.constraintlayout对应的库以api依赖的方式引入用于布局相关的功能支持同样可传递给外部依赖模块api cfg.library.constraintlayout// 将cfg.libGson对应的库以api依赖的方式引入推测这里的库可能是用于处理JSON数据的Gson库同样可对外传递依赖api cfg.libGson// 也可以使用这样的方式一行代码完成相当于一个for循环遍历library// 下面这行代码会遍历cfg.library中的每个键值对k表示键v表示值并将每个值以implementation依赖的方式引入。// implementation依赖表示该库仅在当前模块内部使用不会传递给依赖当前模块的其他模块library.each { k, v - implementation v }// 引入JUnit测试框架版本为4.13.2用于编写和执行单元测试这里是在普通测试test环境下使用的依赖testImplementation junit:junit:4.13.2// 引入JUnit的扩展版本用于在Android测试androidTest环境下执行单元测试版本为1.1.5// 它提供了一些针对Android平台的测试功能扩展androidTestImplementation androidx.test.ext:junit:1.1.5// 引入Espresso测试框架版本为3.5.1用于在Android测试androidTest环境下编写和执行UI相关的测试用例// 方便对Android应用的用户界面进行功能测试androidTestImplementation androidx.test.espresso:espresso-core:3.5.1
}你可以先不管这些什么rootProject.ext.android.minSdk解释一下在 Gradle 中rootProject 是指项目的根项目即顶层项目。 ext 是 ExtraPropertiesExtension 的缩写是一个扩展属性的机制。通过将属性添加到 rootProject.ext你可以在整个 Gradle 构建中共享这些属性。相当于一个全局变量。
组件层业务
建立一个login组件模块
这里不介绍了网上的使用挺多的依照网上的来就很简单了
修改login的builde.gradle
将涉及到共用部分的写成ext的形式。
1.引入config_build文件
//动态切换集成\组件模式
if (rootProject.ext.isDebug) {apply plugin: com.android.application
} else {apply plugin: com.android.library
}apply from: ${rootProject.rootDir}/config_build.gradleandroid {// 业务组件特定的配置namespace rootProject.ext.applicationId.maindefaultConfig {//组件模式需要applicationIdif (rootProject.ext.isDebug) {applicationId rootProject.ext.applicationId.main}}//动态切换集成/组件模式的AndroidManifestsourceSets {main {if (rootProject.ext.isDebug) {manifest.srcFile src/main/debug/AndroidManifest.xml} else {manifest.srcFile src/main/AndroidManifest.xml}}}
}dependencies {// 业务组件特定的依赖配置}2.不引入
//判断属于打包模式还是调试模式
if (rootProject.ext.isDebug) {apply plugin: com.android.application
} else {apply plugin: com.android.library
}def cfg rootProject.extandroid {namespace cfg.applicationId.logincompileSdkVersion cfg.android.compileSdkVersiondefaultConfig {//判断如果是调试模式则需要当做一个application启动则需要一个yif (cfg.isDebug) {applicationId cfg.applicationId.login}minSdkVersion cfg.android.minSdkVersiontargetSdkVersion cfg.android.targetSdkVersionversionCode cfg.android.versionCodeversionName cfg.android.versionNametestInstrumentationRunner androidx.test.runner.AndroidJUnitRunner}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}//选择合适的manifestsourceSets {main {if (cfg.isDebug) {manifest.srcFile src/main/debug/AndroidManifest.xml} else {manifest.srcFile src/main/AndroidManifest.xml//注意我们还需在正式环境下屏蔽Debug包下的所有文件java{exclude **/debug/**}}}}}dependencies {//导入基础模块implementation project(:modulesBase:libBase)testImplementation junit:junit:4.13.2androidTestImplementation androidx.test.ext:junit:1.1.5androidTestImplementation androidx.test.espresso:espresso-core:3.5.1
}解释
if (rootProject.ext.isDebug) {apply plugin: com.android.application
} else {apply plugin: com.android.library
}这一部分就不解释了哈从下面解释 sourceSets 定义了一个 main 源集。 对于 main 源集使用了一个条件语句if (cfg.isDebug)来决定使用哪个清单文件。 “/debug/”: 这是一个 Ant 风格的通配符。** 表示匹配任意数量的目录因此 /debug/ 表示匹配任何包含 “debug” 目录的路径。 sourceSets {main {if (cfg.isDebug) {manifest.srcFile src/main/debug/AndroidManifest.xml} else {manifest.srcFile src/main/AndroidManifest.xml//注意我们还需在正式环境下屏蔽Debug包下的所有文件java{exclude **/debug/**}}}}然后在dependencies中导入了刚才的libBase模块此时login就具有了libBase所存在的依赖。
implementation project(:modulesBase:libBase)app层
修改App的build.gradle
基本和刚才login组件的修改方法相似plugins不用改动因为App层不会拿来当作library。
plugins {id com.android.application
}需要注意的就是dependencies。同样的app也需要导入基础模块的依赖并且app是关联其他的多个组件这里还需要导入其他组件例如login
因此在这里也需要判断是否是debug模式如果是debug模式就不需要导入这些组件。
plugins {id com.android.application
}def cfg rootProject.extandroid {namespace cfg.applicationId.appcompileSdkVersion cfg.android.compileSdkVersiondefaultConfig {applicationId cfg.applicationId.appminSdkVersion cfg.android.minSdkVersiontargetSdkVersion cfg.android.targetSdkVersionversionCode cfg.android.versionCodeversionName cfg.android.versionNametestInstrumentationRunner androidx.test.runner.AndroidJUnitRunner//让java代码也可以使用isDebugbuildConfigField(boolean,isDebug,String.valueOf(isDebug))}//启用buildConfigField功能buildFeatures {buildConfig true}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation project(:modulesBase:libBase)//如果不是Debug的情况下则导入各个组件的模块if (!cfg.isDebug){implementation project(:modulesCore:live)implementation project(:modulesCore:login)}testImplementation junit:junit:4.13.2androidTestImplementation androidx.test.ext:junit:1.1.5androidTestImplementation androidx.test.espresso:espresso-core:3.5.1
}如上即可。
config_build文件的作用其实就是浓缩了一下简化一点点代码Gradle基础