Android 如何使用Gradle更改应用程序包的生成文件名?

Android 如何使用Gradle更改应用程序包的生成文件名?,android,gradle,android-gradle-plugin,android-app-bundle,Android,Gradle,Android Gradle Plugin,Android App Bundle,因此,要更改gradle android中生成的APK文件名,我可以执行以下操作: applicationVariants.output.all { outputFileName = "the_file_name_that_i_want.apk" } 对于生成的应用程序包文件,是否存在类似的情况?如何更改生成的应用程序包文件名?您可以使用以下内容: defaultConfig { applicationId "com.test.app" versionCode 1 vers

因此,要更改gradle android中生成的APK文件名,我可以执行以下操作:

applicationVariants.output.all {
    outputFileName = "the_file_name_that_i_want.apk"
}

对于生成的应用程序包文件,是否存在类似的情况?如何更改生成的应用程序包文件名?

您可以使用以下内容:

defaultConfig {
  applicationId "com.test.app"
  versionCode 1
  versionName "1.0"
  setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
}

现在,我已经为跨平台CLI执行编写了一种
Exec
模板,无论
命令行是什么。我的
RenameTask
可以检测Linux和Windows,以及
release
debug

属性
archivesBaseName
需要在
defaultConfig
中定义:

android {
    defaultConfig {
        setProperty("archivesBaseName", "SomeApp_" + "1.0.0")
    }
}
重命名Task extends Exec
执行重命名(不要与
类型:重命名混淆):

它还完成了另外两项任务:

// it defines tasks :renameBundleRelease & :renameBundleDebug
task renameBundleRelease(type: RenameTask, constructorArgs: ['release'])
task renameBundleDebug(type: RenameTask, constructorArgs: ['debug'])

// it sets finalizedBy for :bundleRelease & :bundleDebug
tasks.whenTaskAdded { task ->
    switch (task.name) {
        case 'bundleRelease': task.finalizedBy renameBundleRelease; break
        case   'bundleDebug': task.finalizedBy renameBundleDebug; break
    }
}
进步在于,它不会留下任何东西,并且可以将文件移动到任何需要的地方。

作为一种更通用的方法,下面将侦听添加的任务,然后为任何添加的
捆绑包*
任务插入重命名任务

只需将其添加到
build.gradle
文件的底部

注意:它将添加更多的任务,但这些任务将被跳过,因为它们与任何文件夹都不匹配。e、 g.
>任务:app:renamebundledevelopmentdebugresourcesab NO-SOURCE


我发现了一个更好的选择,可以在生成apk/aab时自动增加应用程序版本控制和自动重命名。解决方案如下(请记住在根文件夹上创建“version.properties”文件:

android {
     ...
     ...
    Properties versionProps = new Properties()
    def versionPropsFile = file("${project.rootDir}/version.properties")
    versionProps.load(new FileInputStream(versionPropsFile))
    def value = 0
    def runTasks = gradle.startParameter.taskNames
    if ('assemble' in runTasks || 'assembleRelease' in runTasks) {
        value = 1
    }
    def versionMajor = 1
    def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
    def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
    def versionNumber = versionProps['VERSION_NUMBER'].toInteger() + value
    versionProps['VERSION_PATCH'] = versionPatch.toString()
    versionProps['VERSION_BUILD'] = versionBuild.toString()
    versionProps['VERSION_NUMBER'] = versionNumber.toString()
    versionProps.store(versionPropsFile.newWriter(), null)

    defaultConfig {
    applicationId "com.your.applicationname"
    versionCode versionNumber
    versionName "${versionMajor}.${versionPatch}.${versionBuild}(${versionNumber})"
    archivesBaseName = versionName
    minSdkVersion 26
    targetSdkVersion 29
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    signingConfig signingConfigs.release
    setProperty("archivesBaseName","${applicationId}-v${versionName}")

    ...
}

来自@SaXXuM的网站和帖子解决方案非常有效!重命名工件不需要执行此任务。您可以直接在a
ndroid{}
块中调用
setProperty()
。我希望文件名中包含:

  • 应用程序id
  • 模块名
  • 版本名
  • 版本代码
  • 日期
  • 构建类型
以下是我在项目中使用它的方式:

构建.渐变

apply from: "../utils.gradle"

android {
    ...
    setProperty("archivesBaseName", getArtifactName(defaultConfig))
}
ext.getArtifactName = {
    defaultConfig ->
        def date = new Date().format("yyyyMMdd")
        return defaultConfig.applicationId + "-" + project.name + "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + "-" + date
}
utils.gradle

apply from: "../utils.gradle"

android {
    ...
    setProperty("archivesBaseName", getArtifactName(defaultConfig))
}
ext.getArtifactName = {
    defaultConfig ->
        def date = new Date().format("yyyyMMdd")
        return defaultConfig.applicationId + "-" + project.name + "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + "-" + date
}
结果是:com.example-app-1.2.0-10200000-20191206-release.aab


它对APK和AAB都有效。

根据Martin Zeitler的回答,我在Windows上做了以下操作:

请注意,在我的安装程序中,.aab文件是在release文件夹中创建的,它会根据此命令删除该文件夹中的所有其他文件

在我的应用程序的模块gradle中:

apply from: "../utils.gradle"

...

tasks.whenTaskAdded { task ->
    switch (task.name) {
        case 'bundleRelease':
            task.finalizedBy renameBundle
            break
    }
}
在utils.gradle中:

task renameBundle (type: Exec) {
    def baseName = getProperty('archivesBaseName')

    def stdout = new ByteArrayOutputStream()
    def stderr = new ByteArrayOutputStream()

    commandLine "copy.bat", rootProject.getProjectDir().getAbsolutePath() + "\\release\\${baseName}-release.aab", "<MY_AAB_PATH>\\${baseName}.aab", "D:\\Android\\studio\\release"
    workingDir = rootProject.getProjectDir().getAbsolutePath()
    ignoreExitValue true
    standardOutput stdout
    errorOutput stderr

    doLast {
        if (execResult.getExitValue() == 0) {
            println ":${project.name}:${name} > ${stdout.toString()}"
        } else {
            println ":${project.name}:${name} > ${stderr.toString()}"
        }
    }
}
注意第三个参数,确保您不使用对您重要的文件夹



编辑:为什么你可能会问2个命令使用.BAT。如果你尝试命令行“复制”…在Windows上它会导致“系统无法识别命令副本”。放置任何东西,如复制、REN、重命名等,都不起作用。

我不是要更改生成的APK文件名!我是要更改生成的应用程序包文件名!它们不一样。撤回我的投票,并添加了一个答案。是否可以将味道类型也添加到文件名中?使用味道效果不太好如果你需要同时构建多个。很好,很简单!对我来说很有效。这对Android Studio 3.5.2非常有效。你将在apk的末尾有buildType flavor。我们会在最后自动添加build flavor。这是最好的解决方案。嗨,我尝试过这个,但在我的场景中不起作用,因为我有多个flavors、 你能帮我做些什么吗?如果我使用“构建->生成签名包”,它对我不起作用。但是如果你使用终端构建,它就起作用了。(下面的命令“gradlew:app:bundleFlavor”)如果这不起作用,您的include可能不匹配。请尝试删除include并重命名,然后查看是否复制了任何内容。是否真的没有更好的方法找到aab文件的原始路径?现在不起作用,因为Android Studio有内置任务重命名为“rename${task.name.capitale()}aab”。我正在获得app.aab的重命名副本(留下两个文件)。如何删除app.aab?根据时间戳,似乎app.aap是在重命名后生成的,因此在同一重命名任务中删除它不起作用。任何帮助都非常有用appreciated@ScottB不能使用
Rename
任务进行删除;这将需要进一步的
delete
任务,该任务依赖于
ode>Copy
task(或Apache Ant集成以移动文件)。至少这种方法不会产生比所需任务更多的任务,正如公认的答案所做的那样-而且它在使用flavors时应该会更好,因为它们都有自己的最终任务名称。@ScottB:我也有同样的问题。你能找到解决方案吗?我尝试了dependsOn,但它没有删除旧文件。它不读取
dependsOn
和上面的
Exec
任务正在工作。很好的解决方案,但是在Windows上如何做同样的事情呢?我试着用ren或copy代替“mv”,但系统无法识别该命令!如果应用程序具有不同的风格,该怎么办?风格名称会自动添加到末尾?它是构建类型还是风格?这是最简单的方法。其他答案非常复杂。
COPY %1 %2
RMDIR /Q/S %3