android gradle配置详解

AppExtension类及其属性

可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候,经常看到它,它是什么呢?

如果你按ctrl+鼠标左键对着android{},点击进去就知道了,其实android{…}表示的就是AppExtension这个类。

如图:

我们再来看看AppExtension继承关系:

除了AppExtension之外还有2个类与之相似,LibraryExtension和TestExtension

如果是module项目作为lib使用,那么lib下的build.gradle中的android对应的是LibraryExtension


AppExtension的属性

  • aaptOptions:aapt是一个可以将资源文件编译成二进制文件的工具。aaptOptions表示aapt工具设置的可选项参数。
  • adbExecutable:adb从编译sdk时执行
  • adbOptions:adb的可选项参数
  • applicationVariants:应用变体列表
  • ==buildToolsVersion==:构建工具版本(必要的)
  • buildTypes:构建类型(一般是release和debug,还可以自定义)
  • compileOptions:编译可选项参数
  • ==compileSdkVersion==:编译sdk版本(必要的)
  • dataBinding:Data Binding可选项参数(关于DataBinding的使用)
  • defualtConfig:默认配置,对于所有的打包项目
  • defualtPublishConfig:默认是release。使用参考
  • dexOptions:Dex可选项参数。
  • externalNativeBuild:native编译支持。参考
  • flavorDimensionList:
  • generatePureSplits:是否拆成多个APK
  • jacoco:JaCoCo可选项参数
  • lintOptions:Lint工具可选项参数
  • ndkDirectory:ndk目录(一般在local.properties中)
  • packagingOptions:packaging的可选参数
  • productFlavors:项目所有flavor
  • publishNonDefualt:不仅仅使用默认的publish artifacts。可参考defualtPublishConfig。
  • resourcePrefix:创建新资源时使用的前缀。
  • sdkDirectory:sdk目录(一般在local.properties中)
  • signingConfigs:签名文件的可选项参数
  • sourceSets:资源文件目录指定(Android中有自己的AndroidSourceSets,这个一般用于assets,jin等目录)
  • splits:splits类型。
  • testBuildType:测试构建类型
  • testOptions:测试可选项参数
  • testVariants:测试变体
  • unitTestVariants:单元测试变体
  • variantFilter:变体过滤器

加粗的表示DSL语言的闭包

如:

buildTypes { }

AppExtension的方法: 
- flavorDimensions(dimension):指定flavor名称 
- useLibraray(name):请求使用一个lib库 
- useLibrary(name,required):与上面解释一样。


AppExtension的配置闭包(Configration blocks)

与app中build.gradle中android{}一样,代码中由AppExtension类表示。其他的配置闭包也一样。

    • aaptOptions{}
aaptOptions{}代码由AaptOptions类表示。

AaptOptions的属性:
.additionalParameters:额外参数,List类型。
.cruncherEnabled:如果PNG图片是否可以大量快速的处理,boolean类型。 true表示可以。
.cruncherProcesses:快速处理,可能需要更多的内存和CPU。int类型。默认0,值越大处理越快,需要的内存和CPU也越大。
.failOnMissingConfigEntry:如果没有找到一个配置,就返回一个错误。Boolean值,默认false。
.ignoreAssetsPattern:忽略Assets模块。
.moCompress:拓展文件不会打包进apk中。 用法(详细用法可能需要去看看文档了): aaptOptions{
cruncherEnabled true//快速处理PNG图片
}

AaptOptions官方文档


  • adbOption{}

    adbOptions{}对应的是AdbOptions
    
    AdbOptions的属性:
    .installOptions:apk安装的可选参数。
    .timeOutInMs:使用adb的超时时间。 不常用
    • buildTypes{}

      buildTypes{}对应的是BuildType类
      
      buildTypes的属性:
      
      .applicationIdSuffix:应用id后缀(给Applica)
      .consumerProguardFiles:混淆文件包含在arr包中。
      .debuggable:是否生成一个debug的apk
      .embedMicroApp:可穿戴设备app是否可以使用这个编译类型
      .javaCompileOption:Java编译配置参数
      .jniDebuggable:这个编译类型的配置是否可以与debuggable的native代码生成一个apk
      .manifestPlaceholders:清单占位符
      .minifyEnabled:是否缩小
      .multiDexEnabled:是否拆成多个Dex
      .multiDexKeepFile:指定文本文件编译进主Dex文件中
      .multiDexKeepProguard:指定混淆文件编译进主Dex文件中
      .name:build type的名字
      .proguardFiles:混淆文件
      .pseudoLocalesEnabled:是否生成伪现场apk(如果没有提供混淆规则文件,则设置默认的混淆规则文件(SDK/tools/proguard/proguard-android.txt))
      .renderscriptDebuggable:使用RenderScript编译器的优化级别。
      .shrinkResources:是否去除未利用的资源,默认false,表示不去除。
      .signingConfig:签名配置
      .testCoverageEnabled:测试覆盖率是否被激活。
      .useJack:过时
      .versionNameSuffix:版本名称后缀
      .zipAlignEnable:是否使用zipalign工具压缩。 ------------------------------------------------------ buildType的方法: .buildConfigField(type,name,value):添加一个变量生成BuildConfig类。
      .consumeProguardFile(proguardFile):添加一个混淆文件进arr包。
      .consumeProguardFile(proguardFiles):添加混淆文件进arr包。
      .externalNativeBuild(action):配置本地的build选项。
      .initWith:复制这个build类型的所有属性。
      .proguardFile(proguardFile):添加一个新的混淆配置文件。
      .proguradFiles(files):添加新的混淆文件
      .resValue(type,name,value):添加一个新的生成资源
      .setProguardFiles(proguardFileIterable):设置一个混淆配置文件。 ------------------------------------------------------------ buildType用法: buildTypes {
      release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      shrinkResources true
      zipAlignEnabled true
      debuggable false
      //...
      } debug{
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      shrinkResources true
      zipAlignEnabled true
      debuggable true
      //...
      }
      }

      BuildType官方文档


      • compileOptions{}

        compileOptions{}对应的是CompileOptions
        
        CompileOptions的属性:
        .encoding:Java源文件的编码格式
        .incremental:是否应该使用Java编写的Gradle新的增量模型
        .sourceCompatibility:指定编译编译.java文件的jdk版本
        .targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的java虚拟机兼容 不太常用
        • dataBinding{}

          dataBinding{}对应的是DataBindingOptions
          
          DataBindingOptions的属性:
          
          .addDefualtAdapters:是否添加一个默认的data binding适配器。默认true。
          .enabled:是否使用data binding
          .version:data binding使用版本 dataBinding的使用: dataBinding{
          enabled true
          }

          关于DataBinding的详细用法


          • defualtConfig{}

            defaultConfig{}是所有flavor都共有的配置。
            
            英文解释:The default configuration, inherited by all product flavors (if any are defined).
            
            defaultConfig的使用:
            
             defaultConfig {
            applicationId "com.example.zhang.demo"
            minSdkVersion
            targetSdkVersion
            versionCode
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            }

            如果项目中包含多个Module,可以将共有的minSdkVersion和targetSdkVersion抽取到Project中的build.gradle文件中。具体细节下一章节。

            • dexOptions{}

              dexOptions{}对应的是DexOptions
              
              DexOptions属性:
              
              .additionalParameters:给dx添加一系列附加的参数
              .javaMaxHeapSize:当调用dx时指定-Xmx值。
              .jumboMode:使用jumbo(庞大的)模式
              .keepRuntimeAnnotatedClasses:保持所有类中的运行时的注解在主Dex中。
              .maxProcessCount:可以使用Dex的最大并发进程数。默认为4。
              .optimize:运行在dx编译器是否有optimize标记。
              .preDexLibraries:是否预先dex库,它可以改善增量的生成,但是在clear build可能会变慢
              .threadCount:当dx运行时使用的线程的数量。默认4个。 dexOptions{}的用法: dexOptions {
              preDexLibraries false
              javaMaxHeapSize "4g"
              }
              • externalNativeBuild{}

                externalNativeBuild{}对应的是ExternalNativeBuild
                
                ExternalNativeBuild的属性:
                
                .cmake:CMake工具编译选项。
                .ndkBuild:ndk-build选项。 在externalNativeBuild{}中有2个模块,cmake{}和ndkBuild{}模块 ------------------------------------------------
                cmake{}对应的是CmakeOptions CmakeOption的属性:
                .path:你的CmakeLists.txt编译脚本的相对路径。 --------------------------------------------------
                ndkBuild{}对应的是NdkBuildOptions NdkBuildOptions的属性:
                .path:你的Android.mk文件的相对路径。 -------------------------------------------------- externalNativeBuild{}的用法: externalNativeBuild{
                ndkBuild{
                path file("src\\main\\jni\\Android.mk")
                } cmake {
                path "src/main/cpp/CMakeLists.txt"
                }
                }

                Android Studio2.2 配置NDK

                Android studio 2.2 使用cmake编译NDK


                • jacoco{}

                  jacoco{}对应于JacocoOptions
                  
                  JacocoOptions的属性:
                  .version:过时 英文原文:
                  note: this property is deprecated and will be removed in a future version of the plugin.
                  • lintOptions{}

                    lintOptions{}对应于LintOptions
                    
                    LintOptions的属性:
                    .abortOnError:如果发现错误,lint工具是否应该退出这个程序。true表示退出。
                    .absolutePaths:是否在输出错误的时候,lint应该展示出全路径。默认是相对路径,也就是默认false。
                    .check:精确的检查(搜集)问题的集合,默认情况下,任何问题都可以通过LintOptions.getEnable()启用,没有问题可以通过LintOptions.getDisable()使之无效。
                    .checkAllWarnings:是否检查所有警告,包括那些默认关闭。
                    .disable:通过id's来压制这个问题,允许修改
                    .enable:通过id's来处理这个问题,循序修改,他会将添加id,并返回一个集合。
                    .explainIssues:返回lint是否包含错误问题的解释(注意:HTML和XML报告会无条件的去做,忽略这个设置)。
                    .htmlOutput:html输出方式。
                    .htmlReport:我们应该是否写一个HTML报告,默认true, 这个使用场景由LintOptions.getHtmlOutput()控制。
                    .ignoreWarings:lint仅仅检查错误,忽略警告。
                    .lintConfig:默认配置文件作为备份。
                    .noLines:lint在输出错误日志的时候,是否包含行数。默认true。
                    .quiet:lint是否应该quiet(安静)。如:报告文件写入路径,不写消息。
                    .severityOverrides:An optional map of severity overrides. The map maps from issue id's to the corresponding severity to use, which must be "fatal", "error", "warning", or "ignore".
                    .showAll:lint是否包含所有的输出。
                    .textOutput:文本输出方式。
                    .textReport:是否是文本报告写入,默认false。
                    .warningAsErrors:lint是否把警告当做错误来处理。
                    .xmlOutput:XML输出方式。
                    .xmlReport:XML格式写入报告,默认true。 ------------------------------------------------ LintOptions的方法: .check(id):检查这个id的问题的集合
                    .check(ids):
                    .disable(id):将id添加到不用启动的问题集
                    .disable(ids):
                    .enable(id):将id添加到启动的问题集
                    .enable(ids)
                    .error(id):将id添加到错误的问题集
                    .error(ids)
                    .fatal(id):将id添加到fatal级别的问题集
                    .fatal(ids)
                    .ignore(id):将id添加到ignore级别的问题集
                    .ignore(ids)
                    .waring(id):将id添加到waring级别的问题集
                    .waring(ids) ------------------------------------------------ lintOptions{}的一般用法: lintOptions {
                    abortOnError false
                    }

                    LintOptions官方文档


                    • packagingOptions{}

                      packagingOptions{}对应的是PackagingOptions
                      
                      Packaging options有三组路径:first-picks,merges和excludes:
                      
                      packagingOptions{}的用法:
                      
                      packagingOptions {
                      pickFirsts = [] // Not really needed because the default is empty.
                      merges = [] // Not really needed because the default is empty.
                      excludes = []
                      }

                      PackagingOptions官方文档


                      • productFlavors{}

                        productFlavors{}对应的是ProductFlavors
                        
                        ProductFlavors的属性:
                        
                        .applicationId:应用程序ID。
                        .applicationIdSuffix:应用程序ID后缀。
                        .consumerProguardFiles:混淆规则文件被包含在aar包中。
                        .dimension:flavor名称的尺寸。
                        .externalNativeBuild:详情见externalNativeBuild{}
                        .flavorDeminsion:过时
                        .generatedDensities:过时
                        .jackOption:jack配置可选项。
                        .javaCompileOptions:Java编译配置参数
                        .manifestPlaceholders:manifest占位符
                        .multiDexEnabled:是否进行dex拆分
                        .multiDexKeepFile:文本文件编译进主dex文件中。
                        .multiDexKeepProgroud:文本文件作为混淆规则编译进主dex文件中
                        .ndk:ndk配置
                        .proguardFiles:混淆文件
                        .signingConfig:这个flavor的签名配置信息
                        .testApplicationId:测试应用ID
                        .testFunctionalTest:
                        .testHandleProfiling:
                        .testInstrumentationRunner:
                        .testInstrumentionRunnerArguments:
                        .useJack:过时
                        .verctorDrawables:生成矢量图支持
                        .versionCode:版本号
                        .versionName:版本名
                        .versionNameSuffix:版本名后缀
                        .wearAppUnbundled:是否对嵌入式穿戴app进行拆分模式。如果true,那么这个app将在应用市场被分发为穿戴设备的app。 productFlavor{}的用法: productFlavors { googlePlay {
                        } xiaomi {
                        }
                        }
                        //所有打包配置(批量处理打包渠道--> manifestPlaceholders:设置打包渠道)
                        productFlavors.all {
                        //平台id
                        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
                        }

                        ProductFlavor官方文档


                        • signingConfig{}

                          signingConfig{}对应的是SigningConfig
                          
                          SigningConfig的属性:
                          
                          .keyAlias:签名使用key的别名
                          .KeyPassword:签名使用的key的密码
                          .storeFile:store签名文件
                          .storePassword:store签名密码
                          .storeType:store签名类型
                          .v1SigningEnabled:是否使用jar签名(又名v1签名)。
                          .v2SigningEnabled:是否使用apk签名(又名v2签名)。 signingConfig{}的用法: signingConfigs {
                          config {
                          keyAlias '...'
                          keyPassword '...'
                          storeFile file('C:/../Key.jks')
                          storePassword '...'
                          }
                          }
                          • sourceSets{}

                            sourceSets{}对应的AndroidSourceSet
                            
                            AndroidSourceSet的属性:
                            
                            .aidl:aidl目录
                            .assets:assets目录
                            .compileConfiguraName:编译配置资源目录。
                            .java:java代码目录(需要编译成.class文件)
                            .jni:jni资源目录
                            .jniLibs:jni库目录
                            .manifest:AndroidManifest.xml资源文件
                            .name:source set名称。
                            .packageConfigurationName:运行时配置的资源集。
                            .providedConfigurationName:仅仅编译时配置的资源集。
                            .renderscript:RenderScript脚本资源目录
                            .res:Android资源目录
                            .resource:java资源被复制到输出到javaresource目录 AndroidSourceSet的方法:
                            .setRoot(path):资源集的根目录,所有的资源都在这个跟目录下。 sourceSets{}的使用: sourceSets {
                            //在main目录中
                            main {
                            //assets目录设置
                            assets.srcDirs = ['assets']
                            //jni目录设置
                            jni.srcDirs 'src/main/jni'
                            //jni库设置
                            jniLibs.srcDir 'src/main/jniLibs'
                            }
                            }
                            • splits{}

                              splits{}对应的是Splites
                              
                              Splits的属性:
                              
                              .abi:ABI设置
                              .abiFilters:用于多个apk的ABI筛选列表
                              .density:密度设置
                              .densityFilters:用于多个apk的密度筛选列表
                              .language:语言设置。
                              .languageFilters:用于多个apk的语言筛选列表 ----------------------------------------------------- Spiltes对应有三个模块,abi{},density{},language{} abi{}对应的是AbiSplitOptions AbiSplitsOptions的属性:
                              .applicableFilters:返回此范围的所有适用筛选器的列表。
                              .enable:是否在这个范围分裂
                              .universalApk:是否创建所有可用的ABIs一个APK。 AbiSplitesOptions的方法:
                              .exclude(excludes):排除一些值。
                              .include(include):包含一些值。
                              .reset():重新设置split配置。 ---------------------------------------------------------- density{}对应的是DensitySplitOptions DensitySplitOptions的属性:
                              .applicableFilters:返回此范围的所有适用筛选器的列表。
                              .auto:编译系统是否确定分割“language-*”文件夹中的资源。
                              .compatibleScreen:兼容屏幕列表
                              .enable:是否拆分 DensitySplitOptions的方法:
                              .exclude(exclude):排除一些值
                              .include(include):包含一些值
                              .reset():重新设置split配置。 ------------------------------------------------------- language{}对应的是LanguageSplitOptions LanguageSplitOptions的属性:
                              .enable:如果true,就是拆分language LanguageSplitOptions的方法:
                              .include(include):包含一个模型。 --------------------------------------------------------- splits{}的用法: splits {
                              density {
                              enable true
                              exclude 'ldpi', 'mdpi'
                              compatibleScreens 'normal', 'large', 'xlarge'
                              }
                              } 生成结果:
                              app-hdpi-release.apk
                              app-universal-release.apk
                              app-xhdpi-release.apk
                              app-xxhdpi-release.apk
                              app-xxxhdpi-release.apk splits {
                              abi {
                              enable true
                              reset()
                              include 'x86', 'armeabi-v7a', 'mips'
                              universalApk true
                              }
                              } 这个就是生成不同手机架构的app

                              APK-splite官方文档

                              Splite官方文档

                              参考文章


                              • testOptions{}

                                testOptions{}对应的是TestOptions
                                
                                TestOptions的属性:
                                .reportDir:报告目录
                                .resultDir:结果目录
                                .unitTests:单元测试配置参数 TestOptions包含unitTests{} ------------------------------------------------------- unitTests{}对应的是UnitTestOptions UnitTestOptions的属性:
                                .returnDefaultValues:无论unmocked方法从android.jar中抛出异常或是默认值(0或null)。 UnitTestOtions的方法:
                                all(configClosure):配置所有单元测试任务。 ------------------------------------------------- testOptions{}的使用: testOptions {
                                resultsDir = "$project.buildDir/foo/results"
                                }

Android Studio gradle配置详解的更多相关文章

  1. 【转载】Android Studio Service AIDL 详解

    公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...

  2. Android studio gradle配置完整版(转)

    Android studio gradle配置完整版https://my.oschina.net/u/1471093/blog/539075 Android studio 自定义打包apk名 - pe ...

  3. Android Studio Gradle配置工具开发

    by 蔡建良 2019-3-9 QQ: 304125648 Android Studio导入项目经常出现卡死的情况.针对Gradle更新配置的问题,网上已经有详细的方法,但也很烦索,步骤也很多. 因此 ...

  4. Android studio gradle配置!!!【转】

    转自:http://www.open-open.com/lib/view/open1415793464648.html Gradle 基本概念 首先我们学习几个gradle 的脚本语法,掌握了这几个语 ...

  5. Android studio gradle配置

    什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. gr ...

  6. Android Studio 使用本地gradle配置详解

    由于国内墙的原因,我们的Gradle无法使用 但是我们可以通过去下载我们想要的Gradle版本 然后再AndoidStudio内去配置本地的版本 进而去实现了Gradle的配置 注意一: so我们按照 ...

  7. Gradle—Android配置详解

    参考[1]彻底弄明白Gradle相关配置       [2]Android Studio gradle配置详解

  8. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  9. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

随机推荐

  1. JS中的数据类型和变量内存

    1. JS中存在5种简单数据类型和1种复杂数据类型: 5种简单数据类型:Undefined, Null, Boolean, Number, String. 1种复杂数据类型:Object. 上面的5种 ...

  2. InfluxDB、grafana、collect部署监控(centos6.8)

    collect部署 1.安装 yum install collectd -y 2.配置/etc/collectd.conf LoadPlugin network <Plugin network& ...

  3. parted分区工具用法

    parted分区工具用法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着生产环境中数据量的增大,我们对硬盘的容量也有很大的需求,当硬盘的容量大于2T(工业上的最大磁盘2.2TB ...

  4. LVS+keepalived 的DR模式的两种做法

    LVS DR模式搭建 准备工作 三台机器: dr:192.168.13.15 rs1:192.168.13.16 rs2: 192.168.13.17 vip:192.168.13.100 修改DR上 ...

  5. 金融量化分析【day113】:羊驼策略

    零.动量策略VS反转策略 1.实现代码 # 导入函数库 import jqdata import pandas as pd import numpy as np import datetime imp ...

  6. Dapper总结(一)---基本CRUD操作

    一.dapper是什么 dapper是一款轻量级的ORM(Object Relationship Mapper),它负责数据库和编程语言之间的映射.SqlConnection,MysqlConnect ...

  7. BigDecimal最基础用法【转】

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  8. Docker 入门 第三部分: 服务

    目录 Docker 入门 第三部分: 服务 先决条件 介绍 你的第一个 docker-compose.yml 文件 docker-compose.yml 运行你新建的负载均衡应用 扩展应用程序 卸载应 ...

  9. u-boot移植(三)---修改前工作:代码流程分析2

    一.vectors.S 1.1 代码地址 vectors.S (arch\arm\lib) 1.2 流程跳转 跳转符号 B 为 start.S 中的 reset 执行代码,暂且先不看,先看看 vect ...

  10. urllib和urllib2之间的区别

    urllib和urllib2都是接受URL请求的相关模块,但是提供了不同功能. urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL.这意味着 ...