# GradleBasic **Repository Path**: iMist/GradleBasic ## Basic Information - **Project Name**: GradleBasic - **Description**: 多渠道打包,Gradle构建脚本实践 - **Primary Language**: Groovy - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-03-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 构建配置文件 * 先来一张官方的项目结构图 ![](/images/image1.png) * Gradle 设置文件 `settings.gradle` 文件位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内。 对大多数项目而言,该文件很简单,只包括以下内容: ``` include ‘:app’ ``` * 顶级构建文件 >顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。 默认情况下,此顶级构建文件使用 buildscript 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项。 以下代码示例描述的默认设置和 DSL 元素可在新建项目后的顶级 build.gradle 文件中找到。 * 模块级构建稳健 > 模块级 build.gradle 文件位于各 project/module/ 目录中,用于配置适用于其所在模块的构建设置。 您可以通过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风格),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。 #### 重要说明 >在 Android Gradle Plugin 2.0 版本中,flavor 中的 flavorDimension 字段改为 dimension ,flavorDimension 无法继续使用,Android Gradle Plugin 1.3 已经支持 dimension 了,所以建议使用 dimension 。 #### Gradle 属性文件 * `gradle.properties` 您可以在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小 * `local.properties `为构建系统配置本地环境属性,例如 SDK 安装路径。 由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,因此您不应手动修改该文件,或将其纳入您的版本控制系统。 ### 源集 * Android Studio 按逻辑关系将每个模块的源代码和资源分组为源集。 模块的 main/ 源集包括其所有构建变体使用的代码和资源。 其他源集目录为可选项,在您配置新的构建变体时,Android Studio 不会自动为您创建这些目录。 不过,创建类似于 main/ 的源集有助于让 Gradle 仅在构建特定应用版本时才应使用的文件和资源井然有序: * `src/main/`此源集包括所有构建变体共用的代码和资源。 * `src/buildType/` 创建此源集可加入特定构建类型专用的代码和资源。 * `src/productFlavor/`创建此源集可加入特定产品风格专用的代码和资源。 ![](images/image2.png) * `src/productFlavorBuildType/` 创建此源集可加入特定构建变体专用的代码和资源。 ``` 例如,要生成应用的“完整调试”版本,构建系统需要合并来自以下源集的代码、设置和资源: src/fullDebug/(构建变体源集) src/debug/(构建类型源集) src/full/(产品风格源集) src/main/(主源集) ``` >注:如果配置构建以组合多个产品风格,则可为风格维度间产品风格的各个组合创建源集目录: `src/productFlavor1ProductFlavor2/ ` ; >注:当您在 Android Studio 中使用 File > New 菜单选项新建文件或目录时,可以针对特定源集进行创建。 可供您选择的源集取决于您的构建配置,如果所需目录尚不存在,Android Studio 会自动创建。 ### 设置应用id * 当您在 Android Studio 中创建新项目时,applicationId 会完全匹配您在设置时选择的 Java 风格软件包名称。 不过,除了这一点,应用 ID 和软件包名称彼此无关 * 更改用于构建变体的应用 ID * 当您为应用构建 APK 时,构建工具会使用 build.gradle 文件的 defaultConfig 块中定义的应用 ID 标记 APK(如下所示)。不过,如果您想要创建不同版本的应用以在 Google Play 商店上显示为单独详情,如“免费版”和“专业版”,您需要创建单独的构建变体,每个构建变体具有不同的应用 ID。 ``` android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } } ``` ### 更新软件包名称 * 默认情况下,您项目的软件包名称会匹配应用 ID,但您也可以更改软件包名称。 不过,如果您想要更改软件包名称,请注意软件包名称(由您的项目目录结构定义)应始终匹配 AndroidManifest.xml 文件中的 package 属性,如下所示: ``` ``` * Android 构建工具会将 package 属性用于下面两方面: * 它会将此名称用作应用生成的 R.java 类的命名空间。示例:对于上面的清单,R 类将为 com.example.myapp.R。 * 它会使用此名称解析清单文件中声明的任何相关类名称。示例:对于上面的清单,声明为 的 Activity 将解析为 com.example.myapp.MainActivity。 ### 添加构建依赖项 * 以下这个应用模块的 build.gradle 文件包括三种不同类型的依赖项: ``` apply plugin: 'com.android.application' android { ... } dependencies { // Dependency on a local library module ,项目模块依赖 implementation project(":mylibrary") // Dependency on local binaries 依赖制定目录的所有jar implementation fileTree(dir: 'libs', include: ['*.jar']) //或者,您也可以像下面这样指定单独的文件: implementation files('libs/foo.jar', 'libs/bar.jar') // Dependency on a remote binary implementation 'com.example.android:app-magic:12.3' implementation group: 'com.example.android', name: 'app-magic', version: '12.3' } ``` ![](images/image3.png) #### 远程代码库 * 默认情况下,Android Studio 新项目会在项目的顶级 build.gradle 文件中指定 Google 的 Maven 代码库和 JCenter 作为代码库位置; * 如果您需要的内容来自 Maven 中央代码库,则添加 mavenCentral();如果来自本地代码库,则使用 mavenLocal(): ``` allprojects { repositories { google() jcenter() mavenCentral() mavenLocal() } } ``` * 或者,也可像下面这样声明特定 Maven 或 Ivy 代码库: ``` allprojects { repositories { maven { url "https://repo.example.com/maven2" } maven { url "file://local/repo/" } ivy { url "https://repo.example.com/ivy" } } } ``` ### 查看依赖项树 * 某些直接依赖项可能会有其自己的依赖项。 这些依赖项称为传递依赖项。 Gradle 将会自动为您收集并添加这些传递依赖项,无需您手动逐一加以声明。 为直观地呈现您的项目的直接和传递依赖项,Android Plugin for Gradle 提供了一项 Gradle 任务,可为每个构建不同类型和测试源集生成依赖项树。 * 要运行该任务,请执行如下操作: >选择 View > Tool Windows > Gradle(或点击工具窗口栏中的 Gradle )。 展开 AppName > Tasks > android 并双击 androidDependencies。 Gradle 执行任务后,Run 窗口应随即打开以显示输出 #### 注入变量进入到manifest ``` android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] } ... } //manifest ... // build.gradle android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } } //Then you can insert the application ID in your manifest like this: ... //And the manifest result when you build the "free" product flavor is this: ... ``` ### 压缩资源 * 资源压缩只与代码压缩协同工作。代码压缩器移除所有未使用的代码后,资源压缩器便可确定应用仍然使用的资源。这在您添加包含资源的代码库时体现得尤为明显 - 您必须移除未使用的库代码,使库资源变为未引用资源,才能通过资源压缩器将它们移除。要启用资源压缩,请在 build.gradle 文件中将 shrinkResources 属性设置为 true(在用于代码压缩的 minifyEnabled 旁边)。例如: ``` android { ... buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ``` #### 多dex分包,当最小SDK为20以及以下的时候 [最小SDK为20以及以下的分包处理](https://developer.android.com/studio/build/multidex?hl=zh-CN) #### 从项目中移除私密签名信息 1. 在项目的根目录下创建一个名为 keystore.properties 的文件,并包含以下信息: ``` storePassword=myStorePassword keyPassword=myKeyPassword keyAlias=myKeyAlias storeFile=myStoreFileLocation ``` 2.在您的 build.gradle 文件中,按以下步骤操作来加载 keystore.properties 文件(必须在 android 代码块之前): ``` // Creates a variable called keystorePropertiesFile, and initializes it to the // keystore.properties file. def keystorePropertiesFile = rootProject.file("keystore.properties") // Initializes a new Properties() object called keystoreProperties. def keystoreProperties = new Properties() // Loads the keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { ... } ... ``` #### 与应用的代码共享自定义字段和资源值 * 在构建时,Gradle 将生成 BuildConfig 类,以便您的应用代码可以检查与当前构建有关的信息。您也可以使用 buildConfigField() 函数,将自定义字段添加到 Gradle 构建配置文件的 BuildConfig 类中,然后在应用的运行时代码中访问这些值。同样,您也可以使用 resValue() 添加应用资源值。 ``` android { ... buildTypes { release { // These values are defined only for the release build, which // is typically used for full builds and continuous builds. buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"") resValue("string", "build_time", "${minutesSinceEpoch}") ... } debug { // Use static values for incremental builds to ensure that // resource files and BuildConfig aren't rebuilt with each run. // If they were dynamic, they would prevent certain benefits of // Instant Run as well as Gradle UP-TO-DATE checks. buildConfigField("String", "BUILD_TIME", "\"0\"") resValue("string", "build_time", "0") } } } ... //应用中访问 ... Log.i(TAG, BuildConfig.BUILD_TIME); Log.i(TAG, getString(R.string.build_time)); ```