ग्रैड बिल्ड प्रकार के अनुसार ऐप का नाम कैसे बदलें


135

मैं एक तरह से यह जानने का प्रयास कर रहा हूं कि मैं अपने एप्लिकेशन के एप्लिकेशन नाम को बिल्ड प्रकार में बदल सकता हूं।

उदाहरण के लिए, मैं डिबग संस्करण के लिए <APP_NAME>-debugऔर qa संस्करण के लिए होना चाहूंगा <APP-NAME>-QA

मैं परिचित हूँ:

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}

हालाँकि, मुझे लॉन्चर में ऐप के परिवर्तन को लागू करने के लिए एक ग्रेडल कमांड नहीं मिल रही है।

जवाबों:


167

यदि "ऐप नाम" से आपका तात्पर्य android:labelहै <application>, तो सबसे सरल उपाय यह है कि उस बिंदु को एक स्ट्रिंग संसाधन (जैसे android:label="@string/app_name") पर रखा जाए, फिर किसी src/debug/सूत्र में उस स्ट्रिंग संसाधन का एक भिन्न संस्करण हो ।

आप देख सकते हैं कि इस नमूना परियोजना में , जहां मेरे पास एक प्रतिस्थापन app_nameहै src/debug/res/values/strings.xml, जिसे debugबिल्ड के लिए लागू किया जाएगा । releaseके संस्करण का उपयोग करेंगे बनाता app_nameमें src/main/


इस समाधान का अर्थ यह नहीं होगा कि हमें प्रत्येक अनुवाद के लिए एक अतिरिक्त तार जोड़ना होगा। xml? एक दर्द को बनाए रखने के लिए हो सकता है ...
sfera

7
@ सिर्फ़: सबसे पहले, यदि आप चाहें तो इस स्ट्रिंग को अपनी संसाधन फ़ाइल में अलग करने के लिए आपका स्वागत है। दूसरा, यह केवल एक स्ट्रिंग के लिए है। तीसरा, यह केवल उन बिल्ड प्रकारों के लिए है जहाँ आप उस स्ट्रिंग को बदलना चाहते हैं। चौथा, जब तक आपके पास एक आम भाषा के बिना एक विकास टीम नहीं है, आपको गैर- releaseस्ट्रिंग्स का अनुवाद करने की आवश्यकता नहीं होगी ।
कॉमन्सवेयर जूल

स्ट्रिंग को अलग करना एक अच्छे विचार की तरह लगता है। उसके लिए धन्यवाद! गैर- releaseभाग के रूप में, मैं देख रहा हूं कि "रिलीज" और "परीक्षण" की अनुमति देने के दौरान स्थानीयकरण के मुद्दों के लिए थोड़ा अलग भी हो सकता है क्योंकि एक ही डिवाइस पर सह-अस्तित्व का निर्माण होता है। ऐसे मामले में दोनों बिल्ड एक ही लॉन्चर लेबल के साथ समाप्त हो सकते हैं, शायद कुछ भ्रम पैदा कर सकते हैं। यही मैं बचने की कोशिश कर रहा था।
स्फेरा

1
@ सिफेरा: "यही मैं बचने की कोशिश कर रहा था" - इसलिए, इस एक स्ट्रिंग का अनुवाद न करें। उस स्ट्रिंग पर परीक्षण वैसे भी अमान्य होगा, परिभाषा के अनुसार, यह वह स्ट्रिंग नहीं है जिसे आप releaseमोड में उपयोग करना चाहते हैं । और केवल इस स्ट्रिंग संसाधन का उपयोग करें app_name, किसी अन्य भूमिका के लिए नहीं।
कॉमन्सवेयर जूल

3
@ सुरसा: आप कभी भी "AppNom-DEBUG" के साथ एक ऐप शिप नहीं करेंगे। आप "AppNom" के साथ एक ऐप शिप कर सकते हैं। इसलिए, "AppNom-DEBUG" का परीक्षण अनावश्यक है। आप निश्चित रूप से डिबग संस्करण का अनुवाद करने के लिए स्वागत करते हैं app_name, भले ही यह आवश्यक नहीं है (उदाहरण के लिए, आपके पास फ्रांसीसी या जर्मन डेवलपर्स हैं जो अंग्रेजी नहीं बोलते हैं और इसलिए इसका अनुवाद करने की आवश्यकता है)। परीक्षण के लिए यह देखने के लिए कि क्या काम के अनमोलिफाइड releaseसंस्करण app_name, इसके अनुवादों के साथ, releaseबिल्ड का परीक्षण करते हैं , या एक near-releaseबिल्ड प्रकार बनाते हैं जो ऐप आईडी प्रत्यय को जोड़ता है और अकेले तार छोड़ देता है।
कॉमन्सवेयर जूल

159

आप कुछ इस तरह का उपयोग कर सकते हैं

 buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        resValue "string", "app_name", "AppName debug"
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        zipAlignEnabled true
        resValue "string", "app_name", "AppName"
    }
}

आप AndroidManifest.xml फ़ाइलों में @ string / app_name का उपयोग कर सकते हैं ।

सुनिश्चित करें कि आप मान / फ़ोल्डर से app_name निकाल दें (इस नाम से कोई प्रविष्टि नहीं)।


बिल्कुल सही जब ऐप नाम को एक बाहरी फ़ाइल के रूप में पढ़ना होता है
जो मैहर

इस तरह से बनाते समय एक त्रुटि हुई। कार्य के लिए निष्पादन विफल रहा: 'app: mergeDebugResources' .. डुप्लिकेट संसाधन: res / मान / स्ट्रिंग्स.xml: string / app_name
user2010496

5
यदि आपको मिलता है: इस तरह से निर्माण करते समय एक त्रुटि हुई। कार्य के लिए निष्पादन विफल रहा: 'app: mergeDebugResources' .. डुप्लिकेट संसाधन: res / मान / strings.xml: string / app_name जो आपको करना चाहिए, जैसे इसके लिखित: "सुनिश्चित करें कि आप मान / फ़ोल्डर से app_name हटा दें (इस नाम से कोई प्रविष्टि नहीं) )। "
ivan.panasiuk

मुझे यह पसंद है क्योंकि तार फ़ोल्डर समाधान (ऊपर स्वीकृत समाधान,) केवल तभी काम करता है जब ऐप नाम किसी विशेष स्रोत सेट / उत्पाद स्वाद के लिए परिभाषित किया गया हो। मेरे मामले में, हम अपने ऐप के विभिन्न संस्करणों को अलग-अलग नामों से स्वचालित रूप से बनाने के लिए जेनकिंस पाइपलाइन नौकरी की स्थापना कर रहे हैं, और उन सभी नामों के लिए उत्पादफ्लवर्स उनके लिए परिभाषित नहीं हैं। : तो जेनकींस महज वातावरण के माध्यम से एप्लिकेशन नाम की आपूर्ति, और Gradle इसे पढ़ता हैresValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex

अगर मैंने स्ट्रिंग फ़ोल्डर से app_name हटा दिया है, तो त्रुटि संकलन समय प्राप्त करने में त्रुटि संकलन हो रहा है -रोर: कार्य के लिए निष्पादन विफल रहा: 'app: processDevDebugManifest'। > कई त्रुटियों के साथ मैनिफ़ेस्ट विलय विफल रहा, लॉग देखें
aj0822ArpitJoshi

55

आप इसे ढाल के साथ कर सकते हैं:

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}

फिर आपके AndroidManifest.xmlपुट में:

<application
    android:label="${appName}"/>
    <activity
        android:label="${appName}">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

नोट: यह भी साथ काम करता है productFlavors


त्रुटि प्राप्त करना -अशुभ: कार्य के लिए निष्पादन विफल रहा ': ऐप: processDevDebugManifest'। > कई त्रुटियों के साथ घोषणापत्र विलय विफल रहा, लॉग देखें
aj0822ArpitJoshi

काम नहीं कर रहा है --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro'} डिबग {घोषणापत्रधारक = [appName: "GridL Debug"] applicationIdSuffix ".dev1"}}
JSONParser

44

अनुवाद का समर्थन करने के लिए इसे बनाएं:

1. स्ट्रिंग हटाएं "app_name"

2. ढाल में जोड़ें

 buildTypes {
    admin {
       resValue "string", "app_name", "@string/app_name_admin"
    }
    release {
        resValue "string", "app_name", "@string/app_name_release"
    }
    debug {
        resValue "string", "app_name", "@string/app_name_debug"
    }
}

3. मेनिफेस्ट में ऐप का नाम "@ string / app_name" के रूप में सेट करें

4. strings.xml मानों में जोड़ें

<string name="app_name_admin">App Admin</string>
<string name="app_name_release">App  release</string>
<string name="app_name_debug">App debug</string>

बिल्ड प्रकार के विभिन्न प्रकार क्या हैं? इसके अलावा, व्यवस्थापक, रिलीज़ और डीबग?
दिनेश

@DineshVG आप अपने आप से अंतर सेट कर सकते हैं, उदाहरण के लिए अलग-अलग
ApplicationId

मैं अलग समर्थक सुरक्षा नियमों के साथ डिबग के अलावा किसी अन्य बिल्ड कॉन्फ़िगरेशन में UIAutomator परीक्षण का उपयोग करना चाहता हूं। क्या यह संभव है ?
दिनेश

यह स्वीकृत उत्तर होना चाहिए, मेरे लिए बहुत अच्छा काम किया
ओलेग डाटर

मैं वास्तव में इस दृष्टिकोण को पसंद करता हूं क्योंकि यह आपको फ़ाइल के उत्पादफ़्लवर्स अनुभाग app_nameमें एक कस्टम जोड़ने की अनुमति देता है । एक अत्यंत सुविधाजनक और लचीला दृष्टिकोण जब आपको इसकी आवश्यकता होती है। build.gradle
इगेल

15

ऐप का नाम उपयोगकर्ता-दृश्यमान है, और इसीलिए Google आपको इसे अपने स्ट्रिंग्स.xml फ़ाइल में रखने के लिए प्रोत्साहित करता है। आप एक अलग स्ट्रिंग संसाधन फ़ाइल को परिभाषित कर सकते हैं जिसमें तार होते हैं जो आपके बिल्डटाइप्स के लिए विशिष्ट होते हैं। ऐसा लगता है कि आपके पास एक कस्टम qaबिल्ड टाइप हो सकता है । यदि यह सच नहीं है, तो नीचे क्यूए भाग को अनदेखा करें।

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml

1
क्या यह कभी आपके लिए काम किया? मैंने अपना उदाहरण प्रलेखित किया है, और यह काम नहीं करता है ... stackoverflow.com/questions/26032950/…
volkersfreunde

ये स्वाद के प्रकार नहीं हैं
जॉर्जियाई बेनेटैटोस

13

हमें स्थानीयकरण (बहु भाषा के लिए) के साथ ऐप नाम का समाधान करने की आवश्यकता है। मैंने @Nick Unuchek समाधान के साथ परीक्षण किया है, लेकिन निर्माण विफल है (@ स्ट्रिंग / नहीं मिला है)। इस बग को ठीक करने के लिए थोड़ा सा परिवर्तन: build.gradle फ़ाइल:

android {
    ext{
        APP_NAME = "@string/app_name_default"
        APP_NAME_DEV = "@string/app_name_dev"
    }

    productFlavors{

        prod{
            manifestPlaceholders = [ applicationLabel: APP_NAME]
        }

        dev{
            manifestPlaceholders = [ applicationLabel: APP_NAME_DEV ]
        }

    }

मूल्यों \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod</string>
    <string name="app_name_dev">AAA dev</string>

</resources>

मान-en \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod en</string>
    <string name="app_name_dev">AAA dev en</string>

</resources>

Manifest.xml:

<application
    android:label="${applicationLabel}" >
</application>

उदाहरण के लिए "नीड फॉर स्पीड" जैसे गेम को जर्मनी में "बेडरुफ़निस नाच गेस्चविंडिगिट" कभी नहीं कहा जाएगा। जब तक यह संदिग्ध डेवलपर से कोई चीर-फाड़ न हो ...
अविश्वसनीय जनवरी

यह काम कर रहा है। बहुत बहुत धन्यवाद। हालांकि, मेरे मामले में, मैं 1 अधिक जोड़ने की जरूरत tools:replace="android:label"में applicationमेंAndroidManifest
फ़ान Van Linh

5

अधिक डायनेमिक ग्रेडेल बेस्ड सॉल्यूशन के लिए (उदाहरण के लिए मुख्य रूप से एक बेस एप्लिकेशन नाम सेट करें strings.xml, और प्रत्येक स्वाद / निर्माण संयोजन के प्रकार में खुद को दोहराने से बचें strings.xml), मेरा जवाब यहां देखें: https://stackoverflow.com/a/32220436/1128600


2

आप strings.xmlविभिन्न फ़ोल्डरों में उपयोग कर सकते हैं , रिलीज़ और डीबग बिल्ड के लिए एंड्रॉइड अलग स्ट्रिंग मान देखें ।

तो, यह फ़ाइल बनाएँ:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Your app name</string>
</resources>

फिर इसे फोल्डर app\src\debug\res\values\और app\src\release\res\values\फोल्डर्स में पेस्ट करें । डीबग और रिलीज़ फ़ाइलों में "आपका ऐप नाम" बदलें। निकालें app_nameसे आइटम strings.xmlमें app\src\main\res\values\फ़ोल्डर।

में AndroidManifestआप एक ही होगा

<application
    android:label="@string/app_name"
    ...

कोई बदलाव नहीं। भले ही आपने AndroidManifestफ़ाइल और इसके साथ एक लाइब्रेरी जोड़ी हो strings.xml


1

जैसा कि लेखक ग्रैडल में ऐसा करने के लिए कहते हैं , हम मान सकते हैं कि वह इसे स्क्रिप्ट में करना चाहते हैं न कि कॉन्फ़िगरेशन फ़ाइलों में। चूँकि एंड्रॉइड स्टूडियो और ग्रैडल दोनों को पिछले वर्ष में भारी अद्यतन और संशोधित किया गया है (~ 2018) उपरोक्त सभी अन्य उत्तर, अत्यधिक उलट प्रतीत होते हैं। आसान तरीका है, निम्नलिखित को अपने साथ जोड़ना है app/build.gradle:

android {
    ...
    buildTypes {
        ...
        // Rename/Set default APK name prefix (app*.apk --> AwesomeApp*.apk)
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def appName = "AwesomeApp"
                outputFileName = appName+"-${output.baseName}-${variant.versionName}.apk"
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.