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

AaptOptions官方文档


  • adbOption{}
adbOptions{}对应的是AdbOptionsAdbOptions的属性:1.installOptionsapk安装的可选参数。2.timeOutInMs:使用adb的超时时间。不常用

  • buildTypes{}
buildTypes{}对应的是BuildType类buildTypes的属性:1.applicationIdSuffix:应用id后缀(给Applica)2.consumerProguardFiles:混淆文件包含在arr包中。3.debuggable:是否生成一个debug的apk4.embedMicroApp:可穿戴设备app是否可以使用这个编译类型5.javaCompileOption:Java编译配置参数6.jniDebuggable:这个编译类型的配置是否可以与debuggable的native代码生成一个apk7.manifestPlaceholders:清单占位符8.minifyEnabled:是否缩小9.multiDexEnabled:是否拆成多个Dex10.multiDexKeepFile:指定文本文件编译进主Dex文件中11.multiDexKeepProguard:指定混淆文件编译进主Dex文件中12.name:build type的名字13.proguardFiles:混淆文件14.pseudoLocalesEnabled:是否生成伪现场apk(如果没有提供混淆规则文件,则设置默认的混淆规则文件(SDK/tools/proguard/proguard-android.txt))15.renderscriptDebuggable:使用RenderScript编译器的优化级别。16.shrinkResources:是否去除未利用的资源,默认false,表示不去除。17.signingConfig:签名配置18.testCoverageEnabled:测试覆盖率是否被激活。19.useJack:过时20.versionNameSuffix:版本名称后缀21.zipAlignEnable:是否使用zipalign工具压缩。------------------------------------------------------buildType的方法:1.buildConfigField(type,name,value):添加一个变量生成BuildConfig类。2.consumeProguardFile(proguardFile):添加一个混淆文件进arr包。3.consumeProguardFile(proguardFiles):添加混淆文件进arr包。4.externalNativeBuild(action):配置本地的build选项。5.initWith:复制这个build类型的所有属性。6.proguardFile(proguardFile):添加一个新的混淆配置文件。7.proguradFiles(files):添加新的混淆文件8.resValue(type,name,value):添加一个新的生成资源9.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{}对应的是CompileOptionsCompileOptions的属性:1.encoding:Java源文件的编码格式2.incremental:是否应该使用Java编写的Gradle新的增量模型3.sourceCompatibility:指定编译编译.java文件的jdk版本4.targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的java虚拟机兼容不太常用

  • dataBinding{}
dataBinding{}对应的是DataBindingOptionsDataBindingOptions的属性:1.addDefualtAdapters:是否添加一个默认的data binding适配器。默认true。2.enabled:是否使用data binding3.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 15        targetSdkVersion 25        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}

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


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

  • externalNativeBuild{}
externalNativeBuild{}对应的是ExternalNativeBuildExternalNativeBuild的属性:1.cmake:CMake工具编译选项。2.ndkBuild:ndk-build选项。在externalNativeBuild{}中有2个模块,cmake{}和ndkBuild{}模块------------------------------------------------cmake{}对应的是CmakeOptionsCmakeOption的属性:1.path:你的CmakeLists.txt编译脚本的相对路径。--------------------------------------------------ndkBuild{}对应的是NdkBuildOptionsNdkBuildOptions的属性:1.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{}对应于JacocoOptionsJacocoOptions的属性:1.version:过时英文原文:note: this property is deprecated and will be removed in a future version of the plugin.

  • lintOptions{}
lintOptions{}对应于LintOptionsLintOptions的属性:1.abortOnError:如果发现错误,lint工具是否应该退出这个程序。true表示退出。2.absolutePaths:是否在输出错误的时候,lint应该展示出全路径。默认是相对路径,也就是默认false3.check:精确的检查(搜集)问题的集合,默认情况下,任何问题都可以通过LintOptions.getEnable()启用,没有问题可以通过LintOptions.getDisable()使之无效。4.checkAllWarnings:是否检查所有警告,包括那些默认关闭。5.disable:通过id's来压制这个问题,允许修改6.enable:通过id's来处理这个问题,循序修改,他会将添加id,并返回一个集合。7.explainIssues:返回lint是否包含错误问题的解释(注意:HTML和XML报告会无条件的去做,忽略这个设置)。8.htmlOutput:html输出方式。9.htmlReport:我们应该是否写一个HTML报告,默认true, 这个使用场景由LintOptions.getHtmlOutput()控制。10.ignoreWarings:lint仅仅检查错误,忽略警告。11.lintConfig:默认配置文件作为备份。12.noLines:lint在输出错误日志的时候,是否包含行数。默认true13.quiet:lint是否应该quiet(安静)。如:报告文件写入路径,不写消息。14.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".15.showAll:lint是否包含所有的输出。16.textOutput:文本输出方式。17.textReport:是否是文本报告写入,默认false18.warningAsErrors:lint是否把警告当做错误来处理。19.xmlOutput:XML输出方式。20.xmlReport:XML格式写入报告,默认true------------------------------------------------LintOptions的方法:1.check(id):检查这个id的问题的集合2.check(ids):3.disable(id):将id添加到不用启动的问题集4.disable(ids):5.enable(id):将id添加到启动的问题集6.enable(ids)7.error(id):将id添加到错误的问题集8.error(ids)9.fatal(id):将id添加到fatal级别的问题集10.fatal(ids)11.ignore(id):将id添加到ignore级别的问题集12.ignore(ids)13.waring(id):将id添加到waring级别的问题集14.waring(ids)------------------------------------------------lintOptions{}的一般用法:lintOptions {    abortOnError false}

LintOptions官方文档


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

ProductFlavor官方文档


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

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

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

APK-splite官方文档

Splite官方文档

参考文章


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

参考文档


AppExtension文档

Gradle翻译

更多相关文章

  1. Android 中自定义属性(attr.xml,TypedArray)的使用
  2. android小功能实现之xml文件解析(Pull)
  3. Android中UI组件android:layout_gravity属性的使用
  4. android中下载文件到sdcard和进度条小结
  5. Android R文件丢失解决办法
  6. Android init.rc文件解析过程分析

随机推荐

  1. 第二部分
  2. Android 安装位置 - installLocation简析
  3. Android工具下载
  4. android databinding 学习开篇
  5. Android培训班(53)
  6. android 5.1 添加reboot 飞行模式 silent
  7. Android - 组件工具箱(widget tool box)
  8. Android 起步 环境配置 持续更新
  9. Android平台开发-WIFI 驱动移植 -- 详细
  10. Android杂谈--小知识点总结(1)