目录
一、前言
二、defaultConfig
1、搞清楚几个问题
2、defaultConfig 的存在形式
3、defaultConfig 中属性的意义
4、defaultConfig 中方法的意义
三、写在最后
我们在安卓开发中,编译的任务是由 gradle 来负责的。但很多时候我们进入 build.gradle
文件中,有种似懂非懂的感觉,所以小盆友总结并分享自己学习到的点滴。
话不多说,今天分享的是在我们的每个模块下(应用级)build.gradle
文件中,android
下的 defaultConfig
属性
在分享 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
类(其类的关系如下图)。
apply
会调用 PluginAware
的 void apply(Map options);
方法,进行设置插件;android
,并不是 gradle 中所带的,而是第一行代码插件所带来。具体会映射为 com.android.build.gradle.AppExtension
类;dependencies
,会调用 Project
的 void dependencies(Closure configureClosure);
方法;defaultConfig 会被映射为 DefaultConfig
类,其继承结构图如下
下面是官方给出的文档,我们以 3.3 的版本进行讲解,其他版本可能有些许的小改动。
defaultConfig官方文档 传送门
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"
}
}
}
cmake 具体参数 传送门
ndkBuild 具体参数 传送门
defaultConfig {
dimension 'debug'
......省略其他配置
}
library
中,包括我们以aar形式导入的 library ,或是直接创建的 library。它的作用是,负责该 library 被进行编译时的混淆规则,我们在 主App 的模块下则可以不用再管理各个 library 的混淆规则,会直接使用各个 library 的混淆规则文件。defaultConfig {
consumerProguardFiles 'consumer-rules.pro'
......省略其他配置
}
// 因为该属性是一个 List 类型,如果需要多个文件配置,则如下所示
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;
值的一提的是,我们设置 String 类型的参数时,需要加上 “” 双引号(如例子中的name属性)。切记!
defaultConfig {
consumerProguardFile('consumer-rules.pro')
}
defaultConfig {
consumerProguardFiles('consumer-rules.pro', 'zincPower-rules.pro',.....)
}
defaultConfig {
// 最高支持28版本
maxSdkVersion 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 的配置文件看起来好像挺乱,其实是因为我们没有进行整体的梳理,所以这段时间,小盆友会不断的进行整理并结合在项目中用到的分享出来。如果喜欢的话请给我一个赞,并关注我吧。文章中如有写的不妥的地方,请评论区与我讨论吧,共同进步。