“app-release.apk”이 기본 생성 된 APK 이름을 변경하는 방법


155

Android Studio에서 서명 된 apk 를 생성 할 때마다 기본적으로 app-release.apk로 이름이 지정됩니다 ...

프롬프트를 표시하고 apk에 할당 해야하는 이름 (이클립스에서 수행되는 방식)을 묻도록 설정을 할 수 있습니까?

내가하는 일은 APK가 생성 된 후 이름을 바꿉니다. 이것은 오류를주지 않지만 프롬프트를 얻기 위해 설정을 변경할 수있는 진정한 방법이 있습니다.

노트::

apk android studio 생성 중 위치를 선택하라는 메시지가 표시됩니다 (전용)여기에 이미지 설명을 입력하십시오


1. 빌드 변형을 변경하여 릴리스 2. 메뉴 모음에서 빌드-> 서명 된 APK 생성을 선택하십시오. 이런 식으로 서명 apk 생성
Prabs

여기에있는 모든 답변이 정확하지 않습니다 ..이 문제는 여전히 그들 중 하나를 사용하여 발생합니다 ... 문제는 스튜디오에서 APK 이슈의 이름을 캐싱하고 새로 생성 된 것을 사용하는 대신 캐시 된 이름을 계속 사용하는 것입니다!
TacB0sS

답변:


142

예, 우리는 그것을 바꿀 수 있지만 좀 더 관심을 가지고

이것 좀 봐

이제 프로젝트 의 build.gradle 에 이것을 추가 하면서 프로젝트의 빌드 변형 을 확인했는지 확인하십시오. release or Debug 여기서 빌드 변형을 설정 release했지만 디버그로 선택할 수도 있습니다.

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig getSigningConfig()
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def date = new Date();
                        def formattedDate = date.format('yyyyMMddHHmmss')
                        output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace("-release", "-" + formattedDate)
    //for Debug use output.outputFile = new File(output.outputFile.parent,
   //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
                    }
                }
            }
        }

다른 접근 방식으로 할 수 있습니다.

 defaultConfig {
        applicationId "com.myapp.status"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        setProperty("archivesBaseName", "COMU-$versionName")
    }

build.gradle에서 Set 속성 방법을 사용 하고 프로젝트를 실행하기 전에 gradle을 동기화하는 것을 잊지 마십시오. 문제가 해결 될 것입니다 :)

새로운 접근 방식이 구글 업데이트로 최근에 추가 처리하기 위해 이제 맛 또는 변형 출력에 따라 빌드의 이름을 바꿀 수 있습니다 소스 개발자 안드로이드 문서에서입니다 아래 // 자세한 내용은 위의 문서 링크를 따라 들어
변형 출력을 조작하기 위해 변형 API를 사용하여 깨 새로운 플러그인으로. 아래 그림과 같이 빌드 시간 동안 APK 이름 변경과 같은 간단한 작업에도 여전히 작동합니다.

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

.aab 번들 이름 바꾸기 이것은 David Medenjak의 답변입니다.

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)
    }
//@credit to David Medenjak for this block of code
}

위의 코드가 필요합니까

내가 안드로이드 스튜디오 3.3.1의 최신 버전에서 관찰 한 것

.aab 번들의 이름 바꾸기는 이전 코드에 의해 수행되며 작업 이름 바꾸기가 필요하지 않습니다.

그것이 당신에게 도움이되기를 바랍니다. :)


그래서 formattedDate의 instaed "아비 쉑 차 우비"처럼 거기에 문자열을 사용
아비 쉑 차 우비

versionName어떻게 든 추가 할 수 있습니까?
zygimantus

@AbhishekChaubey APK 이름을 변경 한 후에는 더 이상 Android Studio를 통해 코드를 실행할 수 없습니다. 도와주세요 ... 그것은 보여줍니다The APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk

프로젝트를 다시 한 번 또는 가까운 빌드 디렉토리에서 안드로이드 스튜디오 및 삭제 출력 폴더를하고 당신을 도울 수 .hope 다음 프로젝트를 다시 빌드하거나 청소하여 그것을 시도 @BeeingJk
아비 쉑 차 우비를

4
Android Studio 3.0에서 output.outputFile은 읽기 전용입니다. @ johnny-doe의 대답 은 새로운 솔루션입니다.
krishh

79

최신 안드로이드 gradle 플러그인 ( 3.0 ) 에서 오류가 발생할 수 있습니다 .

읽기 전용 속성 'outputFile'의 값을 설정할 수 없습니다

마이그레이션 안내서 에 따르면 다음과 같은 접근 방식을 사용해야합니다.

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${applicationName}_${variant.buildType.name}_${defaultConfig.versionName}.apk"
    }
}

참고 2 주요 변경 사항 :

  1. alleach변형 출력을 반복하는 대신 지금 사용됩니다 .
  2. outputFileName 파일 참조를 변경하는 대신 속성이 사용됩니다.

1
이제 이것은 Android Studio 3.0 Beta 7에 대한 2017 년 10 월의 정답입니다.
krishh

3
내 경우에는 (명확성을 위해 단축)로 ${applicationName}해결되었습니다 BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript.... 이로 인해 포장이 실패했습니다. 나를 위해 ${applicationId}또는 ${archivesBaseName}더 나은 옵션이었습니다. 또한 ${defaultConfig.versionName}나를 위해 null입니다. 그래서 ${applicationId}_${variant.name}-${variant.versionName}나는 결국 끝났습니다.
pcdev

1
@KGCybeX 일반적으로이 코드는와 android{}같은 수준의 섹션에서 사용 됩니다 defaultConfig{}. 구문 을 android{}사용 하는 것 외에는 사용할 수 있습니다android.applicationVariants.all { }
Johnny Doe

1
당신은 생명의 은인입니다.)
Rik van Velzen

1
Gradle 5.1.1에서 작업
Williaan Lopes

53

전체 파일 이름을 변경하기 위해 @Abhishek Chaubey 답변을 수정했습니다.

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-") //"MyAppName" -> I set my app variables in the root project
                newName = newName.replace("-release", "-release" + formattedDate)
                //noinspection GroovyAssignabilityCheck
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
    debug {
    }
}

다음과 같은 파일 이름이 생성됩니다. MyAppName-release20150519121617.apk


3
Gradle
Mehdiway

1
: 사용자 지정 'APPNAME'속성을 추가 루트 프로젝트에 같은 코드를 추가하기 위해 project.ext { appName = 'MyApplicatioName' }
MIHA

2
@ ranma2913 APK 이름을 변경 한 후에는 더 이상 Android Studio를 통해 코드를 실행할 수 없습니다. 도와주세요 ... APK 파일 /Users/.../outputs/apk/NewName-debug-20161004172815.apk가 디스크에 존재하지 않음을 보여줍니다.
Beeing Jk

1
MyAppName을 수동으로 설정하는 대신 rootProject.name일식과 같은 프로젝트 이름을 제공합니다.
Hiren Dabhi

3
Android Studio 3.0부터는 output.outputFile읽기 전용입니다. @ johnny-doe의 대답 은 새로운 솔루션입니다.
krishh

50

(Android Studio 3.0 및 Gradle 4에서 작동하도록 편집 됨)

더 복잡한 apk 파일 이름 변경 옵션을 찾고 있었고 다음 데이터로 apk의 이름을 바꾸는이 솔루션을 작성했습니다.

  • 빌드 타입
  • 버전
  • 데이트

다음과 같은 APK를 얻을 수 있습니다 : myProject_dev_debug_1.3.6_131016_1047.apk .

전체 답변은 여기에서 찾을 수 있습니다 . 그것이 도움이되기를 바랍니다!

build.gradle에서 :

android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
        debug {
            minifyEnabled false
        }
    }

    productFlavors {
        prod {
            applicationId "com.feraguiba.myproject"
            versionCode 3
            versionName "1.2.0"
        }
        dev {
            applicationId "com.feraguiba.myproject.dev"
            versionCode 15
            versionName "1.3.6"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def project = "myProject"
            def SEP = "_"
            def flavor = variant.productFlavors[0].name
            def buildType = variant.variantData.variantConfiguration.buildType.name
            def version = variant.versionName
            def date = new Date();
            def formattedDate = date.format('ddMMyy_HHmm')

            def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

            outputFileName = new File(newApkName)
        }
    }
}

2
큰. 할 수 만 개선은 일정의 일부 맛이나 buildType에 대한 (버전 또는 날짜없이) 파일 이름 (맛 == "DEV"|| buildType = "디버그")입니다
토니 BenBrahim

여기서 "각"대신 "모두"가 중요해 보입니다.
Xan-Kun Clark-Davis

오류가 발생 > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData합니다. 단순히로 바꾸지 buildType = variant.buildType.name않겠습니까?
soshial

그것은 말한다"file.apk" is not writeable
하면서 스토리지 Haqiqian

38

훨씬 짧은 방법은 다음과 같습니다.

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
    //or so
    archivesBaseName = "$applicationId-v$versionCode($versionName)"
}

com.blahblah.example-v1 (1.0) -debug.apk (디버그 모드에서)라는 이름을 지정합니다.

Android Studio는 기본적으로 빌드 유형 이름으로 versionNameSuffix를 추가합니다.이를 무시하려면 다음을 수행하십시오.

buildTypes {
    debug {
        ...
        versionNameSuffix "-MyNiceDebugModeName"
    }
    release {
        ...
    }
}

디버그 모드에서의 출력 : com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk


3
감사. 이것은 가장 빠른 옵션입니다!
John

1
참고 참고 archiveBaseName을 로컬 gradle.properties 파일에 추가 할 수 있습니다.
Ge3ng

정말 더 분명해 보입니다. 이것이 선호되는 솔루션이 아닌 이유는 무엇입니까?
Xan-Kun Clark-Davis

6

@Fer 답변을 기반으로보다 보편적 인 솔루션을 작성했습니다.

또한의 맛과 빌드 타입 기반의 설정 작업을해야한다 applicationId, versionName, versionCode.

build.gradle에서 :

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def appId = variant.applicationId
            def versionName = variant.versionName
            def versionCode = variant.versionCode
            def flavorName = variant.flavorName // e. g. free
            def buildType = variant.buildType // e. g. debug
            def variantName = variant.name // e. g. freeDebug

            def apkName = appId + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk';
            output.outputFile = new File(output.outputFile.parentFile, apkName)
        }
    }
}

APK 이름 예 : com.example.app_freeDebug_1.0_1.apk

variant변수에 대한 자세한 정보는 ApkVariantBaseVariant 인터페이스 정의를 참조하십시오 .


4

android.applicationVariants.all앱 레벨 gradle에 아래와 같은 블록을 추가하십시오.

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            lintOptions {
                disable 'MissingTranslation'
            }
            signingConfig signingConfigs.release
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${applicationId}_${versionCode}_${variant.flavorName}_${variant.buildType.name}.apk"
                }
            }
        }
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '_debug'
        }
    }

2019/03/25에 제공



2

먼저 모듈을 에서 즉, SurveyApp로 이름을 바꿉니다.

두 번째로 프로젝트 최상위 (루트 프로젝트) gradle에 추가하십시오. Gradle 3.0 과 함께 작동합니다

//rename apk for all sub projects
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty("android")) {
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${project.name}-${variant.name}-${variant.versionName}.apk"
                }
            }
        }
    }
}

2

build.gradle (Module : app)에 다음 코드를 추가하십시오.

android {
    ......
    ......
    ......
    buildTypes {
        release {
            ......
            ......
            ......
            /*The is the code fot the template of release name*/
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def formattedDate = new Date().format('yyyy-MM-dd HH-mm')
                    def newName = "Your App Name " + formattedDate
                    output.outputFile = new File(output.outputFile.parent, newName)
                }
            }
        }
    }
}

그리고 릴리스 빌드 이름은 귀하의 앱 이름이됩니다 2018-03-31 12-34


1

내 솔루션은 누군가에게 도움이 될 수도 있습니다.

테스트 및에 작품 인 IntelliJ 2017년 3월 2일Gradle을 4.4

대본:

내 응용 프로그램에 2 가지 맛이 있으므로 각 맛에 따라 각 릴리스의 이름이 적절하게 지정되기를 원했습니다.

아래 코드는 모듈 gradle 빌드 파일에 있습니다.

{app-root}/app/build.gradle

android{ }블록에 추가 할 Gradle 코드 :

android {
    // ...

    defaultConfig {
        versionCode 10
        versionName "1.2.3_build5"
    }

    buildTypes {
        // ...

        release {
            // ...

            applicationVariants.all { 
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(output.outputFile.name, variant.flavorName + "-" + defaultConfig.versionName + "_v" + defaultConfig.versionCode + ".apk"))
                }
            }

        }
    }

    productFlavors {
        myspicyflavor {
            applicationIdSuffix ".MySpicyFlavor"
            signingConfig signingConfigs.debug
        }

        mystandardflavor {
            applicationIdSuffix ".MyStandardFlavor"
            signingConfig signingConfigs.config
        }
    }
}

위는 다음과 같은 APK를 제공합니다 {app-root}/app/.

myspicyflavor-release-1.2.3_build5_v10.apk
mystandardflavor-release-1.2.3_build5_v10.apk

누군가에게 유용 할 수 있기를 바랍니다.

자세한 내용은 질문에 언급 된 다른 답변을 참조하십시오.


0

이것이 도움이 될 것이라고 생각합니다.

buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-")
                newName = newName.replace("-release", "-release" + formattedDate)
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
}
productFlavors {
    flavor1 {
    }
    flavor2 {
        proguardFile 'flavor2-rules.pro'
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.