Gradle配置构建多Module项目

Gradle配置构建多Module项目

0x01 配置远程代码库

可以按如下方式声明特定的 Maven 或 Ivy 代码库:

1
2
3
4
5
6
7
8
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' } // public仓是包含central仓和jcenter仓的聚合仓
maven { url 'https://maven.aliyun.com/repository/google' } // 阿里镜像库
maven { url "file://local/repo/" } // 本地文件代码库
ivy { url "https://repo.example.com/ivy" } // Ivy代码库
}
}

0x02 统一配置Gradle依赖库版本

随着项目采用模块化,组件化开发,moudle 的个数也会随着增加,统一管理配置gradle就显得比较重要了。

1、在 project 根目录创建一个 config.gradle 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ext {  
// app 相关版本控制
versions = [
compileVersion : 26,
buildVersion : "26.0.2",

sdkMinVersion : 15,
sdkTargetVersion : 26,
appVersionCode : 520,
appVersionName : "1.0.0"
]
// support依赖
support = [
appcompat : "com.android.support:appcompat-v7:26.+",
recyclerview: "com.android.support:recyclerview-v7:26.+"
]
// 依赖
deps = [
glide : "com.github.bumptech.glide:glide:4.11.0"
]
}

2、在 Project 根目录下的 build.gradle 添加apply

1
apply from: 'config.gradle' 

3、在相应Moudle中调用

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
android {  
def versions = rootProject.ext.versions
compileSdkVersion versions.compileVersion
buildToolsVersion versions.buildVersion
defaultConfig {
applicationId "com.dench.wanandroid"
minSdkVersion versions.sdkMinVersion
targetSdkVersion versions.sdkTargetVersion
versionCode versions.appVersionCode
versionName versions.appVersionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
def dependencies = rootProject.ext.deps
def support = rootProject.ext.support

implementation support.appcompat
implementation support.recyclerview
implementation dependencies.glide
}

0x03 配置Flavor

创建产品变种与创建构建类型类似:将其添加到构建配置中的 productFlavors 代码块并添加所需的设置。产品变种支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig 代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值,如 applicationId

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
android {
defaultConfig {...}
buildTypes {
debug{...}
release{...}
}
// Specifies one flavor dimension.
flavorDimensions "version"
productFlavors {
demo {
dimension "version"
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
versionCode 30000 + android.defaultConfig.versionCode
}
full {
dimension "version"
applicationIdSuffix ".full"
versionNameSuffix "-full"
versionCode 20000 + android.defaultConfig.versionCode
}
}
}

0x04 创建源代码集

1、Gradle 要求:

在所有构建变体之间共享的所有内容创建 main/ 源代码集和目录。

将“debug”构建类型特有的 Java 类文件放在 src/debug/java/ 目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]

依次转到 MyApplication > Tasks > android,然后双击 sourceSets。Gradle 执行该任务后,系统应该会打开 Run 窗口以显示输出。

2、更改默认源代码集配置

1
2
3
4
5
6
7
8
9
android {
sourceSets {
main {
java.srcDirs = ['other/java']
res.srcDirs = ['other/res1', 'other/res2']
manifest.srcFile 'other/AndroidManifest.xml'
}
}
}

0x05 声明依赖项

1
2
3
4
5
6
dependencies {
// Adds the local "mylibrary" module as a dependency to the "free" flavor.
freeImplementation project(":mylibrary")
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

0x06 配置签名

1、在项目的根目录下创建一个名为 keystore.properties 的文件,并使其包含以下信息:

1
2
3
4
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

2、在 build.gradle 文件中,按如下方式加载 keystore.properties 文件(必须在 android 代码块前面):

1
2
3
4
5
6
7
8

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
// before android
android {

}

3、输入存储在 keystoreProperties 对象中的签名信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}

如需从环境变量获取这些密码,请添加以下代码:

1
2
storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")

0x07 apk重命名

1
2
3
4
5
6
7
8
9
android {
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.outputs.all {
outputFileName = "app_v${variant.versionName}.${buildTime}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk"
}
}
}
}

or

1
2
3
outputFileName = "app_v${versionName}.${buildTime}_${flavorName}_${buildType.name}.apk"
outputFileName = "../../${outputFileName}"
println outputFileName

0x08 将构建变量注入清单

1、如果您需要将变量插入在 build.gradle 文件中定义的 AndroidManifest.xml 文件,可以使用 manifestPlaceholders 属性执行此操作。此属性采用键值对的映射,如下所示:

1
2
3
4
5
6
android {
defaultConfig {
manifestPlaceholders = [hostName:"www.example.com"]
applicationId "com.example.myapp"
}
}

2、您可以将某个占位符作为属性值插入清单文件,如下所示:

1
2
3
4
<intent-filter ... >
<data android:scheme="http" android:host="${hostName}" ... />
<action android:name="${applicationId}.TRANSMOGRIFY" />
</intent-filter>

0x09 gradle自定义Java变量和资源值

在构建时,Gradle 将生成 BuildConfig 类,以便应用代码可以检查与当前构建有关的信息。您也可以从 Gradle 构建配置文件中使用 buildConfigField() 方法将自定义字段添加到 BuildConfig 类中,然后在应用的运行时代码中访问这些值。同样,您也可以使用 resValue() 添加应用资源值。

1
2
3
4
5
6
7
8
9
10
11
12
13
def buildTime = new Data().format("yyyyMMddHHmm", TimeZone.getTimeZone("GTM+08:00"))
android {
buildTypes {
release {
buildConfigField("String", "BUILD_TIME", "\"${buildTime}\"")
resValue("string", "build_time", "${buildTime}")
}
debug {
buildConfigField("String", "BUILD_TIME", "\"0\"")
resValue("string", "build_time", "0")
}
}
}

在应用代码中,您可以按如下方式访问属性:

1
2
Log.i(TAG, BuildConfig.BUILD_TIME);
Log.i(TAG, getString(R.string.build_time));

0x10 设定编码

1
2
3
4
5
allprojects {
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
}
作者

Dench

发布于

2020-12-20

更新于

2020-12-20

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×