想要实现的效果
- 通过运行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,内容如下:
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文件,加入如下内容,如果对应结构已存在,在其基础上增加,不要删除原内容:
//引入密码文件
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 truev2SigningEnabled true}release {storeFile rootProject.file(props['RELEASE_FILE'])keyAlias props['RELEASE_KEY_ALIAS']storePassword props['RELEASE_STORE_PASSWORD']keyPassword props['RELEASE_KEY_PASSWORD']v1SigningEnabled truev2SigningEnabled 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末尾增加如下内容解决// 禁用任务 https://blog.csdn.net/ismartv_dagou2/article/details/127392262 tasks.configureEach { task ->if (task.name.contains("ReleaseApkListingFileRedirect")) { // 过滤releasetask.enabled = false} }