【gradle】gradle介绍

plugin 插件引用

在 Gradle 构建脚本中,plugins 块用于声明和应用插件。插件可以扩展 Gradle 的功能,提供特定的任务和配置。例如,Android 插件、Java 插件、Kotlin 插件等。

基本语法

旧语法:
apply plugin: 'plugin-id'

新语法:Gradle 4.10 及更高版本推荐使用 plugins 块来应用插件,因为它提供了更好的插件版本管理和错误检查。
plugins {
    id 'plugin-id' version 'plugin-version'
}

id:插件的标识符。
version:插件的版本号。

示例

Android应用插件

plugins {
    id 'com.android.application' version '7.0.0'
}

应用application插件,这个插件提供了构建和打包 Android 应用所需的任务和配置。本声明表明gradle管理的模块将编译成Android应用。

Android库插件

plugins {
    id 'com.android.library' version '7.0.0'
}

用于声明本gradle管理的模块将编译成Android aar 库。

Java插件

plugins {
    id 'java'
}

Kotlin插件

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.5.21'
}

android块

用于配置 Android 项目,包括编译 SDK 版本、构建工具版本、默认配置和构建类型。

示例

android {
    compileSdkVersion 33 // 指定编译时使用的 Android SDK 版本
    buildToolsVersion "30.0.2" // 指定构建工具的版本
    ndkPath System.getenv("ANDROID_NDK_HOME") // 通过系统环境变量获取ndk 路径

    defaultConfig {
        applicationId "com.example.myapp" // 用于指定 Android 应用的唯一标识符。这个标识符在整个应用的生命周期中保持不变,并且在应用发布到 Google Play 商店时也会使用。
        minSdkVersion 28 // 指定应用的最低支持 SDK 版本
        targetSdkVersion 33 // 指定应用的目标 SDK 版本
        versionCode 1 // 指定应用的版本代码
        versionName "1.0" // 指定应用的版本名称。

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 指定用于运行测试的测试运行器
        consumerProguardFiles "consumer-rules.pro" // 如果本gradle管理的模块编译成库,使用该项声明本库被使用时将按照 此ProGuard 文件定义的规则进行混淆
    }

    sourceSets { // 配置代码源路径
        main {
            java.srcDirs = ['src/main/java', 'src/main/aidl'] // 代码源文件
            res.srcDirs = ['src/main/res'] // 资源源文件
            aidl.srcDirs = ['../SDK/src/main/aidl'] // aidl源文件
            assets.srcDirs = ['src/main/assets', 'src/main/ecc/output'] // 资产源文件
            manifest.srcFile 'src/main/AndroidManifest.xml'
        }
    }

    buildTypes { // 配置构建类型
        release { // 发布构建类型
            minifyEnabled false // 禁用代码混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 指定 ProGuard 混淆文件
            signingConfig signingConfigs.release // 使用 release 签名配置
        }
        debug { // 发布调试类型
            minifyEnabled false // 禁用代码混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 指定 ProGuard 混淆文件
        }
    }

    signingConfigs { // 签名配置
        release {
            keyAlias 'platform'
        }
    }

    // 用于配置 DEX 编译器的选项。DEX 编译器将 Java 字节码转换为 Android 可执行文件(DEX 文件),这些文件可以在 Android 设备上运行。通过配置 dexOptions,你可以优化 DEX 编译过程,控制内存使用,添加额外的编译参数等。
    dexOptions {
        preDexLibraries = false // 是否在构建过程中预先编译库。设置为 false 可以在某些情况下减少构建时间,特别是在增量构建时。
        additionalParameters = ['--core-library'] // 传递给 DEX 编译器的额外参数。在这个例子中,--core-library 参数允许使用核心库的类。
        javaMaxHeapSize "6144m" // 设置 DEX 编译器的最大堆内存大小。在这个例子dexOptions 块用于配置 DEX 编译器的选项。DEX 编译器将 Java 字节码转换为 Android 可执行文件(DEX 文件),这些文件可以在 Android 设备上运行。通过配置 dexOptions,你可以优化 DEX 编译过程,控制内存使用,添加额外的编译参数等。增加堆内存大小可以在处理大型项目时避免内存不足错误。
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8 // 指定源代码的兼容性版本。即,编译器将按照这个版本的 Java 语法和 API 来编译源代码,源代码将按照 Java 1.8 的语法和 API 编译。
        targetCompatibility JavaVersion.VERSION_1_8 // 指定生成的字节码的兼容性版本。即,编译器将生成与这个版本的 Java 虚拟机(JVM)兼容的字节码,生成的字节码将与 Java 1.8 兼容。
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies 块

在 Gradle 构建脚本中,dependencies 块用于声明项目的依赖项。依赖项可以是本地文件、远程库、其他项目模块等。通过声明依赖项,Gradle 会自动下载和管理这些库,使其在编译和运行时可用。

依赖项类型

implementation:编译时和运行时依赖项,推荐用于大多数情况。
api:编译时和运行时依赖项,且会暴露给依赖此模块的其他模块。
compileOnly:仅在编译时可用,运行时不可用。
runtimeOnly:仅在运行时可用,编译时不可用。
testImplementation:仅在测试编译和运行时可用。
androidTestImplementation:仅在 Android 仪器测试编译和运行时可用。

示例

dependencies {
    // 编译时和运行时依赖项
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.code.gson:gson:2.8.8'

    // 仅在编译时可用
    compileOnly 'org.projectlombok:lombok:1.18.20'

    // 仅在运行时可用
    runtimeOnly 'org.postgresql:postgresql:42.2.20'

    // 测试编译和运行时依赖项
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.mockito:mockito-core:3.11.2'

    // Android 仪器测试依赖项
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    // 本地文件依赖项
    implementation files('libs/some-local-lib.jar')

    // 本地jar包或者aar依赖项
    implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

    // 项目模块依赖项
    implementation project(':some-other-module')

    // 仅在编译时可用的本地文件
    compileOnly files(project.bundleDir + '/magic-system/magic-system/magic-system_apis-36/libs/magic-system.jar')
}

注意事项

依赖冲突:如果不同的依赖项之间存在版本冲突,Gradle 会尝试解决冲突,但有时需要手动指定版本。
依赖管理:可以使用 implementation 和 api 来管理依赖项的可见性,implementation 依赖项不会暴露给依赖此模块的其他模块,而 api 依赖项会暴露。
本地文件:使用 files 方法可以添加本地文件作为依赖项,但建议尽量使用远程库,以便于依赖管理和版本控制。

混淆

consumerProguardFiles 是 Gradle 构建脚本中的一个配置项,用于指定 ProGuard 配置文件,这些文件将在库模块被消费时应用。也就是说,当你的库被其他应用或库依赖时,这些 ProGuard 规则将被应用到最终的应用程序中。

作用

保护库代码:通过混淆和优化,保护库代码不被反编译。
保持必要的类和方法:确保库中的某些类和方法在混淆过程中不会被移除或重命名,以保证库的正常运行。

解析

  1. consumerProguardFiles “consumer-rules.pro”:
    指定一个 ProGuard 配置文件 consumer-rules.pro,该文件中的规则将在库被消费时应用。

  2. proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’:
    在 release 构建类型中,指定 ProGuard 配置文件用于代码混淆和优化。
    getDefaultProguardFile(‘proguard-android-optimize.txt’):使用 Android 提供的默认 ProGuard 配置文件。
    ‘proguard-rules.pro’:使用自定义的 ProGuard 配置文件。

consumer-rules.pro 示例

# 保持所有公共类和方法
-keep public class * {
    public *;
}

# 保持特定的类和方法
-keep class com.example.mylibrary.MyClass {
    public void myMethod();
}

# 混淆库中的所有类和方法
-obfuscate

签名配置

signingConfigs 块用于配置 Android 应用的签名信息。签名是 Android 应用发布和安装的必要步骤。每个 Android 应用在发布之前都需要使用一个密钥进行签名,以确保应用的完整性和来源的可信度。

语法

android {
    ...
    signingConfigs {
        release {
            keyAlias 'platform'
            keyPassword 'your_key_password'
            storeFile file('path/to/your/keystore.jks')
            storePassword 'your_store_password'
        }
    }
    ...
}

解释:
signingConfigs:用于定义签名配置。
release:定义一个名为 release 的签名配置。
keyAlias:密钥别名,用于标识密钥库中的特定密钥。
keyPassword:密钥密码,用于访问密钥。
storeFile:密钥库文件的位置。
storePassword:密钥库密码,用于访问密钥库。

注意事项

安全性:不要将密钥密码和密钥库文件路径硬编码在 build.gradle 文件中。可以使用环境变量或 Gradle 属性文件来管理这些敏感信息。
密钥库文件:确保密钥库文件路径正确,并且文件存在。
签名配置:在 buildTypes 块中,使用 signingConfig 指定要使用的签名配置。

使用环境变量

signingConfigs {
    release {
        keyAlias System.getenv('KEY_ALIAS')
        keyPassword System.getenv('KEY_PASSWORD')
        storeFile file(System.getenv('STORE_FILE'))
        storePassword System.getenv('STORE_PASSWORD')
    }
}

使用Gradle属性文件

在项目根目录下创建一个 gradle.properties 文件,并添加以下内容:
KEY_ALIAS=platform
KEY_PASSWORD=your_key_password
STORE_FILE=path/to/your/keystore.jks
STORE_PASSWORD=your_store_password

然后在 build.gradle 文件中使用这些属性:

signingConfigs {
    release {
        keyAlias project.KEY_ALIAS
        keyPassword project.KEY_PASSWORD
        storeFile file(project.STORE_FILE)
        storePassword project.STORE_PASSWORD
    }
}
  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值