Android gradle简介

1,698 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

gradle简介

我们已经新建了一个Android应用工程后,可以看到有好几个gradle文件。本文来简要介绍工程中的gradle文件。

本文将会介绍如下3个gradle文件

Toturial2020
├── build.gradle
├── settings.gradle
└── app
    └── build.gradle

项目配置文件 settings.gradle

对于Toturial2020项目来说,settings.gradle内容如下

include ':app'

这里面的:app就是我们正在用的App模块。看到这里朋友也能明白了,一个工程中可以有多个模块。 如果项目中有多个模块,settings.gradle内容如下

include ':app', ':FisherView', 'uijoystick'

上面是另一个工程settings.gradle文件。 可以看到里面有3个模块。

最外层的构建文件

这里指的是与settings.gradle同目录的build.gradle文件。我们也可以叫它“项目gradle文件”。 这个文件能对工程中所有的模块进行配置。

Toturial2020的项目gradle文件目前是这样的。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

里面指明了远程仓库有google和jcenter。 并且它包含一个清除任务(task)clean,实际上执行任务会把build目录删除掉。

未来我们要用到一些第三方库的时候,可能会修改这个文件,添加一些配置进去。具体修改要看第三方库的要求。 比如aboutView项目的gradle文件。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

里面用到了一个插件gradle-bintray-plugin,这个是之前用来上传模块用的。

app的gradle

app的gradle指的是app/build.gradle文件。这个文件配置了app模块用到的东西。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.rustfisher.tutorial2020"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 1
        versionName "1.0.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation 'androidx.recyclerview:recyclerview:1.1.0'
}

第一行apply plugin应用了Android应用插件。 Android插件由Google团队开发维护。该插件提供构建,测试,打包应用和模块需要的所有的task。

compileSdkVersion和buildToolsVersion都指定为29。查看as的SDK Manager可以管理SDK具体版本。 对于我们的小工程来说,buildToolsVersion尽可能跟上Google发布的最新版本。

下面是android配置区域。

defaultConfig

defaultConfig区域对app核心进行配置,会覆盖AndroidManifest.xml中的配置。

applicationId指定了app的应用ID。一般来说这个字符串和AndroidManifest.xml中的package一致。 它们也可以不一致,系统会以gradle的applicationId为准。

minSdkVersion指的是支持到的最老最旧的Android API版本。19对应的是KitKat。 targetSdkVersion指的是当前的目标SDK版本。

versionCode是版本号。大的版本号可以覆盖小的版本号。 versionName是版本名。它是一个字符串,系统并不会根据它来判断版本的新旧。

testInstrumentationRunner指定的是单元测试的运行器。

buildTypes

编译配置区域。 可以看到默认会有一个release区块。它配置的是发布(release)版本。

minifyEnabled 表示打包时会启用优化功能。具体使用的是ProGuard的混淆和优化功能。 优化功能需要proguardFiles的配合。它指定了混淆的配置信息。 一般来说发布版我们会启用minifyEnabled。开发版则不启用这个功能。

这里能配置多种多样的定制打包信息。多渠道打包大都在这里进行配置。

dependencies

app模块使用到的库,或者说是“依赖”。

implementation后面指定库的名称和版本。

implementation 'androidx.appcompat:appcompat:1.1.0'

使用版本是1.1.0

用到第三方库的时候,一般会有声明,教使用者如何引入这个库。