Android开发:build.gradle 配置指南

前言

做为Android开发,咱们几乎天天都在和builg.gradle打交道,可是你真的知道build.gradle里的每一行代码有什么用吗?以及builg.gradle到底有哪些做用?本文旨在全面的向你们介绍builg.gradle的做用与使用方法。android

通用配置

在咱们新建项目时,Android Studio 会自动为咱们生成两个build.gradle文件,一个位于根目录,一个位于app文件夹下,下面是gradle文件的构成图:bash

MyApp
 ├── build.gradle
 └── app
       └── build.gradle
复制代码

根目录的build.gradle

该gradle文件是定义在这个工程下的全部模块的公共属性,它默认包含两个个方法:app

buildscript {//这里是gradle脚本执行所需依赖,分别是对应的maven库和插件

    repositories {
        google()//能够引用google上的开源项目
        jcenter()//声明了jcenter()配置,能够引用 jcenter 上的开源项目
    }
    dependencies {
         //此处是 android 的插件 gradle 及其版本号
        classpath 'com.android.tools.build:gradle:3.5.0'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    //这里是项目自己须要的依赖,好比项目所需的 maven 库
    repositories {
        google()
        jcenter()
        
    }
}

// 这是一个 task 任务,执行 clean project 时执行此 task。能够理解为一个函数
// 该任务继承自 Delete,删除根目录中的 build 目录。
// 至关于执行 Delete.delete(rootProject.buildDir)。
task clean(type: Delete) {
    delete rootProject.buildDir
}
复制代码

buildscript 方法是定义了全局的相关属性,repositories 定义了 jcenter 做为仓库。一个仓库表明着你的依赖包的来源,例如 maven 仓库。dependencies 用来定义构建过程。实际开发时,缺乏某些仓库来源是会出错的,我记得还有一次是google()、jcenter()两个顺序致使的问题,具体记不清了,之后再遇到再更新~maven

allprojects 方法能够用来定义各个模块的默认属性,你能够不单单局限于默认的配置,将来你能够本身创造 tasks 在 allprojects 方法体内,这些 tasks 将会在全部模块中可见。函数

app文件夹下的build.gradle文件

// 声明是Android程序,
//com.android.application 表示这是一个应用程序模块
//com.android.library 标识这是一个库模块
//而这区别:前者能够直接运行,后者只能被导入别的应用做为一个模块。
apply plugin: 'com.android.application'

android {//配置项目构建的各类属性
    compileSdkVersion 29 //编译时使用 Android版本
    buildToolsVersion "29.0.1" //编译时使用的构建工具的版本
    defaultConfig {
        applicationId "com.skyworth.myapplication" //项目包名
        minSdkVersion 23 //最低兼容Android版本
        targetSdkVersion 29 //目标版本
        versionCode 1 //版本号
        versionName "1.0" //版本名
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //代表要使用AndroidJUnitRunner进行单元测试
    }
    buildTypes {// 自动化打包配置
        release {
            minifyEnabled false //是否混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  //混淆用的规则文件
        }
    }
}

dependencies {
    //各类依赖,包括本地的jar包
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
复制代码

以上就是咱们最多见的常规配置,可是每每咱们都有更复杂的需求,下面简单介绍几个常见的问题及其解决代码。工具

如何修改编译生成的 apk 的名字?

通常状况下,默认配置生成的 apk 文件名叫作app-debug.apk。可是咱们在开发中为了方便最好是要对这些 apk 进行区分命名的,下面代码就是为咱们生成 apk 进行了合理的命名。例如:HelloWorld_1.0_debug.apk,由 APP 名称 + 版本号 + 签名名称 组成。单元测试

// 设置apk的名称
android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        outputFileName ="LocalMedia_${defaultConfig.versionName}_${variant.name}.apk"
    }
}
复制代码

遇到依赖冲突怎么办?

当项目中依赖的第三方库愈来愈多时,有可能会出现两个依赖库中存在同一个(名称)文件。若是这样,Gradle 在打包时就会提示错误(警告)。那么就能够根据提示,而后使用如下方法将重复的文件剔除,比较经常使用的是经过 exclude 去除重复的文件,例如:测试

defaultConfig {
        //省略
        packagingOptions {
            exclude "lib/mips/libRSSupport.so"
            exclude 'lib/arm64-v8a/libRSSupport.so'
            exclude 'lib/armeabi-v7a/librsjni.so'
            exclude 'lib/x86/libRSSupport.so'
            exclude 'lib/x86_64/libRSSupport.so'
            exclude 'lib/armeabi-v7a/libRSSupport.so'
            exclude 'lib/arm64-v8a/librsjni.so'
            exclude 'lib/x86/librsjni.so'
            exclude 'lib/x86_64/librsjni.so'
        }
    }
复制代码

如何多渠道配置?

这个配置是常常会使用到的,一般在适配多个渠道的时候,须要为特定的渠道作部分特殊的处理,好比设置不一样的包名、应用名等。场景:当咱们使用友盟统计时,一般须要设置一个渠道ID,那么咱们就能够利用productFlavors来生成对应渠道信息的包,如:gradle

android { 
    productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            applicationId "com.wiky.gradle.xiaomi" //配置包名

        }
        huawei {
            manifestPlaceholders =[UMENG_CHANNEL_VALUE:"huawei"]
        }
        //...
    } 
}

复制代码
相关文章
相关标签/搜索