Android Gradle 使用Task打包APK配置指定输出目录和文件名

想要实现的效果

  1. 通过运行Gradle的Task来执行打包操作,无需使用Android Studio的UI操作
  2. 指定APK文件的输出目录和文件名,需要包含:版本类型根项目名打包时间
  3. 证书不加入版本控制,密码等敏感信息不写入build.gradle

本例中:

  1. Gradle版本:8.7
  2. AGP版本:8.5.0

操作步骤

生成证书文件

本例中我们为debugrelease版本分别创建一个证书文件,密码均使用UUID生成,放在项目根目录下的jks目录中,该目录不加入版本控制 ,将其加入.gitignore并标记为排除目录

  1. Android Studio中点击菜单 Build-Generate Signed App Bundle/APK,直接选择下一步,点击Create New...
  2. Key store path为整数文件的保存路径,Password为证书文件密码,后续对应storePassword字段
  3. Key标签下的: Alias一般填debugreleasePassword为Alias密码,后续对应keyPassword字段
  4. 点击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-****-****-****-************

这里分别配置了debugrelease版本的:证书路径,证书密码,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列表中只有一两个任务,我们需要的任务没有显示出来:

  1. 点击菜单File-Setting

  2. 左侧选择Experimental,勾选Configure all Gradle tasks during Gradle Sync,确认

  3. 随便修改一点build.gradle文件,点击弹出的提示执行同步操作,或者直接点击右上角工具栏的小象按钮执行同步,Task列表将生成完整的任务列表

  4. 在子项目的 Task-other折叠中即可看到assembleDebugassembleRelease任务,对应两个版本的打包操作

  5. 此时直接执行还会报一个警告(但不影响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
        }
    }
相关推荐
一碗情深38 分钟前
Android 开发环境解析:从SDK、NDK到版本兼容性指南
android·安卓·sdk·ndk
00后程序员张1 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_916013741 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
周杰伦的稻香3 小时前
MySQL中的空间碎片率计算分析
android·数据库·mysql
用户094 小时前
MVI架构如何改变Android开发模式
android·面试·kotlin
梦终剧4 小时前
【Android之路】.sp和界面层次结构
android
2501_916008894 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan5 小时前
Android Handler源码阅读
android
雪饼android之路5 小时前
【Android】 android suspend/resume总结(3)
android·linux
00后程序员张5 小时前
iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动
android·ios·小程序·uni-app·swiftui·cocoa·iphone