目录
1、前言
2、defaultConfig
一、搞清楚几个问题
二、defaultConfig 的存在形式
三、defaultConfig 中属性的意义
四、defaultConfig 中方法的意义
3、写在最后
html
咱们在安卓开发中,编译的任务是由 gradle 来负责的。但不少时候咱们进入 build.gradle
文件中,有种似懂非懂的感受,因此小盆友总结并分享本身学习到的点滴。java
话很少说,今天分享的是在咱们的每一个模块下(应用级)build.gradle
文件中,android
下的 defaultConfig
属性android
在分享 defaultConfig
前,咱们须要先弄清楚几个问题,这几问题以前一直困扰着小盆友,因此顺便记录和分享下。git
(1)build.gradle
最终是以什么形式存在。 (2)为何 每一个模块下的 build.gradle
文件的最开始都有 apply plugin: 'com.android.library'
这样一行代码。程序员
自动生成完的 build.gradle
格式以下所示github
apply plugin: 'com.android.library'
android {
// 省略一些配置
}
dependencies {
// 省略依赖
}
复制代码
这个文件最终会被转换为 org.gradle.api.Project
类(其类的关系以下图)。api
apply
会调用 PluginAware
的 void apply(Map<String, ?> options);
方法,进行设置插件;android
,并非 gradle 中所带的,而是第一行代码插件所带来。具体会映射为 com.android.build.gradle.AppExtension
类;dependencies
,会调用 Project
的 void dependencies(Closure configureClosure);
方法;defaultConfig 会被映射为 DefaultConfig
类,其继承结构图以下微信
下面是官方给出的文档,咱们以 3.3 的版本进行讲解,其余版本可能有些许的小改动。架构
defaultConfig官方文档 传送门app
defaultConfig {
// applicationId 应用的包名
// applicationId 会替换 AndroidManifest.xml 中的 manifest 标签下 package 的 value
applicationId "com.zinc.gradlestudy"
......省略其余配置
}
复制代码
defaultConfig {
// 若此时 applicationId 为 com.zinc.gradlestudy,则最终会造成 com.zinc.gradlestudy.debug 的包名
applicationIdSuffix "debug"
......省略其余配置
}
复制代码
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"
}
}
}
复制代码
defaultConfig {
dimension 'debug'
......省略其余配置
}
复制代码
library
中,包括咱们以aar形式导入的 library ,或是直接建立的 library。它的做用是,负责该 library 被进行编译时的混淆规则,咱们在 主App 的模块下则能够不用再管理各个 library 的混淆规则,会直接使用各个 library 的混淆规则文件。defaultConfig {
consumerProguardFiles 'consumer-rules.pro'
......省略其余配置
}
// 由于该属性是一个 List<File> 类型,若是须要多个文件配置,则以下所示
defaultConfig {
consumerProguardFiles 'consumer-rules.pro','zincPower-rules.pro'
......省略其余配置
}
复制代码
annotationProcessor
时所须要的参数。defaultConfig {
javaCompileOptions {
annotationProcessorOptions{
arguments = []
classNames ''
....
}
}
......省略其余配置
}
复制代码
JavaCompileOptions 能够配置的具体参数,请进传送门
AndroidManifest.xml
中替换的参数,通常用于多渠道中使用,不会在 defaultConfig 中使用。这里想配置咱们应用的logo,则能够在 gradle 中使用下面这段
defaultConfig {
manifestPlaceholders = [APP_LOGO_ICON: "@mipmap/ic_logo"]
}
复制代码
而后在 AndroidManifest.xml
中使用,使用 ${你配置的变量名}
// 在 application 中使用替换,还须要多添加 tools:replace 这一标签,将咱们须要替换的名称写上,例如这里的 android:icon
<application android:allowBackup="true" android:icon="${APP_LOGO_ICON}" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="android:icon">
......
复制代码
64K 引用限制问题官方文档 传送门
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 {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
复制代码
最后别忘了在 AndroidManifest.xml
中使用咱们在上面的 Application。
classs.dex
。咱们在第 3.8 小点,分享到使用了多包处理,有时咱们须要将一些主要的类打包进主包,则可使用该属性。defaultConfig {
multiDexKeepFile file('multidex-config.txt')
...
}
复制代码
multidex-config.txt 中的书写则以下,每个文件则为一行
com/example/MyClass.class
com/example/TestClass.class
复制代码
defaultConfig {
multiDexKeepFile file('multidex-config.pro')
...
}
复制代码
multidex-config.pro 中的写法以下
// 将会保留全部的在com.example package的类
-keep class com.example.** { *; }
复制代码
armeabi-v7a
,不会包含其余的架构,例如 "X86"。defaultConfig {
// ndk中,目前只有 abiFilter 一个属性,因此 ndk 目前来讲只用于 abi 的过滤
ndk {
abiFilter 'armeabi-v7a'
}
...
}
复制代码
NdkOptions的具体可配参数见官方文档 传送门
buildTypes
中结合 minifyEnabled
一块儿使用。generatedDensities
和 useSupportLibrary
。分别的用处以下defaultConfig {
vectorDrawables {
// 若是 minSdkVersion 小于 21,只生成mdpi的png
generatedDensities 'mdpi'
// 设置为 true,会忽略 generatedDensities ,会加入svg兼容包,不会再产生png
useSupportLibrary true
}
}
复制代码
矢量图的用法,能够看小盆友的另外一片文章
versionName
的区别在小盆友看来,versionCode
是给程序员看的,versionName
是给产品经理和用户看的。defaultConfig {
versionCode 1000
......
}
复制代码
defaultConfig {
versionName "1.0.0"
.....
}
复制代码
defaultConfig {
// 若是 versionName "1.0.0" ,则最终的版本名为 1.0.0.test
versionNameSuffix ".test"
.....
}
复制代码
// 值的注意的是 value 的值是原样放置,咱们经过使用方法一节来了解
<type> <name> = <value>
复制代码
defaultConfig {
// 能够经过 BuildConfig 进行获取
buildConfigField('String', 'name', '"zinc"')
buildConfigField('int', 'age', '26')
.....
}
复制代码
最终会生成以下图的配置,咱们能够经过下面代码进行获取
String name = BuildConfig.name;
int age = BuildConfig.age;
复制代码
defaultConfig {
consumerProguardFile('consumer-rules.pro')
}
复制代码
defaultConfig {
consumerProguardFile('consumer-rules.pro', 'zincPower-rules.pro',.....)
}
复制代码
defaultConfig {
// 最高支持28版本
minSdkVersion 28
}
复制代码
defaultConfig {
// 最低支持19版本
minSdkVersion 19
}
复制代码
咱们的项目结构以下
zinclibrary
的
build.gradle
中编写了以下渠道配置
// 建立 风味维度
flavorDimensions('zinc', 'handsome')
// 建立产品风味
productFlavors {
minApi13{
dimension 'zinc'
}
minApi23{
dimension 'zinc'
}
x86{
dimension 'handsome'
}
arm64{
dimension 'handsome'
}
}
复制代码
此时若是直接在 app
的 build.gradle
中添加依赖,同步时便会出错
dependencies {
...忽略其余依赖
implementation project(":zinclibrary")
}
复制代码
因此咱们须要在 app
的 build.gradle
中使用这个参数进行忽略 library 中带来的维度和风味,即便用以下代码
defaultConfig {
missingDimensionStrategy 'zinc', 'minApi13', 'minApi23'
missingDimensionStrategy 'handsome', 'x86', 'arm64'
}
复制代码
defaultConfig {
// 这样咱们编译出的apk中,只有 “默认” 和 “中文zh” 两种资源
resConfig "zh"
}
复制代码
defaultConfig {
// 这样咱们编译出的apk中,只有 “默认” 、 “中文zh” 和 “英文en” 两种资源
resConfigs "zh","en"
}
复制代码
defaultConfig {
// 添加至 res/value,经过 R.string.age 获取
resValue('string', 'age', '12year')
}
复制代码
defaultConfig {
targetSdkVersion 28
}
复制代码
Gradle 的配置文件看起来好像挺乱,实际上是由于咱们没有进行总体的梳理,因此这段时间,小盆友会不断的进行整理并结合在项目中用到的分享出来。若是喜欢的话请给我一个赞,并关注我吧。文章中若有写的不妥的地方,请评论区或加我微信与我讨论吧,共同进步。
欢迎加我微信,进行更多的交流