Android开发之gradle入门与小技巧

所属分类:Android | 发布于 2023-12-16 15:10:14

1、Gradle是什么

Gradle是新一代的自动化构建工具,一个基于JVM的构建工具,它是一个独立的项目,跟Android、Android Studio无关。

构建工具就是对你的项目进行编译运行签名打包依赖管理等一系列功能集合。

构建工具还有Maven和Ant,这类都是基于xml来进行描述的。而Gradle采用了一种叫Groovy的语言,语法跟Java语法类似,而且在Java基础上做了不少改进,用起来更加简洁、灵活。

Gradle的推出主要以Java应用为主,当然目前还支持Android、C、C++。

2、AGP(Android Gradle Plugin)

Gradle跟Android Studio其实没什么关系,但是Gradle官方还是很看重Android开发的,Google推出Android Studio的时候选中了Gradle作为构建工具,为了支持Gradle能在Android Studio上使用,Google做了个Android Studio的插件叫Android Gradle Plugin(AGP),这就是我们能在Android Studio上使用Gradle的原因。

在项目的Project Structure中可以看到Gradle版本Android Gradle Plugin版本

3、相关文档

1、Gradle用户手册:https://docs.gradle.org/current/userguide/userguide.html

2、Kotlin DSL Primer:https://docs.gradle.org/current/userguide/kotlin_dsl.html

3、Android Gradle Plugin:https://developer.android.com/studio/build/extend-agp

4、Groovy迁移到KTS(讲述语法差异):https://developer.android.com/studio/build/migrate-to-kts

4、gradle配置文件

├── app
│   ├── build.gradle.kts // 模块gradle配置文件
│   ├── proguard-rules.pro
│   └── src
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── build.gradle.kts // 项目gradle配置文件
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle.kts

4.1、根目录下的build.gradle.kts是Top-level配置选项,项目下所有的子项目和模块通用。

4.2、每一个Module或Library下面都必须有自己的build.gradle.kts,这个是针对模块或Library的配置。

4.3、项目build.gradle.kts基本结构

plugins {
    id("com.android.application") version "8.1.3" apply false
    id("com.android.library") version "7.4.1" apply false
    id("org.jetbrains.kotlin.android") version "1.8.10" apply false
}

4.4、模块build.gradle.kts基本结构

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.wenge365.wengewrold"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.wenge365.wengewrold"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.3"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}

dependencies {

    implementation("androidx.core:core-ktx:1.9.0")
    // 其它依赖项...

}

 

5、gradle配置知识点

5.1、插件plugins{} 闭包

在使用Gradle版本目录时应用插件

// Top-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application) apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application)
   ...
}

在不使用Gradle版本目录时应用插件

// Top-level build.gradle.kts file
plugins {
   id("com.android.application") version '7.3.0' apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   id("com.android.application")
   ...
}

配置插件扩展信息

// build.gradle.kts
plugins {
    jacoco
}

jacoco {
    toolVersion = "0.8.1"
}

5.2、构建类型buildTypes{ } 闭包

在Kotlin DSL中,调试debug和发布release类型是隐式提供的。所有其他自定义build类型都必须手动创建。如下,创建benchmark类型

buildTypes {
 debug {
   ...
 }

 release {
   ...
 }
 register("benchmark") {
    ...
 }
}

5.3、风味productFlavors{ }闭包

profuctFlavor翻译过来是风味,是指针对不同场景进行不同配置,每一种场景都有自己的风味。

国外常用的配置场景是一个app分为free免费版和收费paid收费版本,国内一般用来做多渠道打包配置。

可以同时定义多个维度多个场景,下面就是根本支持api的最小版本和功能特点两个维度定义的风味。

android {
    ...
    // Specifies the flavor dimensions you want to use. The order in which you
    // list each dimension determines its priority, from highest to lowest,
    // when Gradle merges variant sources and configurations. You must assign
    // each product flavor you configure to one of the flavor dimensions.
    flavorDimensions 'api', 'version'

    productFlavors {
        demo {
            // Assigns this product flavor to the 'version' flavor dimension.
            dimension 'version'
            ...
        }

        full {
            dimension 'version'
            ...
        }

        minApi24 {
            // Assigns this flavor to the 'api' dimension.
            dimension 'api'
            minSdkVersion '24'
            versionNameSuffix "-minApi24"
            ...
        }

        minApi21 {
            dimension "api"
            minSdkVersion '21'
            versionNameSuffix "-minApi21"
            ...
        }
    }
}

6、gradle配置实战

6.1、根据构建类型自定义App名称,接口地址

构建类型可以理解为开发环境,默认的有release和debug两种,上面讲到了,debug模式是隐式的。

android { 
   buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            buildConfigField("String", "API_URL", "\"https://api.wg.com/api\"")
            manifestPlaceholders["appLabel"] = "@string/appLabel"
        }
        debug {
            applicationIdSuffix = ".debug"
            versionNameSuffix = "-debug"
            buildConfigField("String", "API_URL", "\"https://apitest.wg.com/api\"")
            manifestPlaceholders["appLabel"] = "@string/appDevLabel"
        }
    }
    buildFeatures {
        compose = true
        buildConfig = true
    }
}

a、debug的applicationIdSuffix增加.debug后缀

b、debug的versionNameSuffix增加-debug后缀

c、使用buildConfigField方法增加API_URL的定义,在App内使用BuildConfig.API_URL调用,注意:要在buildFeatures里面设置buildConfig值为true

d、给manifestPlaceholders增加appLabel字段,因为项目是多语言的,所以值是@string

d1. 在strings.xml中增加appLabel和appDevLabel,此处可做多语言。

<string name="appLabel">WengeWorld</string>
<string name="appDevLabel">WengeWorldDev</string>

d2. 更改AndroidManifest.xmlapplication节点的android:label属性的值。

更改前:android:label="@string/app_name"

更改后:android:label="@string/appLabel"

 

 

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接