了解Android Studio中构建Gradle文件的初学者指南
#初学者 #kotlin #android #gradle

构建gradle文件(settings.gradle/.kts,build.gradle/.kts和gradle.properties)在Android Studio中用于初学者

Build Gradle是Android Studio中用于构建Android应用程序的构建工具。它可以写在Groovy scriptKotlin script(KTS)中。 KTS比Groovy更新,最终将取代Groovy。

构建Gradle的高级功能

  1. 读取应用程序的构建配置/脚本 s(settings.gradle/settings.gradle.kts and build.gradle/build.gradle.gradle.kts)

  2. 下载和caches应用程序的依赖项从您在settings.gradle/settings.gradle.kts

  3. 中指定的存储库中
  4. 将应用程序的源代码(Java或Kotlin)编译到Java字节码中,然后是Dalvik Bytecode。

  5. 将dalvik字节码和资源包装到APK(Android软件包)或Android App Bundle

要执行上面的所有这些功能,需要以下Gradle构建配置/脚本文件

  • settings.gradle/setings.gradle.kts(root Directory)

  • build.gradle/build.gradle.kts(root Directory)

  • gradle。属性(根目录)

  • build.gradle/build.gradle.kts(模块目录 - 例如App Directory)

下面的所有代码示例基于Kotlin脚本(KTS)。

settings.gradle/settings.gradle.kts

settings.gradle/settings.gradle.kts的主要目的是提供存储库,这些存储库指定您的应用程序所需的插件和依赖项。

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()

        maven ("https://jitpack.io")
    }
}
rootProject.name = "New Empty Compose App"
include ("app")

插件管理

它配置了可以从gradlePluginPortal()google()mavenCentral()解析/下载插件的存储库。所有这些都是设置存储库位置的函数调用。

什么是插件?插件为build.gradle/build.gradle.kts提供任务/函数以构建您的android应用

  • gradlePluginPortal()设置了位于plugins.gradle.org的存储库。 Kotlin Android插件org.jetbrains.kotlin.android)是此存储库中提供的示例。 ca

  • google()设置了位于maven.google.com的存储库。 Android应用程序项目插件(com.andoird.application)和 Android Library Project 插件(com.android.library)是此存储库中提供的2个常见插件。

  • mavenCentral()设置了位于repo.maven.apache.org的存储库,该存储库是一个流行的存储库。大多数应用程序可能不需要这个,但是将其留在这里是一个很好的做法。

  • maven()设置自定义存储库。在上面的示例中,https://jitpack.io是自定义存储库。要添加另一个自定义存储库,只需使用自定义存储库URL再次致电maven()

依赖解决方案管理

它配置了您的代码可以从中下载和解析库的存储库。例如,您的代码使用某些库,这些库的源代码在这些存储库中托管。

什么是依赖性?依赖项是您import作为源代码中的软件包的库。

  • repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)告诉Gradle如果有任何特定于项目的存储库,则使构建失败。这是为了防止另一个如果他/她没有正确的本地存储库设置,可能无法构建该项目的开发人员。

  • 与插件相同,google()设置了maven.google.com存储库,而mavenCentral()设置了repo.maven.apache.org存储库。它们没有提供插件任务,而是为您的代码提供依赖关系(库)。

    androidx。*(Android JetPack库)是托管在google()存储库中的库的示例。您可能无法删除mavenCentral(),因为它与google()存储库高度耦合。

rootproject。姓名

这是您的根项目名称,可以是任何名称。

包括()

这包括您想要构建的子标记/模块。通常,app模块很常见。如果您已经实现了本地库,则也在此处包括它们。

你可以做这个

include ("app", "buildutils")


include ("app")
include ("buildutils")

build.gradle / build.gradle.kts(root / project)

这定义了所有模块使用的核心插件。

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

如果您不知道,这里的功能是infix notation。它可以作为
重写

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

我认为这更容易理解。

  • id()-插件唯一ID

  • version()-插件版本

  • apply()-在此项目级别应用此插件。

    通常,您不会在根项目级别上应用插件。您将插件应用于模块级别。

  • com.android.application-插件构建android应用程序(例如默认应用模块)

  • com.android.library-插件构建android库

    ,如果您不构建Android库,则可以将其删除,但在此处保留

    没有损害
  • org.jetbrains.kotlin.android-插件以启用项目中的Kotlin支持。

gradle。属性(根 /项目)

“gradle。properties”文件用于定义gradle构建脚本的属性和全局变量。以下是一些典型的例子:

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
kotlin.code.style=official
android.nonTransitiveRClass=true
  • -Xmx2048m-将最大堆大小设置为Java虚拟机的2048m字节

  • Dfile.encoding=UTF-8-将编码的文件设置为UTF -8

  • android.useAndroidX=true-使用较新的Android支持库,即Androidx

  • kotlin.code.style=official-在编译和格式化Kotlin代码

  • 时执行“官方” Kotlin代码指南
  • android.nonTransitiveRClass=true-告诉Android构建工具为您的项目生成非传递R类。

    r类包含对所有资源(例如图像,布局和字符串)

    的引用

    传递r类表示它在您的代码依赖的所有库/模块中包括对所有资源的参考。

    非传递R类仅包含对项目中使用的资源的引用。因此,它大大降低了应用程序包大小。

build.gradle/build.gradle.kts(应用模块)

这是一个示例build.gradle/.kts在应用模块中,该模块由plugins {}android {}dependencies {}块组成。

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

android {
    namespace = "vtsen.hashnode.dev.newemptycomposeapp"
    compileSdk = 33

    defaultConfig {
        applicationId = "vtsen.hashnode.dev.newemptycomposeapp"
        minSdk = 21
        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_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.3"
    }
    packagingOptions {
        resources {
            excludes.add("/META-INF/{AL2.0,LGPL2.1}")
        }
    }
}

dependencies {
    /*...*/
    implementation("androidx.compose.material3:material3:1.1.0-alpha04")
    /*...*/
}

所有这些块(例如plugins {}android {}dependencies {}等)都是使用trailing lambdafunction literal with receiver实施的域特定语言(DSL)。

插件{}块

类似于root项目中的build.gradle/.kts,这在此模块中应用了插件。它不需要明确调用version(),因为它已经在Root Project中指定了。 apply(true)也不需要,因为默认情况下它是真的。

android {}块

这定义了特定于Android平台的属性。

  • namespace-该项目的名称空间,所有生成的代码均基于此命名空间。

  • compileSdk -Gradle使用API​​级别来编译您的应用程序(通常与targetSdk)

  • 相同

DefaultConfig {}块

这指定了项目的默认配置。

  • applicationId-用于在设备或Google Play商店中标识您的应用的唯一ID。

  • minSdk-应用程序运行所需的最低API级

  • targetSdk- API级别该应用程序的设计和测试(通常与compileSdk相同)

可以在此处找到有关 minSdk targetSdk compileSdk 的更多信息。

  • versionCode-代表您应用程序版本

  • 的整数值
  • versionName-代表应用程序的用户可见版本的字符串值。它可以是任何字符串,但通常基于版本格式。它不需要匹配版本代码。

  • testInstrumentationRunner-指定库以运行仪器测试

  • vectorDrawable -set“ useupportlibrary = true” 启用对矢量的应用程序

buildTypes {}块

这使您可以为应用程序定义不同的构建配置。默认情况下,已经有发布和调试构建变体。您可以通过在此buildTypes {}块中调用release {}debug {}来覆盖默认值。

设置一个新项目时,这里有一些默认的版本构建变体构建配置。从技术上讲,您不需要它,我想它是您的参考。

  • isMinifyEnabled-当将其设置为true时,它可以在构建过程中启用代码缩小和混淆(即代码优化),从而降低了应用程序大小。

  • proguardFiles-指定在构建过程中使用用于优化代码的proguard规则文件。

    “ proguard-android-optimize.txt” 是专门用于构建Android应用的默认代码优化规则。

    “ proguard-rules。pro”是您可以应用的自定义proguard规则。

编译{}块

这指定了与编译Java代码有关的选项。

  • sourceCompatiblity-指定您的代码使用的Java版本。

  • targetCompatiblity-指定您的代码将在上执行的Java运行时版本。

kotlinoptions {}块

这指定了与编译Kotlin代码有关的选项。

  • jvmTarget-指定您的代码将被编译的Java虚拟机(JVM)版本。简而言之,它将您的代码编译到与您指定的JVM版本兼容的字节代码。

如果您在此处未指定任何编译 / kotlin选项,则将使用默认值,对于构建Gradle插件的不同版本可能会有所不同。< / p>

从技术上讲,JVM适用于桌面应用。对于Android应用程序,运行时称为Dalvik虚拟机(DVM),已被Android Runtime(ART)代替。

如果您对Android应用的Kotlin编译过程感到好奇,则可以阅读本文。

buildfeatures {}块

这是特定于Android构建系统的,它允许您启用某些功能。

  • compose-设置此true启用JetPack组合,默认情况下关闭。

composeoptions {}块

这指定与JetPack组成汇编有关的选项

  • kotlinCompilerExtensionVersion-指定组合编译器版本

包装{}块

这指定了某些资源以排除在Android软件包-APK或Android Bundle文件中。

  • resources-指定包装过程中应处理的资源集

    在上面的示例中,它不包括以下许可证文件:

    • */meta-inf/al2.0

    • */meta-inf/lgpl2.1

    目的是减少Android包装文件大小。

依赖项{}块

这声明需要您的代码的依赖关系/库。

  • implementation-指定应包含在Android软件包(APK/ Android Bundle)中的库版本。

如果您在Android项目中没有使用的依赖项,则最好将其删除。这可以帮助减少Android软件包(APK/ Android捆绑包)的大小并改善构建时间。

结论

好吧,构建Gradle文件似乎有些复杂,尤其是对于初学者而言。如果您挖得更深一些,那就不难理解了。所有构建脚本示例均取自此基本的Jetpack Compose app template,它是Android Studio中新项目生成的空酸化的清理版本。


最初出版于https://vtsen.hashnode.dev