优雅的配置 Android 项目

优雅的设置 versionCode 和 versionName

versionCode: 大于 0 的整数,用作内部版本号。数字必须是递增的,用于确定一个版本是否比另一个版本更新,数字越大表示版本越新。

versionName: 字符串,例如:“1.0.0”,用作显示给用户的版本号。

更多详细的内容前往 Google 文档 版本控制

在 Android Studio 中,我们通常是在 build.gradle 里面定义这两个值,如下:

1
2
3
4
5
6
7
8
android {
...
defaultConfig {
...
versionCode 1
versionName "1.0"
}
}

在之前的翻译文章配置 Android 项目-版本名和版本号中提到使用 Git 描述 versionCode 和 versionName,原文地址

自动 versionCode

使用 Git 仓库的 commit 数量作为 versionCode。使用命令 git rev-list --count <revision> , revision 可以是 HEAD, master, 也可以是 commit hash. 更多 git rev-list用法

通常我们使用当前分支的 commit 数量:

1
git rev-list --count HEAD

也可以使用所有的 commit 数量:

1
git rev-list --all --count

在 Android Studio 中这样使用:

1
2
3
4
5
6
7
8
9
10
def cmd = 'git rev-list HEAD --count'
def gitCommitCount = cmd.execute().text.trim().toInteger()

android {
...
defaultConfig {
...
versionCode gitCommitCount
}
}

自动 versionName

使用 Git 的 tag 作为 versionName。

首先,需要在当前分支中的 commit 打上 tag,使用命令 git tag <name> 如下:

1
git tag 0.0.1

然后使用命令 git describe --tags 获取当前的 tag.

在 Android Studio 中这样使用:

1
2
3
4
5
6
7
8
9
10
def cmd = 'git describe --tags'
def gitTag = cmd.execute().text.trim()

android {
...
defaultConfig {
...
versionName gitTag
}
}

在实际开发中,我们通常不会这样使用,tag 命名不适合用于 versionName.

优雅的设置 APK 文件名

Android Studio 3.0 以下版本

具体配置如下。如果需要指定输出路径,可以把 output.outputFile.parent 替换成特定的路径,比如 ./apk .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}

android {
...
buildTypes {
release {
...
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileName
if (buildType.name.equals('debug')) {
fileName = "package_debug_v${defaultConfig.versionName}.apk"
} else if (buildType.name.equals('release')) {
fileName = "package_official_v${defaultConfig.versionName}_${releaseTime()}.apk"
}
output.outputFile = new File(output.outputFile.parent, fileName)
}
}
}
}
}

Android Studio 3.0 以上版本

在 Android Studio 3.0 以上版本中 each()outputFile() 已经不可用,需要把 each 改为 all , output.outputFile = new File(output.outputFile.parent, fileName) 改为 outputFileName = fileName. 如果需要指定 APK 的输出路径,可以在后面加上 variant.packageApplication.outputDirectory = new File("./apk") , 如果不指定输出路径默认的是在 /app/build/outputs/apk .

优雅的设置签名文件

已知 Android 项目的目录结构如下:

1
2
3
4
5
|--project
|--app
|--build.gradle
|--release.properties
|--keystore

具体步骤为:

  1. 在项目的根目录新建文件 release.properties, 设置内容如下:
1
2
3
RELEASE_KEY_ALIAS=xxxx
RELEASE_KEY_PASSWORD=xxxx
RELEASE_STORE_PASSWORD=xxxx
  1. 在项目的根目录中放入签名文件 keystore
  2. 配置 app/build.gradle, 通常情况下 release 和 debug 我会都用自己的签名文件,方便调试,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
android {
...
signingConfigs {
Properties properties = new Properties()
File propFile = project.file('../release.properties')
if (propFile.exists()) {
properties.load(propFile.newDataInputStream())
}
release {
storeFile file('../keystore')
storePassword properties.getProperty("RELEASE_STORE_PASSWORD")
keyAlias properties.getProperty("RELEASE_KEY_ALIAS")
keyPassword properties.getProperty("RELEASE_KEY_PASSWORD")
}

debug {
storeFile file('../keystore')
storePassword properties.getProperty("RELEASE_STORE_PASSWORD")
keyAlias properties.getProperty("RELEASE_KEY_ALIAS")
keyPassword properties.getProperty("RELEASE_KEY_PASSWORD")
}
}
}

release.properties 和 keystore 都属于隐私文件,不应该上传到 git 仓库,记得添加到 .gitignore.

优雅的设置 sdk version

通常 Android Studio 中 Android 的项目结构如下:

1
2
3
4
5
6
|--project
|--app
|--build.gradle
|--lib
|--build.gradle
|--build.gradle

我们可以在顶级 build.gradle 配置:

1
2
3
4
5
6
7
8
9
10
allprojects {
...
ext {
buildToolsVersion = "27.0.3"
minSdkVersion = 14
targetSdkVersion = 26
compileSdkVersion = 26
supportVersion = "27.1.1"
}
}

之后在其他 module 的 build.gradle 可以这样使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
compileSdkVersion parent.ext.compileSdkVersion
defaultConfig {
...
minSdkVersion parent.ext.minSdkVersion
targetSdkVersion parent.ext.targetSdkVersion
...
}
...
}

dependencies {
implementation "com.android.support:appcompat-v7:$supportVersion"
...
}

注意:从 Android Plugin for Gradle 3.0.0 开始 build.gradle 可以不要再显式配置 buildToolsVersion. 默认情况如下表,更多关于 Android Plugin for Gradle 的介绍可以前往 Google 文档 查看。

Android Plugin for Gradle Gradle buildToolsVersion
2.3.0 3.3 or higher 25.0.0 or higher
3.0.0 4.1 or higher 26.0.2 or higher
3.1.0 4.4 or higher 27.0.3 or higher