“ app-release.apk” วิธีการเปลี่ยนชื่อ apk เริ่มต้นที่สร้างขึ้นนี้


155

เมื่อใดก็ตามที่ฉันสร้างapk ที่ลงชื่อใน Android Studio โดยค่าเริ่มต้นจะให้ชื่อเป็น app-release.apk ...

เราสามารถทำการตั้งค่าใด ๆ เพื่อให้มันพร้อมท์และถามชื่อที่ต้องได้รับมอบหมายให้ apk (วิธีที่มันทำในคราส)

สิ่งที่ฉันทำคือ - เปลี่ยนชื่อ apk หลังจากสร้างแล้ว สิ่งนี้ไม่ได้มีข้อผิดพลาด แต่มีวิธีที่เป็นของแท้เพื่อให้ฉันสามารถทำการเปลี่ยนแปลงใด ๆ ในการตั้งค่าเพื่อรับพรอมต์

บันทึก::

ในขณะที่กำลังสร้าง apk android studio ให้ฉันพร้อมที่จะเลือกตำแหน่ง (เท่านั้น)ป้อนคำอธิบายรูปภาพที่นี่


1.change build varient เพื่อปล่อย 2.select build-> สร้าง apk ที่ลงชื่อแล้วจากแถบเมนู ด้วยวิธีนี้ฉันกำลังสร้าง apk ที่ลงนามแล้ว
58

คำตอบทั้งหมดที่นี่ไม่ถูกต้อง .. ปัญหานี้จะยังคงเกิดขึ้นกับผู้ใช้ใด ๆ ... ปัญหาคือสตูดิโอแคชชื่อของสิ่งประดิษฐ์ 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 และอย่าลืมซิงค์ gradle ก่อนเรียกใช้โครงการ หวังว่ามันจะแก้ปัญหาของคุณ :)

วิธีการใหม่ในการจัดการนี้เพิ่มเร็ว ๆ นี้โดย Google อัปเดต ตอนนี้คุณอาจจะเปลี่ยนชื่อของคุณสร้างตามรสชาติหรือผลลัพธ์ Variant // ด้านล่างนี้เป็นแหล่งที่มาจากนักพัฒนาเอกสารประกอบหุ่นยนต์ สำหรับรายละเอียดเพิ่มเติมตามลิงค์เอกสารข้างต้น
ใช้ตัวแปร 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
}

จำเป็นต้องมีรหัสข้างต้นหรือไม่

สิ่งที่ฉันสังเกตเห็นใน android studio รุ่นล่าสุด 3.3.1

การเปลี่ยนชื่อบันเดิล. aab นั้นทำโดยรหัสก่อนหน้านี้โดยไม่จำเป็นต้องมีการเปลี่ยนชื่องานใด ๆ เลย

หวังว่ามันจะช่วยพวกคุณ :)


เพื่อใช้สตริงที่มีในเช่น "Abhishek Chaubey" ติดตั้งรูปแบบวันที่
Abhishek Chaubey

เป็นไปได้ที่จะเพิ่มversionNameอย่างใด?
zygimantus

@AbhishekChaubey ฉันไม่สามารถเรียกใช้รหัสผ่าน Android Studio อีกต่อไปหลังจากเปลี่ยนชื่อ apk ความคิดใด ๆ โปรดช่วย ... มันแสดงให้เห็นThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk

@BeeingJk สร้างโครงการใหม่อีกครั้งหรือปิดสตูดิโอ android และลบโฟลเดอร์ output จาก build directory และสร้างโครงการใหม่หรือลองใช้งานโดยทำความสะอาด. หวังว่ามันจะช่วยคุณได้
Abhishek Chaubey

4
ตั้งแต่ Android Studio 3.0 output.outputFile อ่านได้อย่างเดียว @ johnny-doe คำตอบคือทางออกใหม่
krishh

79

คุณอาจได้รับข้อผิดพลาดกับ android gradle plugin ล่าสุด ( 3.0 ):

ไม่สามารถกำหนดค่าของคุณสมบัติ 'อ่านอย่างเดียว' ได้

ตามคู่มือการย้ายถิ่นเราควรใช้วิธีการต่อไปนี้ทันที:

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

หมายเหตุ 2 การเปลี่ยนแปลงหลักที่นี่:

  1. all ถูกใช้แล้วแทน eachการวนซ้ำไปยังเอาต์พุตย่อย
  2. outputFileName คุณสมบัติถูกนำมาใช้แทนการกลายพันธุ์การอ้างอิงไฟล์

1
ตอนนี้นี่คือคำตอบที่ถูกต้องของตุลาคม 2017 สำหรับ Android Studio 3.0 Beta 7 ขอบคุณ
krishh

3
ในกรณีของฉัน${applicationName}มีมติให้BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(สั้นลงเพื่อความชัดเจน) สิ่งนี้ทำให้บรรจุภัณฑ์ล้มเหลว สำหรับฉัน${applicationId}หรือ${archivesBaseName}เป็นตัวเลือกที่ดีกว่า นอกจากนี้${defaultConfig.versionName}สำหรับฉันเป็นโมฆะ ดังนั้น${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 ฉันไม่สามารถเรียกใช้รหัสผ่าน Android Studio ได้อีกต่อไปหลังจากเปลี่ยนชื่อ apk ความคิดใด ๆ โปรดช่วย ... มันแสดงไฟล์ APK / ผู้ใช้ / ... /outputs/apk/NewName-debug-20161004172815.apk ไม่มีอยู่ในดิสก์
Beeing Jk

1
แทนที่จะตั้งค่า MyAppName ด้วยตนเองrootProject.nameจะให้ชื่อโครงการเหมือนใน eclipse
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 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 (flavor == "dev" || buildType = "debug")
Tony 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
ขอบคุณ นี่คือตัวเลือกที่เร็วที่สุด!
จอห์น

1
หมายเหตุด้านข้างคุณสามารถเพิ่มไฟล์เก็บถาวร BaseName ลงในไฟล์ gradle.properties ท้องถิ่นของคุณ
Ge3ng

ดูเหมือนชัดเจนยิ่งขึ้น ทำไมนี่ไม่ใช่โซลูชันที่ต้องการ
Xan-Kun Clark-Davis

6

ฉันเขียนโซลูชันที่เป็นสากลมากขึ้นตาม @Fer answer

นอกจากนี้ยังควรจะทำงานกับการกำหนดค่ารสชาติและสร้างประเภทตามapplicationId, ,versionNameversionCode

ใน 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ตัวแปรดูApkVariantและBaseVariantอินเตอร์เฟซนิยาม


4

เพิ่มandroid.applicationVariants.allบล็อกด้านล่างในระดับแอปของคุณ

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 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 (โมดูล: แอพ)

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 รสชาติในใบสมัครของฉันดังนั้นฉันจึงต้องการให้แต่ละรุ่นได้รับการตั้งชื่ออย่างเหมาะสมตามแต่ละรสชาติ

รหัสด้านล่างจะถูกวางลงในไฟล์ build gradle โมดูลของคุณที่พบใน:

{app-root}/app/build.gradle

โค้ด Gradle ที่จะเพิ่มในandroid{ }บล็อก:

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.