代码之家  ›  专栏  ›  技术社区  ›  Archie G. Quiñones

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

  •  8
  • Archie G. Quiñones  · 技术社区  · 6 年前

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

    生成的应用程序包文件是否也有类似的情况?如何更改生成的应用程序包文件名?

    4 回复  |  直到 6 年前
        1
  •  23
  •   David Medenjak    6 年前

    作为一种更通用的 Martin Zeitlers answer bundle* 添加的任务。

    build.gradle 文件。

    注意:它将添加比需要更多的任务,但这些任务将被跳过,因为它们与任何文件夹都不匹配。例如 > Task :app:renameBundleDevelopmentDebugResourcesAab NO-SOURCE

    tasks.whenTaskAdded { task ->
        if (task.name.startsWith("bundle")) {
            def renameTaskName = "rename${task.name.capitalize()}Aab"
            def flavor = task.name.substring("bundle".length()).uncapitalize()
            tasks.create(renameTaskName, Copy) {
                def path = "${buildDir}/outputs/bundle/${flavor}/"
                from(path)
                include "app.aab"
                destinationDir file("${buildDir}/outputs/renamedBundle/")
                rename "app.aab", "${flavor}.aab"
            }
    
            task.finalizedBy(renameTaskName)
        }
    }
    
        2
  •  53
  •   SaXXuM    6 年前

    defaultConfig {
      applicationId "com.test.app"
      versionCode 1
      versionName "1.0"
      setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
    }
    
        3
  •  6
  •   Martin Zeitler    4 年前

    现在我写了一些 Exec commandLine 是。我的 RenameTask 可以检测Linux&窗户,以及 release debug .

    财产 archivesBaseName 需要在中定义 defaultConfig :

    android {
        defaultConfig {
            setProperty("archivesBaseName", "SomeApp_" + "1.0.0")
        }
    }
    

    RenameTask extends Exec 执行重命名(不要与 type: Rename ):

    import javax.inject.Inject
    
    /**
     * App Bundle RenameTask
     * @author Martin Zeitler
    **/
    class RenameTask extends Exec {
        private String buildType
        @Inject RenameTask(String value) {this.setBuildType(value)}
        @Input String getBuildType() {return this.buildType}
        void setBuildType(String value) {this.buildType = value}
        @Override
        @TaskAction
        void exec() {
            def baseName = getProject().getProperty('archivesBaseName')
            def basePath = getProject().getProjectDir().getAbsolutePath()
            def bundlePath = "${basePath}/build/outputs/bundle/${this.getBuildType()}"
            def srcFile = "${bundlePath}/${baseName}-${this.getBuildType()}.aab"
            def dstFile = "${bundlePath}/${baseName}.aab"
            def os = org.gradle.internal.os.OperatingSystem.current()
            if (os.isUnix() || os.isLinux() || os.isMacOsX()) {
                commandLine "mv -v ${srcFile} ${dstFile}".split(" ")
            } else if (os.isWindows()) {
                commandLine "ren ${srcFile} ${dstFile}".split(" ")
            } else {
                throw new GradleException("Cannot move AAB with ${os.getName()}.")
            }
            super.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
        }
    }
    

    先进的是,它不会留下任何东西,一个人可以移动文件到任何地方,一个人想要的。

        4
  •  2
  •   Yousha Aleayoub    4 年前

    解决方案来自 @萨克斯库姆 工作太好了!任务不是重命名工件所必需的。你可以打电话 setProperty() ndroid {} 阻止。我希望文件名中有:

    • 应用程序id
    • 模块名称
    • 版本代码
    • 日期
    • 生成类型

    构建.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。

        5
  •  1
  •   kabayaba    5 年前

    我发现了一个更好的选择,当你生成一个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}")
    
        ...
    }
    

    贷记 this this 邮递

        6
  •  0
  •   3c71    4 年前

    根据Martin Zeitler的回答,我在Windows上做了这个:

    bug report

    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()}"
            }
        }
    }
    

    COPY %1 %2
    RMDIR /Q/S %3
    

    注意第三个参数,以确保您不使用对您重要的文件夹。

    编辑:为什么你可能会问两个命令的.BAT。如果您尝试命令行“copy”。。。在Windows上,它会导致“系统无法识别命令副本”。把任何东西,如复制,任,重命名等,将不起作用。