想要实现的效果
- 通过运行Gradle的Task来执行打包操作,无需使用
Android Studio
的UI操作 - 指定APK文件的输出目录和文件名,需要包含:
版本类型
,根项目名
,打包时间
- 证书不加入版本控制,密码等敏感信息不写入
build.gradle
本例中:
- Gradle版本:8.7
- AGP版本:8.5.0
操作步骤
生成证书文件
本例中我们为debug
和release
版本分别创建一个证书文件,密码均使用UUID生成,放在项目根目录下的jks
目录中,该目录不加入版本控制 ,将其加入.gitignore
并标记为排除目录
- 在
Android Studio
中点击菜单Build
-Generate Signed App Bundle/APK
,直接选择下一步,点击Create New...
Key store path
为整数文件的保存路径,Password
为证书文件密码,后续对应storePassword
字段Key
标签下的:Alias
一般填debug
或release
,Password
为Alias密码,后续对应keyPassword
字段- 点击OK后文件就已生成好,原打包窗口直接取消退出
创建密码文件
jks
目录中创建文件props.properties
,内容如下:
properties
DEBUG_FILE=/jks/debug.jks
DEBUG_KEY_ALIAS=debug
DEBUG_STORE_PASSWORD=f3e592cc-****-****-****-************
DEBUG_KEY_PASSWORD=dc29857c-****-****-****-************
RELEASE_FILE=/jks/release.jks
RELEASE_KEY_ALIAS=release
RELEASE_STORE_PASSWORD=7d5fa3e1-****-****-****-************
RELEASE_KEY_PASSWORD=d0535f98-****-****-****-************
这里分别配置了debug
和release
版本的:证书路径,证书密码,Alias,Alias密码;具体值与上一步生成证书时填写的内容一致,后续build.gradle
文件将从这里引用
build.gradle
修改子项目的build.gradle
文件,加入如下内容,如果对应结构已存在,在其基础上增加,不要删除原内容:
groovy
//引入密码文件
def props = new Properties()
props.load(new FileInputStream(rootProject.file("/jks/props.properties")))
// 按照指定格式生成打包时间
static def packageTime() {
return new SimpleDateFormat("yyyy-MM-dd_HHmmss").format(new Date())
}
android {
applicationVariants.configureEach { variant ->
variant.outputs.configureEach { output ->
// 指定打包目录
variant.getPackageApplicationProvider().get().outputDirectory = rootProject.file("/apk/${buildType.name}")
// 指定打包文件名
outputFileName = "${rootProject.name}-${buildType.name}-${packageTime()}.apk"
}
}
// 签名配置,引用密码文件内容
signingConfigs {
debug {
storeFile rootProject.file(props['DEBUG_FILE'])
keyAlias props['DEBUG_KEY_ALIAS']
storePassword props['DEBUG_STORE_PASSWORD']
keyPassword props['DEBUG_KEY_PASSWORD']
v1SigningEnabled true
v2SigningEnabled true
}
release {
storeFile rootProject.file(props['RELEASE_FILE'])
keyAlias props['RELEASE_KEY_ALIAS']
storePassword props['RELEASE_STORE_PASSWORD']
keyPassword props['RELEASE_KEY_PASSWORD']
v1SigningEnabled true
v2SigningEnabled true
}
}
// 引用签名配置
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
}
}
}
执行Task
默认情况下右侧的Gradle Task列表中只有一两个任务,我们需要的任务没有显示出来:
-
点击菜单
File
-Setting
-
左侧选择
Experimental
,勾选Configure all Gradle tasks during Gradle Sync
,确认 -
随便修改一点
build.gradle
文件,点击弹出的提示执行同步操作,或者直接点击右上角工具栏的小象按钮执行同步,Task列表将生成完整的任务列表 -
在子项目的
Task
-other
折叠中即可看到assembleDebug
和assembleRelease
任务,对应两个版本的打包操作 -
此时直接执行还会报一个警告(但不影响APK生成),可以在
build.gradle
末尾增加如下内容解决groovy// 禁用任务 https://blog.csdn.net/ismartv_dagou2/article/details/127392262 tasks.configureEach { task -> if (task.name.contains("ReleaseApkListingFileRedirect")) { // 过滤release task.enabled = false } }