目录
一、前言
二、defaultConfig
1、搞清楚几个问题
2、defaultConfig 的存在形式
3、defaultConfig 中属性的意义
4、defaultConfig 中方法的意义
三、写在最后

一、前言

我们在安卓开发中,编译的任务是由 gradle 来负责的。但很多时候我们进入 build.gradle 文件中,有种似懂非懂的感觉,所以小盆友总结并分享自己学习到的点滴。

话不多说,今天分享的是在我们的每个模块下(应用级)build.gradle 文件中,android 下的 defaultConfig 属性

二、defaultConfig

1、搞清楚几个问题

在分享 defaultConfig 前,我们需要先弄清楚几个问题,这几问题之前一直困扰着小盆友,所以顺便记录和分享下。

(1)build.gradle 最终是以什么形式存在。
(2)为什么 每个模块下的 build.gradle 文件的最开始都有 apply plugin: 'com.android.library' 这样一行代码。

自动生成完的 build.gradle 格式如下所示

apply plugin: 'com.android.library'android {// 省略一些配置
}dependencies {// 省略依赖
}

这个文件最终会被转换为 org.gradle.api.Project 类(其类的关系如下图)。

Project
ExtensionAware
PluginAware
  • 第一行代码的 apply 会调用 PluginAwarevoid apply(Map<String, ?> options); 方法,进行设置插件;
  • 接下来的 android,并不是 gradle 中所带的,而是第一行代码插件所带来。具体会映射为 com.android.build.gradle.AppExtension 类;
  • 最后的 dependencies,会调用 Projectvoid dependencies(Closure configureClosure); 方法;

2、defaultConfig 的存在形式

defaultConfig 会被映射为 DefaultConfig 类,其继承结构图如下

DefaultConfig
BaseFlavor
DefaultProductFlavor
CoreProductFlavor
BaseConfigImpl
ProductFlavor
BaseConfig
DimensionAware

3、defaultConfig 中属性的意义

下面是官方给出的文档,我们以 3.3 的版本进行讲解,其他版本可能有些许的小改动。

defaultConfig官方文档 传送门

3.1 applicationId

  • 类型:String
  • 描述:应用的id,即我们常说的包名。我们都知道 android studio 是以 applicationId 作为包名,以前使用 eclipse 时,则另当别论了。
  • 使用方法:
defaultConfig {// applicationId 应用的包名// applicationId 会替换 AndroidManifest.xml 中的 manifest 标签下 package 的 valueapplicationId "com.zinc.gradlestudy"......省略其他配置
}

3.2 applicationIdSuffix

  • 类型:String
  • 描述:会追加在上面 applicationId 字符串的后面,形成最终的包名
  • 使用方法:
defaultConfig {// 若此时 applicationId 为 com.zinc.gradlestudy,则最终会形成 com.zinc.gradlestudy.debug 的包名applicationIdSuffix "debug"......省略其他配置
}

3.3 externalNativeBuild

  • 类型:ExternalNativeBuildOptions
  • 描述:这里我们设置 ndk 编译过程的一些参数。分为 cmake 和 ndkBuild 两个参数。
  • 使用方法:
defaultConfig {externalNativeBuild {ndkBuild {// Passes an optional argument to ndk-build.arguments "NDK_MODULE_PATH+=../../third_party/modules"}// For ndk-build, instead use the ndkBuild block.cmake {// Passes optional arguments to CMake.arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"// Sets a flag to enable format macro constants for the C compiler.cFlags "-D__STDC_FORMAT_MACROS"// Sets optional flags for the C++ compiler.cppFlags "-fexceptions", "-frtti"// Specifies the library and executable targets from your CMake project// that Gradle should build.targets "libexample-one", "my-executible-demo"}}
}

cmake 具体参数 传送门
ndkBuild 具体参数 传送门

3.4 dimension

  • 类型:String
  • 描述:当前的配置所属的 “风味维度”,这个参数在这里的并没有实际的意义,在打多渠道包的时候,会进行更多的分享。
  • 使用方法:
defaultConfig {dimension 'debug'......省略其他配置
}

3.5 consumerProguardFiles

  • 类型:List< File >
  • 描述:这个属性只作用于我们创建的 library 中,包括我们以aar形式导入的 library ,或是直接创建的 library。它的作用是,负责该 library 被进行编译时的混淆规则,我们在 主App 的模块下则可以不用再管理各个 library 的混淆规则,会直接使用各个 library 的混淆规则文件。
  • 使用方法:
defaultConfig {consumerProguardFiles 'consumer-rules.pro'......省略其他配置
}// 因为该属性是一个 List<File> 类型,如果需要多个文件配置,则如下所示
defaultConfig {consumerProguardFiles 'consumer-rules.pro','zincPower-rules.pro'......省略其他配置
}

3.6 javaCompileOptions

  • 类型:JavaCompileOptions
  • 描述:配置编译时 java 的一些参数,例如我们使用 annotationProcessor 时所需要的参数。
  • 使用方法:
defaultConfig {javaCompileOptions {annotationProcessorOptions{arguments = []classNames ''....}}......省略其他配置
}

JavaCompileOptions 可以配置的具体参数,请进传送门

3.7 manifestPlaceholders

  • 类型:Map<String, Object>
  • 描述:配置可以在 AndroidManifest.xml 中替换的参数,一般用于多渠道中使用,不会在 defaultConfig 中使用。
  • 使用方法:

这里想配置我们应用的logo,则可以在 gradle 中使用下面这段

defaultConfig {manifestPlaceholders = [APP_LOGO_ICON: "@mipmap/ic_logo"]
}

然后在 AndroidManifest.xml 中使用,使用 ${你配置的变量名}

// 在 application 中使用替换,还需要多添加 tools:replace 这一标签,将我们需要替换的名称写上,例如这里的 android:icon
<applicationandroid:allowBackup="true"android:icon="${APP_LOGO_ICON}"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"tools:replace="android:icon">
......

3.8 multiDexEnabled

64K 引用限制问题官方文档 传送门

  • 类型:Boolean
  • 描述:是否开启分包。因为安卓中方法索引值为两个字节,四位十六进制的一个数值,即[0, 0xffff],所以最大方法数为65536个。一旦超出了,就需要进行分包,所以我们就需要开启这个参数。
  • 使用方法:
defaultConfig {multiDexEnabled true...
}// 添加依赖
dependencies {// 如果使用的为 AndroidX,则使用下面这个导入// implementation 'androidx.multidex:multidex:2.0.1'// 如果不使用 AndroidX,则使用下面这段compile 'com.android.support:multidex:1.0.3'
}

有两种开启 MultiDex 方法:

// 第一种:让你应用的 Application 继承 MultiDexApplication。
public class MyApplication extends MultiDexApplication {}// 第二种:重写应用的 Application 方法 attachBaseContext
public class MyApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);MultiDex.install(this);}
}

最后别忘了在 AndroidManifest.xml 中使用我们在上面的 Application。

3.9 multiDexKeepFile

  • 类型:File
  • 描述:将我们需要的类打包进主包,即 classs.dex。我们在第 3.8 小点,分享到使用了多包处理,有时我们需要将一些主要的类打包进主包,则可以使用该属性。
  • 使用方法:
defaultConfig {multiDexKeepFile file('multidex-config.txt')...
}

multidex-config.txt 中的书写则如下,每一个文件则为一行

com/example/MyClass.class
com/example/TestClass.class

3.10 multiDexKeepProguard

  • 类型:File
  • 描述:将我们需要的类打包进主包,和第 3.9 点的功能相同,区别在于写法。
  • 使用方法:
defaultConfig {multiDexKeepFile file('multidex-config.pro')...
}

multidex-config.pro 中的写法如下

// 将会保留所有的在com.example package的类-keep class com.example.** { *; }

3.11 ndk

  • 类型:NdkOptions
  • 描述:用于abi过滤
  • 使用方法:
    进行如下配置,编译出来的 Apk包只包含armeabi-v7a,不会包含其他的架构,例如 “X86”。
defaultConfig {// ndk中,目前只有 abiFilter 一个属性,所以 ndk 目前来说只用于 abi 的过滤ndk {abiFilter 'armeabi-v7a'}...
}

NdkOptions的具体可配参数见官方文档 传送门

3.12 proguardFiles

  • 类型:List
  • 描述:配置混淆规则文件,但我们一般不会在这里使用该配置,而会在 buildTypes 中结合 minifyEnabled 一起使用。

3.12 signingConfig

  • 类型:SigningConfig
  • 描述:配置签名配置,但一般不会在这里进行配置,而会在 buildTypes 中进行配置,这里先不过多解释。

3.13 vectorDrawables

  • 类型:VectorDrawablesOptions
  • 描述:配置矢量图的参数
  • 使用方法:
    VectorDrawablesOptions 中只有两个参数,为 generatedDensitiesuseSupportLibrary。分别的用处如下
defaultConfig {vectorDrawables {// 如果 minSdkVersion 小于 21,只生成mdpi的pnggeneratedDensities 'mdpi'// 设置为 true,会忽略 generatedDensities ,会加入svg兼容包,不会再产生pnguseSupportLibrary true}
}

矢量图的用法,可以看小盆友的另一片文章

3.14 versionCode

  • 类型:Integer
  • 描述:应用当前的版本值。和 versionName 的区别在小盆友看来,versionCode 是给程序员看的,versionName 是给产品经理和用户看的。
  • 使用方法:
defaultConfig {versionCode 1000......
}

3.15 versionName

  • 类型:String
  • 描述:应用版本。我们通常所说的该应用的版本是“1.2.0”,则是由这个值配置的。
  • 使用方法:
defaultConfig {versionName "1.0.0".....
}

3.16 versionNameSuffix

  • 类型:String
  • 描述:追加在第 3.15 小点“版本”的后缀
  • 使用方法:
defaultConfig {// 如果 versionName "1.0.0" ,则最终的版本名为 1.0.0.testversionNameSuffix ".test".....
}

4、defaultConfig 中方法的意义

4.1 buildConfigField(type, name, value)

  • 描述:我们可以在 BuildConfig 类中添加值,最终会在 BuildConfig 中添加如下一行代码。
// 值的注意的是 value 的值是原样放置,我们通过使用方法一节来了解
<type> <name> = <value>
  • 使用方法:
defaultConfig {// 可以通过 BuildConfig 进行获取buildConfigField('String', 'name', '"zinc"')buildConfigField('int', 'age', '26').....
}

最终会生成如下图的配置,我们可以通过下面代码进行获取

String name = BuildConfig.name;
int age = BuildConfig.age;


值的一提的是,我们设置 String 类型的参数时,需要加上 “” 双引号(如例子中的name属性)。切记!

4.2 consumerProguardFile(proguardFile)

  • 描述:和上面分享的 3.5 小点的属性 consumerProguardFiles 是一样的作用。只是这里只能设置一个 混淆文件。
  • 使用方法:
defaultConfig {consumerProguardFile('consumer-rules.pro')
}

4.3 consumerProguardFiles(proguardFiles)

  • 描述:和上面分享的 3.5 小点的属性 consumerProguardFiles 是一样的作用,而且也是多个混淆文件。
  • 使用方法:
defaultConfig {consumerProguardFiles('consumer-rules.pro', 'zincPower-rules.pro',.....)
}

4.4 maxSdkVersion(maxSdkVersion)

  • 描述:设置应用的最高支持版本,一般我们不会进行设置
  • 使用方法:
defaultConfig {// 最高支持28版本maxSdkVersion 28
}

4.5 minSdkVersion(minSdkVersion)

  • 描述:设置应用的最低支持版本
  • 使用方法:
defaultConfig {// 最低支持19版本minSdkVersion 19
}

4.6 missingDimensionStrategy(dimension, requestedValue)

  • 相似方法:missingDimensionStrategy(dimension, requestedValues) 区别在于第二个参数可以设置多个风味。
  • 参数说明:
    (1)dimension:维度
    (2)requestedValue:风味(如果为 requestedValues 则是风味列表)
  • 描述:忽略在 Library 中的渠道设置,即维度(dimension)和风味(flavor),如果不进行忽略,在进行引入的时候会无法进行。
  • 使用方法:

我们的项目结构如下

zinclibrarybuild.gradle 中编写了如下渠道配置

// 创建 风味维度
flavorDimensions('zinc', 'handsome')
// 创建产品风味
productFlavors {minApi13{dimension 'zinc'}minApi23{dimension 'zinc'}x86{dimension 'handsome'}arm64{dimension 'handsome'}
}

此时如果直接在 appbuild.gradle 中添加依赖,同步时便会出错

dependencies {...忽略其他依赖implementation project(":zinclibrary")
}

所以我们需要在 appbuild.gradle 中使用这个参数进行忽略 library 中带来的维度和风味,即使用如下代码

defaultConfig {missingDimensionStrategy 'zinc', 'minApi13', 'minApi23'missingDimensionStrategy 'handsome', 'x86', 'arm64'
}

4.7 resConfig(config)

  • 描述:保留的资源配置。
  • 使用用法:
defaultConfig {// 这样我们编译出的apk中,只有 “默认” 和 “中文zh” 两种资源resConfig "zh"
}

4.8 resConfigs(config)

  • 描述:保留的资源配置,和 resConfig 的区别在于,resConfigs 保留多个资源。
  • 使用用法:
defaultConfig {// 这样我们编译出的apk中,只有 “默认” 、 “中文zh” 和 “英文en” 两种资源resConfigs "zh","en"
}

4.9 resValue(type, name, value)

  • 描述:添加 value 资源
  • 使用用法:
defaultConfig {// 添加至 res/value,通过 R.string.age 获取resValue('string', 'age', '12year')
}

4.10 targetSdkVersion(targetSdkVersion)

  • 描述:应用的目标版本。说明我们已经对指定的版本进行了测试,在开发过程中可以使用至该版本的API,否则会被提示无法使用。如果不设置,则和 minSdkVersion 的值保持一致。
  • 使用用法:
defaultConfig {targetSdkVersion 28
}

三、写在最后

Gradle 的配置文件看起来好像挺乱,其实是因为我们没有进行整体的梳理,所以这段时间,小盆友会不断的进行整理并结合在项目中用到的分享出来。如果喜欢的话请给我一个赞,并关注我吧。文章中如有写的不妥的地方,请评论区与我讨论吧,共同进步。

defaultConfig——安卓gradle相关推荐

  1. gradle入门,安卓gradle入门

    http://www.bkjia.com/Androidjc/981624.html 随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse.但是新的IDE与以往的Eclipse ...

  2. splits——安卓gradle

    一.前言 今天分享 splits 配置,从字面意思知道有着 "切开" 的意思,他的作用其实是帮我们把 apk 包从不同维度进行"切开",减小apk的大小,从而让 ...

  3. signingConfigs——安卓 gradle

    目录 一.前言 二.signingConfigs 三.signingConfig 结构解析 四.signingConfig 属性 五.一些建议 六.写在最后 一.前言 今天分享 signingConf ...

  4. 安卓gradle报错

    在android开发过程中又报错了,这一次是版本错误第一步我们进行版本同步. 报错信息: android studio报错Error: Gradle project sync failed. Plea ...

  5. 基于安卓软件开发的Gradle教程

    基于安卓软件开发的Gradle教程 Gradle for Android Training Course Thursday, March 05, 2015 8:30 AM - 12:30 PM (Pa ...

  6. 用AndServer做安卓手机服务器

    用AndServer搭建手机服务器以及跨域问题解决 AndServer官方文档地址 AndServer简介 什么情况需要用? AndServer官方文档地址 https://yanzhenjie.co ...

  7. 目录大全_安卓面经_Android面经_150道安卓基础面试题全解析

    高级系列专栏: 安卓(安卓系统开发也要掌握) 想通关安卓面试,请看:<150道安卓高频面试题目录及答案链接> 想通关安卓系统面试,请看:<140道安卓系统Framework面试题目录 ...

  8. 配置构建变体build.gradle的配置

    google原文链接 https://developer.android.com/studio/build/build-variants.html#product-flavors 配置构建类型 您可以 ...

  9. 解决Android Studio 无法通过gradle 下载https://dl.google.com/android/repository/addons_list-3.xml 解决办法

    安卓gradle的时候,会弹出来这样报错,经常几个小时甚至一天就没有了. Task :prepareKotlinBuildScriptModel UP-TO-DATE IOException: htt ...

最新文章

  1. 怎么远程虚拟机中的mysql_如何从本地远程访问虚拟机内的Mysql服务器?
  2. 【网络流】解题报告: luogu P2045 方格取数加强版(k取方格数)(最大费用最大流)
  3. 如何增加MOSS 2007中list template和site template的最大值
  4. 数据结构(C语言实现》课后1-5章习题答案
  5. gcc 删除elf_ELF文件格式解析器 原理 + 代码
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1050:骑车与走路
  7. 一名拿到阿里offer的Java程序员分享三轮面试经验
  8. 数据库高可用(HA)技术有哪些?
  9. 主机无法访问虚拟机的httpd服务
  10. HiveQL:模式设计
  11. 如何在本地管理和切换多个 github 账号?
  12. 关于window.showModalDialog()返回值的学习
  13. 使用Jmeter对API进行性能测试
  14. Weblogic 视频教程免费下载
  15. 一张图搞懂什么是M0、M1 、M2
  16. 将ubuntu光盘作为安装源_Ubuntu之apt-get光盘源配置小结
  17. 利用Scrapy编写“1024网站种子吞噬爬虫”,送福利
  18. Steve Jobs 2005年于 Stanford University 毕业典礼上的演讲
  19. html代码自动排列,html页面如何实行数据排序?(附代码)
  20. 差分近似图像导数算子之Sobel算子

热门文章

  1. 五大技巧识别钓鱼网站
  2. 【uView】u-form表单样式、el-input的样式
  3. 提前了解:亚马逊入驻费用
  4. 敢问路在何方---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十三)
  5. 弱矩阵、强矩阵、和平衡矩阵组织结构的区别
  6. LCP 29. 乐团站位(leetcode)
  7. C语言解决常胜将军问题
  8. 房卡麻将分析系列之千里传音
  9. 关于VS2019不能打开源文件的解决方法
  10. 数字问题---位数上的数字