美文网首页
AndroidStudio之Gradle配置详解

AndroidStudio之Gradle配置详解

作者: Hank802 | 来源:发表于2019-11-04 10:38 被阅读0次

            Android Studio 是采用 Gradle 来构建项目的,Gradle 是一个非常先进强大基于Apache Ant和Apache Maven概念的项目自动化建构工具,它使用了一种基于 Groovy 领域的特定语言(DSL)来声明项目设置,语法简介、配置灵活。


    一、AndroidStudio中的Gradle文件

    如上图所示,创建一个AndroidStudio项目,会默认生成以下几个gradle文件:

    1、build.gradle(Project:GradleApplication):主工程配置,详见第二部分;

    2、build.gradle(Module:GradleApplication):Module配置,详见第三部分;

    3、gradle-wrapper.properties:用于在构建项目时决定使用哪个 Gradle 版本,内容如下图:

    distributionBase:Gradle压缩包解压后存储的主目录(可点击“File-Settings-Build,Execution,Deployment-Gradle”查看);

    distributionPath:Gradle压缩包解压后具体路径目录;

    zipStoreBase:Gradle压缩包存储的主目录;

    zipStorePath:Gradle压缩包具体存储的路径目录;

    distributionUrl: Gradle发行版压缩包的下载地址,AndroidStudio在线更新比较慢,所以建议通过该地址(Gradle官方下载地址:https://services.gradle.org/distributions/)下载后直接放到路径目录下重启AS即可;

    4、gradle.properties:用来配置全局键值对数据的,可用于存放敏感数据,比如签名密钥信息,如下图:

    5、setting.gradle:用于初始化以及工程树的配置的,放在根工程目录下;


    二、Project 下的build.gradle常用配置

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

    buildscript {

    repositories {

    //从Android Studio3.0后新增了google()配置,可以引用google上的开源项目

    google()

    //jcenter是由 bintray.com维护的Maven仓库,Android Studio早期版本使用的是mavenCentral(),后来切换到jcenter()了,因为jcenter在性能和占存储大小方面比mavenCentral更优;

     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

        }

    }

    //这里是项目本身需要的依赖,比如项目所需的maven库

    allprojects {

    repositories {

    google()

    jcenter()

    }

    }

    // 运行gradle clean时,执行此处定义的task任务,该任务继承自Delete,删除根目录中的build目录,相当于执行Delete.delete(rootProject.buildDir)。

    task clean(type: Delete) {

    deleterootProject.buildDir

    }


    三、Module下的build.gradle常用配置

    // 声明是Android程序,区别:前者可以直接运行,后着是依附别的应用程序运行,isBuildModule可定义在gradle.properties中

    if (isBuildModule.toBoolean()) {

    //com.android.application 表示这是一个应用程序模块,打包可得到APK

        applyplugin:'com.android.application'

    }else {

    //com.android.library 标识这是一个库模块,打包可得到AAR

        applyplugin:'com.android.library'

    }

    //android 闭包主要为了配置项目构建的各种属性

    android {

        //设置编译时用的Android版本

        compileSdkVersionrootProject.ext.android['compileSdkVersion']

       //设置编译时使用的构建工具的版本,Android Studio3.0后去除此项配置

        buildToolsVersionrootProject.ext.android['buildToolsVersion']

    defaultConfig {

     //项目最低兼容的版本

            minSdkVersionrootProject.ext.android['minSdkVersion']

    //项目的目标版本:被设置为大于或等于该系统平台的API版本时,才会生效。例如,若指定targetSdkVersion值为22,则表示该程序最高只在Android5.1版本上做过充分测试,在Android6.0系统上(对应targetSdkVersion为23)拥有的新特性如系统运行时权限等功能就不会被启用。

            targetSdkVersionrootProject.ext.android['targetSdkVersion']

            //版本号

            versionCoderootProject.ext.android['versionCode']

            //版本名称

            versionNamerootProject.ext.android['versionName']

           //版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了

            flavorDimensions"versionCode"

           //表明要使用AndroidJUnitRunner进行单元测试

            testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"

        }

    //buildTypes 闭包主要指定生成安装文件的主要配置,一般包含两个子闭包:

    //1、debug闭包,用于指定生成测试版安装文件的配置;

    //2、release闭包,用于指定生成正式版安装文件的配置;

    // 两者能配置的参数相同,最大的区别默认属性配置不一样

        buildTypes {

    release {//生产环境

    //BuildConfig是android studio在打包时自动生成的一个java类

    //在项目工程的build/generated/source/buildConfig/androidTest或debug或release中

    //三个参数:1.要定义的常量的类型 2.该常量的命名 3.该常量的值

    //定义完成后,rebuild项目,然后通过BuildConfig.常量名调用

                buildConfigField("boolean","LOG_DEBUG","false")//配置Log日志

                buildConfigField("String","URL_PERFIX","\"https://release.cn/\"")// 配置URL前缀

                minifyEnabledtrue//是否对代码进行混淆

                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'//指定混淆的规则文件

                signingConfig signingConfigs.release//设置签名信息

                zipAlignEnabledtrue//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率

                pseudoLocalesEnabledfalse//是否在APK中生成伪语言环境

                applicationIdSuffix'release'//给applicationId添加了后缀,根据需要选择是否添加

                versionNameSuffix'release'//给versionName添加后缀,根据需要选择是否添加

            }

    debug {//测试环境

                buildConfigField("boolean","LOG_DEBUG","true")//配置Log日志

                buildConfigField("String","URL_PERFIX","\"https://test.com/\"")// 配置URL前缀

                minifyEnabledfalse//是否对代码进行混淆

                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'//指定混淆的规则文件

                signingConfig signingConfigs.debug//设置签名信息

                debuggablefalse//是否支持断点调试

                jniDebuggablefalse//是否可以调试NDK代码

                renderscriptDebuggablefalse//是否开启渲染脚本就是一些c写的渲染方法

                zipAlignEnabledtrue//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率

                pseudoLocalesEnabledfalse//是否在APK中生成伪语言环境

                applicationIdSuffix'test'//给applicationId添加了后缀

                versionNameSuffix'test'//给versionName添加后缀

            }

    }

    //sourceSets 闭包用于配置目录指向:

        sourceSets {

    main {

               jniLibs.srcDirs = ['libs']//指定lib库目录

                if (isBuildModule.toBoolean()) {//组件化开发为Module指定不同的manifest

                    manifest.srcFile'src/main/debug/AndroidManifest.xml'

                }else {

                    manifest.srcFile'src/main/release/AndroidManifest.xml'

                }

    }

    }

    //signingConfigs 闭包用于签名配置,可把KEY信息定义在gradle.properties中

        signingConfigs {

        release {// 线上环境

                keyAlias'test'

                keyPassword'123456'

                storeFile file('test.keystore')

                storePassword'123456'

            }

    debug {// 开发环境

                keyAlias'test'

                keyPassword'123456'

                storeFile file('test.keystore')

                storePassword'123456'

            }

    }

    //packagingOptions闭包用于打包时的相关配置:

    //当项目中依赖的第三方库越来越多时,有可能会出现两个依赖库中存在同一个(名称)文件。

    //Gradle在打包时就会提示错误(警告),使用以下方法将重复的文件剔除,比较常用的是通过exclude去除重复的文件

        packagingOptions{

    // pickFirsts做用是当有重复文件时打包会报错,这样配置会使用第一个匹配的文件打包进入apk

    // 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时,只用第一个,这样打包就不会报错

            pickFirsts = ['META-INF/LICENSE']

    // merges当出现重复文件时,合并重复的文件然后打包入apk

    // 这个是有默认值得 merges = [] 这样会把默默认值去掉 ,所以我们用下面这种方式在默认值后添加

            merge'META-INF/LICENSE'

    //这个是在同时使用butterknife、dagger2做的一个处理。遇到类似的问题,只要根据gradle的提示,做类似处理即可。

            exclude'META-INF/services/javax.annotation.processing.Processor'

        }

    //productFlavors 闭包用于多渠道配置:通常在适配多个渠道的时候,需要为特定的渠道做部分特殊的处理,比如设置不同的包名、应用名等。

    //场景:当我们使用友盟统计时,通常需要设置一个渠道ID,那么我们就可以利用productFlavors来生成对应渠道信息的包

    //第一种配置方式

    //    productFlavors {

    //        wandoujia {}

    //        xiaomi {}

    //        _360 {}

    //        //...

    //    }

    //    productFlavors.all {

    //            //批量修改,类似一个循序遍历

    //        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]

    //    }

    //第二种配置方式

        productFlavors {

    //豌豆荚渠道包配置

            wandoujia {

    manifestPlaceholders = [UMENG_CHANNEL_VALUE:"wandoujia"]

    }

    //小米渠道包配置

            xiaomi {

    manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]

    }

    //360渠道包配置

            _360 {

    manifestPlaceholders = [UMENG_CHANNEL_VALUE:"_360"]

    }

    //等等

        }

    //lintOptions 闭包用于代码扫描分析配置

    //Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,

    // 同时提供一些解决方案,而且这个过程不需要我们手写测试用例。

    //Lint 发现的每个问题都有描述信息和等级(和测试发现 bug 很相似),我们可以很方便地定位问题,同时按照严重程度进行解决。程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关

        lintOptions {

            abortOnErrorfalse //即使报错也不会停止打包

            checkReleaseBuildsfalse  //打包release版本的时候进行检测

        }

    }

    //dependencies 闭包用于定义项目的依赖关系,一般项目都有三种依赖方式:本地依赖、库依赖和远程依赖。

    // 本地依赖可以对本地的jar包或目录添加依赖关系

    // 库依赖可以对项目中的库模块添加依赖关系

    // 远程依赖可以对jcener库上的开源项目添加依赖关系

    // 从Android Studio3.0后compile引入库不在使用,而是通过api和implementation,

    // api完全等同于以前的compile,用api引入的库整个项目都可以使用,

    // 用implementation引入的库只有对应的Module能使用,其他Module不能使用,由于之前的项目统一用compile依赖,导致的情况就是模块耦合性太高,不利于项目拆解,使用implementation之后虽然使用起来复杂了但是做到降低偶合兴提高安全性。

    dependencies {

    //本地jar包依赖,表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径当中

    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'

    //声明测试用例库,AndroidJUnitRunner单元测试

    //详见:https://developer.android.google.cn/reference/android/test/AndroidTestRunner.html

    androidTestImplementation'androidx.test:runner:1.2.0'

    //声明测试用例库,Android官方提供的一个UI测试框架,适合应用中的功能性 UI 测试

    //详见:https://developer.android.google.cn/reference/android/support/test/espresso/Espresso

    androidTestImplementation'androidx.test.espresso:espresso-core:3.2.0'

    }

    相关文章

      网友评论

          本文标题:AndroidStudio之Gradle配置详解

          本文链接:https://www.haomeiwen.com/subject/hpdlbctx.html