Android-gradle 使用技巧打造通用的 gradle 脚本

使用 gradle 打造通用的 配置文件

前言

当使用组件化架构的时候,用通用的 gradle 能够实现统一管理,一行代码就能引入全部配置,极大的降低了耦合度

配置项目的属性 config_build_app.gradle

新建一个 config_build_app.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
ext {
android {
//==========================================================================================
// 配置多环境
//==========================================================================================


//配置变种 例如 开发环境需要将某个引入编译,线上环境不需要引入,则需要添加变种
//命名规则 维度 + Api ,如下
//引入 方式eg developApi project(':lib_s3')
configurations {
productApi
developApi
}

//版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
flavorDimensions "versionCode"

//添加维度
productFlavors {



//开发
develop {
//包名
applicationId "com.allens.unitygame"
//app 名称 需要将 xml 中的app_name 删除
resValue "string", "app_name", "Game"

//添加默认的配置
buildConfigField("Boolean", "isDebug", "true")
buildConfigField("String", "HostUrl", "\"http://134.175.88.222/app/\"")

//版本号
versionCode 1
//版本名称
versionName "1.0"
}


//生产环境
product {
applicationId "com.allens.unitygame"
resValue "string", "app_name", "Game"
buildConfigField("Boolean", "isDebug", "false")
buildConfigField("String", "HostUrl", "\"http://134.175.88.222/app/\"")

//版本号
versionCode 1
//版本名称
versionName "1.0"
}
}

//==========================================================================================
// 获取git版本号 需要将项目启动git
//==========================================================================================
def getGitHash = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = stdout
}
return stdout.toString().trim()
}

//==========================================================================================
// 签名配置
//==========================================================================================
signingConfigs {//签名配置
release {//发布版签名配置
// storeFile file('../allens.jks')//密钥文件路径
// storePassword "allens123456"//密钥文件密码
// keyAlias "allens"//key别名
// keyPassword "allens123456"//key密码
}
debug {
// storeFile file('../allens.jks')//密钥文件路径
// storePassword "allens123456"//密钥文件密码
// keyAlias "allens"//key别名
// keyPassword "allens123456"//key密码
}
}


//==========================================================================================
// 编译配置
//==========================================================================================
buildTypes {
release.initWith(buildTypes.release)
release {
//添加此行代码,可以在release包下打印log,上线的时候一定要改成false
debuggable false
// 打开混淆
minifyEnabled true
// Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
// 前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,
// 后一个文件是自己的定义混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//build 使用的配置信息
signingConfig signingConfigs.release
//可以添加默认的配置
buildConfigField("Boolean", "isDebug", "false")
buildConfigField "String", "GitHash", "\"${getGitHash()}\""
}
debug {
debuggable true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
buildConfigField("Boolean", "isDebug", "true")
buildConfigField "String", "GitHash", "\"${getGitHash()}\""
}
}

}
}

编译配置 签名配置 配置多环境 等基础配置,只在主 app 中引用就行了

需要注意,脚本中配置了 获取 git 版本 项目在添加之前 需要配置git 否则会编译失败,当然也可以先将 配置 git 去掉 ,等添加了git 之后再添加

配置项目的编译版本以及功能开开关 config_build_module.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
apply plugin: 'kotlin-kapt'
ext {
android {
//编译的SDK版本
compileSdkVersion 29
//编译的Tools版本
buildToolsVersion "29.0.2"

//==========================================================================================
// 默认配置
//==========================================================================================
defaultConfig {
//支持的最低版本
minSdkVersion 21
//支持的目标版本
targetSdkVersion 29
//版本号
versionCode 1
//版本名称
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"


//开启 Dex 分包
multiDexEnabled true

}
//==========================================================================================
// other configuration (buildTypes, defaultConfig, etc.)
// 在该packagingOptions块内添加该块,android以将原子函数模块从包中排除,并防止出现警告。
//==========================================================================================
packagingOptions {
exclude 'META-INF/atomicfu.kotlin_module'
}


//==========================================================================================
// 从Android Gradle Plugin 4.0.0-alpha05这里开始,有一个称为buildFeatures启用构建功能的新块。
// 因此,为了使用新的AGP插件启用数据绑定,您必须执行以下操作
//==========================================================================================
buildFeatures{
//==========================================================================================
// 启用 DataBinding
//==========================================================================================
dataBinding = true
//==========================================================================================
// 启用 viewBinding
//==========================================================================================
// viewBinding = true
}

//==========================================================================================
// 出现错误不终止编译
//==========================================================================================
lintOptions {
abortOnError false
}

//==========================================================================================
// 使用 httpclient (7.0之前使用的网络请求非HttpURLClient)
//==========================================================================================
useLibrary 'org.apache.http.legacy'


//==========================================================================================
// 支持java 8
//==========================================================================================
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

//==========================================================================================
// Cannot inline bytecode built with JVM target 1.8
// into bytecode that is being built with JVM target 1.6
//==========================================================================================
kotlinOptions {
jvmTarget = "1.8"
}


//==============================================================================================
// dex 配置
//==============================================================================================
dexOptions {
jumboMode true
dexInProcess true
//是否预索引库。这可以改善增量构建,但是干净的构建可能会更慢。
preDexLibraries true
//指定-Xmx调用dx时的值。示例值为"2048m"。
javaMaxHeapSize "4g"
//可用于dex的最大并发进程数。默认为4
maxProcessCount 6
//运行dx时要使用的线程数。默认为4
threadCount 4
//将所有带有运行时注释的类保留在旧版multidex中的主dex中。
keepRuntimeAnnotatedClasses false
}


//==========================================================================================
// 源文件路径设置
//==========================================================================================
sourceSets {
main {
//java 代码路径
java.srcDirs = [
'src/main/java', //Java
'src/main/kotlin' //Kotlin
]


//资源路径 当需要将layout 进行分包时候可以进行配置 eg 'src/main/res/layout/activity',
res.srcDirs =
[
'src/main/res'
]

//jni 路径
jniLibs.srcDirs = [
'libs',
'jniLibs'
]
}
}


//==========================================================================================
// 当引入的其他model下的jar 或者 aar 时候 需要配置
// eg: '../component_audio_conversion/libs',
//==========================================================================================
//使用libs 下面的依赖
repositories {
flatDir {
dirs 'libs'
}
}


//==========================================================================================
// lib 模块是否开启自定义的混淆
//==========================================================================================
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

}
}

这里主要是给所有 model 使用 ,主要就是 是一些 依赖引用,配置选项

配置默认的依赖 config_lib_def

新建一个 config_lib_def.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apply plugin: 'kotlin-kapt'


ext {

//Kotlin项目中的配置方式 ARouter
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}

dependencies {
//==========================================================================================
// 默认
//==========================================================================================
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
}

所有的 model 新建的时候统一实现这个 gradle

第三方依赖

创建 config_lib_remote.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ext {
dependencies {

//==========================================================================================
// 第三方
//==========================================================================================

//数据库组件
api project(":lib_db")
//基础组件
api project(":lib_base")
//组件化框架
implementation 'com.alibaba:arouter-api:1.5.0'
kapt 'com.alibaba:arouter-compiler:1.2.2'
//mvvm 手脚架
implementation 'com.github.JiangHaiYang01:BaseMvvM:0.0.2'
//log 日志框架
implementation 'com.github.JiangHaiYang01:LogHelper:0.0.2'
//屏幕适配
implementation 'me.jessyan:autosize:1.1.2'
//view lifecycle
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha03'
//recyclerView
implementation 'com.android.support:recyclerview-v7:28.0.0'
//adapter 框架
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'
//选择器
implementation 'com.contrarywind:Android-PickerView:4.1.9'

//navigation
def nav_version = "2.3.0-alpha05"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

}
}

这样写的好处

以后新建一个 model

直接 在 model 的 build.gradle

1
2
3
4
5
6
//编译配置 补充
apply from: '../config_build_module.gradle'
//项目配置
apply from: '../config_lib_def.gradle'
//第三方依赖
apply from: '../config_lib_remote.gradle'

就完成了所有选项的配置

极大的耦合了项目开发