"App-release.apk" कैसे इस डिफ़ॉल्ट उत्पन्न APK नाम को बदलने के लिए


155

जब भी मैं एंड्रॉइड स्टूडियो में एक हस्ताक्षरित APK उत्पन्न करता हूं , तो डिफ़ॉल्ट रूप से यह ऐप- release.apk के रूप में नाम देता है ...

क्या हम कोई सेटिंग कर सकते हैं ताकि यह शीघ्रता से पूछें और मुझसे वह नाम पूछें जिसे एपीके को सौंपा जाना चाहिए (जिस तरह से यह ग्रहण में है)

मैं क्या कर रहा हूँ - उत्पन्न होने के बाद apk का नाम बदलें। यह कोई त्रुटि नहीं देता है, लेकिन क्या कोई वास्तविक तरीका है ताकि मैं शीघ्र प्राप्त करने के लिए सेटिंग्स में कोई भी बदलाव कर सकूं।

ध्यान दें::

जनरेट करते समय APK Android स्टूडियो मुझे स्थान का चयन करने के लिए संकेत दे रहा है (केवल)यहाँ छवि विवरण दर्ज करें


1. क्रिएट बिल्ड वेरिएंट रिलीज़ करने के लिए 2. सेट बिल्ड-> मेन्यू बार से साइन इन एपीके को जेनरेट करें। इस तरह से
एपीके

यहाँ सभी उत्तर सही नहीं हैं .. यह समस्या अभी भी उनमें से किसी एक का उपयोग करके उत्पन्न होगी ... समस्या स्टूडियो स्टूडियो है जिसे एपीके आर्टवर्क का नाम दिया गया है, और नए उत्पन्न एक का उपयोग करने के बजाय कैश्ड नाम का उपयोग करते रहें!
TacB0sS

जवाबों:


142

हां हम इसे बदल सकते हैं लेकिन कुछ और ध्यान से

यह देखो

अब इसे अपने प्रोजेक्ट में अपने बिल्ड.ग्रेड में जोड़ें। सुनिश्चित करें कि आपने अपने प्रोजेक्ट के बिल्ड वैरिएंट को चेक किया है जैसे 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 में सेट प्रॉपर्टी मेथड का उपयोग करना और प्रोजेक्ट्स को चलाने से पहले ग्रेड को सिंक करना न भूलें। आशा है कि यह आपकी समस्या को हल करेगा :)

Google अपडेट द्वारा हाल ही में जोड़े गए इसे संभालने के लिए एक नया दृष्टिकोण। अब आप स्वाद या भिन्न आउटपुट के अनुसार अपने बिल्ड का नाम बदल सकते हैं // नीचे स्रोत डेवलपर से है android प्रलेखन अधिक जानकारी के लिए उपरोक्त दस्तावेज लिंक का अनुसरण करें
वेरिएंट आउटपुट में हेरफेर करने के लिए वेरिएंट एपीआई का उपयोग करना टूट गया है नए प्लगइन के साथ। यह अभी भी सरल कार्यों के लिए काम करता है, जैसे कि बिल्ड समय के दौरान एपीके नाम को बदलना, जैसा कि नीचे दिखाया गया है:

// 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 बंडल यह डेविड मेडेनजक द्वारा अच्छी तरह से उत्तर दिया गया है

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 बंडल का नाम पिछले कोड द्वारा किया जाता है, किसी भी कार्य का नाम बदलने की आवश्यकता नहीं होती है।

आशा है कि यह आप लोगों की मदद करेगा। :)


तो वहां स्ट्रिंग का उपयोग करें जैसे "अभिषेक चौबे" को स्वरूपित की गई तस्वीर
अभिषेक चौबे

क्या versionNameकिसी तरह जोड़ना संभव है ?
बजे ज़ाइगिमेंटस

@AbhishekChaubey मैं एंड्रॉइड स्टूडियो के माध्यम से कोड को चलाने में सक्षम नहीं हूं, अब एपीके का नाम, कोई विचार बदलने के बाद? कृपया मदद करें ... यह दिखाता हैThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
मधुमक्खी जेक

@BeeingJk परियोजना का पुनर्निर्माण करें या एक बार एंड्रॉइड स्टूडियो को बंद करें और निर्माण निर्देशिका से आउटपुट फ़ोल्डर को हटा दें और फिर परियोजना का पुनर्निर्माण करें या इसे साफ करके देखें। यह आपकी मदद कर सकता है
अभिषेक चौबे

4
Android Studio 3.0 के रूप में output.outputFile केवल पढ़ा जाता है। @ जॉनी-डो का जवाब नया समाधान है।
क्रिश

79

आपको नवीनतम एंड्रॉइड ग्रेडल प्लगइन ( 3.0 ) के साथ त्रुटि मिल सकती है :

केवल-पढ़ने के लिए गुण 'outputFile' का मान सेट नहीं कर सकता

माइग्रेशन गाइड के अनुसार , हमें अब निम्नलिखित दृष्टिकोण का उपयोग करना चाहिए:

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

नोट 2 मुख्य परिवर्तन यहाँ हैं:

  1. allअब इसका उपयोग eachवेरिएंट आउटपुट पर पुनरावृति के बजाय किया जाता है ।
  2. outputFileName फ़ाइल संदर्भ को म्यूट करने के बजाय प्रॉपर्टी का उपयोग किया जाता है।

1
अब यह एंड्रॉइड स्टूडियो 3.0 बीटा 7. धन्यवाद के लिए अक्टूबर 2017 का सही उत्तर है।
कृष

3
मेरे मामले में ${applicationName}हल किया गया BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(स्पष्टता के लिए छोटा)। इससे पैकेजिंग फेल हो गई। मेरे लिए ${applicationId}या ${archivesBaseName}बेहतर विकल्प थे। ${defaultConfig.versionName}मेरे लिए भी अशक्त है। तो ${applicationId}_${variant.name}-${variant.versionName}क्या मैं इसके साथ समाप्त हुआ।
पीसीदेव

1
@KGCybeX आमतौर पर इस कोड का उपयोग android{}अनुभाग में उसी स्तर पर किया जाता है जैसा कि defaultConfig{}। हालाँकि, आप इसका android{}उपयोग android.applicationVariants.all { }वाक्य रचना के बाहर कर सकते हैं
जॉनी डो

1
आप एक जीवनरक्षक हैं;)
रिक वैन वेलजेन


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



1
कस्टम 'appName' प्रॉपर्टी को जोड़ने के लिए, अपने रूट प्रोजेक्ट में इस तरह कोड जोड़ें: project.ext { appName = 'MyApplicatioName' }
miha

2
@ ranma2913 मैं एंड्रॉइड स्टूडियो के माध्यम से कोड को चलाने में सक्षम नहीं हूं, अब एपीके का नाम, कोई विचार बदलने के बाद? कृपया मदद करें ... यह एपीके फ़ाइल /Users/.../outputs/apk/NewName-debug-20161004172815.apk डिस्क पर मौजूद नहीं है दिखाता है।
मधुमक्खी जेक

1
मैन्युअल रूप से MyAppName सेट करने के बजाय, rootProject.nameआपको ग्रहण की तरह प्रोजेक्ट नाम देगा।
हिरेन दबी

3
जैसा कि एंड्रॉइड स्टूडियो 3.0 output.outputFileकेवल पढ़ा जाता है। @ जॉनी-डो का जवाब नया समाधान है।
कृष

50

(एंड्रॉइड स्टूडियो 3.0 और ग्रैडल 4 के साथ काम करने के लिए)

मैं एक और अधिक जटिल apk फ़ाइल नाम बदलने के विकल्प की तलाश में था और मैंने यह समाधान लिखा था जो निम्न डेटा के साथ APK का नाम बदल देता है:

  • स्वाद
  • निर्माण प्रकार
  • संस्करण
  • तारीख

आपको इस तरह एक एपीके मिलेगा : myProject_dev_debug_1.3.6_131016_1047.apk

आप पूरा उत्तर यहां पा सकते हैं । आशा करता हूँ की ये काम करेगा!

बिल्ड.ग्रेड में:

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 (स्वाद = "देव" - buildType = "डिबग") के लिए एक निरंतर फ़ाइल नाम (संस्करण या तिथि के बिना) है
टोनी बेनब्राहिम 10:30

"प्रत्येक" के बजाय "सभी" यहां महत्वपूर्ण लगता है।
Xan- कुन क्लार्क-डेविस

त्रुटि देता है > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData। क्यों नहीं बस को बदलने के लिए buildType = variant.buildType.name?
सोशियल

यह कहता है"file.apk" is not writeable
होसिन हकीकियन

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 (डिबग मोड में) नाम देता है

एंड्रॉइड स्टूडियो डिफ़ॉल्ट रूप से बिल्ड नेम द्वारा versionNameSuffix जोड़ें, यदि आप इसे ओवरराइड करना चाहते हैं, तो अगला करें:

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

डीबग मोड में आउटपुट: com.blahblah.example-v1 (1.0) -MNNiceDebugModeName.apk


3
धन्यवाद। यह सबसे तेज विकल्प है!
जॉन

1
ध्यान दें कि आप अपने स्थानीय gradle.properties फ़ाइल में आर्कबासनेम जोड़ सकते हैं।
Ge3ng

यह वास्तव में अधिक स्पष्ट लगता है। यह पसंदीदा उपाय क्यों नहीं है?
Xan- कुन क्लार्क-डेविस

6

मैंने @ उत्तर के आधार पर अधिक सार्वभौमिक समाधान लिखा।

यह भी के स्वाद और निर्माण प्रकार आधारित विन्यास के साथ काम करना चाहिए applicationId, versionName, versionCode

बिल्ड.ग्रेड में:

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आप में नीचे की तरह ब्लॉक अनुप्रयोग स्तर 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

सबसे पहले ऐप से यानी सर्वेएप पर अपने मॉड्यूल का नाम बदलें

दूसरा इसे अपने प्रोजेक्ट टॉप-लेवल (रूट प्रोजेक्ट) ग्रेडेल में जोड़ें। यह ग्रैडल 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

मेरा समाधान भी किसी की मदद का हो सकता है।

टेस्ट किया और इंटेलीज 2017.3.2 पर ग्रैडल 4.4 के साथ काम करता है

परिदृश्य:

मेरे आवेदन में मेरे 2 स्वाद हैं, और इसलिए मैं चाहता था कि प्रत्येक रिलीज़ को प्रत्येक स्वाद के अनुसार उचित नाम दिया जाए।

नीचे दिए गए कोड को आपके मॉड्यूल ग्रेडल बिल्ड फ़ाइल में रखा जाएगा:

{app-root}/app/build.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'
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.