अलग-अलग ग्रेडेल बिल्ड के लिए अलग-अलग एंड्रॉइड ऐप आइकन कैसे प्रदान करें?


101

मेरे पास दो ग्रेड प्रकार हैं, जो मेरे ग्रेडल फ़ाइल में सेट है: debugऔर release। मैं debugबिल्ड प्रकार के लिए एक अलग ऐप आइकन सेट करने में सक्षम होना चाहता हूं । उत्पाद के स्वाद में उतरे बिना, बिल्ड प्रकार के माध्यम से इसका कोई तरीका है? build.gradle फ़ाइल नीचे है।

apply plugin: 'android'

//...

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 30
        versionName "2.0"
    }
    buildTypes {
        debug {
            packageNameSuffix '.debug'
            versionNameSuffix '-SNAPSHOT'
        }
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}


जवाबों:


158

पता लगा लिया। आपको जो करने की ज़रूरत है वह एक अलग src फ़ोल्डर बनाता है जिसे अलग- debugअलग आइकन कहते हैं। उदाहरण के लिए, यदि आपका प्रोजेक्ट लेआउट निम्नानुसार है, और आपके लॉन्चर आइकन को कहा जाता है ic_launcher.png:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png

फिर डिबग बिल्ड प्रकार के लिए एक अलग आइकन जोड़ने के लिए, आप जोड़ें:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png
      -debug
        -res
          -drawable-*
            -ic_launcher.png

फिर, जब आप डीबग बिल्ड प्रकार के तहत बनाते हैं, तो यह डीबग फ़ोल्डर में पाए गए ic_launcher का उपयोग करेगा।


क्या आपको sourceSets घोषणा के साथ अतिरिक्त डिबग फ़ोल्डर निर्दिष्ट नहीं करना था?
ncoronges

1
@ नोर्कॉन्ग्स मैं नहीं था। ऐसा लगता है क्योंकि डीबग एक बिल्ट-इन बिल्ड प्रकार है, इसके लिए सेट किया गया स्रोत बिल्ट-इन भी है।
इन्सानिटीऑनबून

1
अगर मैं सिर्फ अपने ड्रॉ करने योग्य फ़ोल्डर में अपना आइकन डालता हूं, तो 'डिबग' का उपयोग करके मेरे लिए यह काम करता है। जैसे- drawable-mdpi, drawable-hdpi, आदि मुझे डिबग फ़ोल्डर में किसी भी अन्य संसाधन या कोड की आवश्यकता नहीं है।
रोस्टर

2
आकर्षण की तरह काम करता है। बस डिबग फ़ोल्डर में सभी मिपमैप निर्देशिकाओं को कॉपी करना था
अमित भंडारी

1
अलग ऐप का नाम कैसे है?
DKV

90

यह एक आसान तरीका है, हालांकि इसमें एक महत्वपूर्ण नकारात्मक पहलू है ... दोनों लॉन्चरों को आपके एपीके में डाल दिया जाएगा। - बार्टेक लिपिंस्की

बेहतर तरीका: इन्सानियतऑनबुन का जवाब

AndroidManifest.xml

<manifest 

    ...
        <application
        android:allowBackup="true"
        android:icon="${appIcon}"
        android:roundIcon="${appIconRound}"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    ...

    </application>

</manifest>

build.gradle

android {

    ...
        productFlavors{
        Test{
            versionName "$defaultConfig.versionName" + ".test"
            resValue "string", "app_name", "App-Test"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher_test",
                    appIconRound: "@mipmap/ic_launcher_test_round"
            ]
        }

        Product{
            resValue "string", "app_name", "App"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher",
                    appIconRound: "@mipmap/ic_launcher_round"
            ]
        }
    }
}

Github url: ग्रैडल के साथ मल्टी-वर्जन ऐप बनाएं


1
यह एक आसान तरीका है, हालांकि इसमें एक महत्वपूर्ण नकारात्मक पहलू है ... दोनों लॉन्चरों को आपके एपीके में डाल दिया जाएगा।
बार्टेक लिपिंस्की

-_- # यह एक समस्या है, मैं इसे अपडेट करता हूं। बेहतर तरीका: -> stackoverflow.com/a/22876224/703225
qinmiao

2
यह महत्वपूर्ण क्यों है? यह मेरे लिए बहुत महत्वपूर्ण नहीं लगता है, और यह अच्छा और साफ-सुथरा हल है
luky

2
मैं दूसरे @ लुकी का सवाल। यह एक नकारात्मक पहलू क्यों है? मुझे लगता है कि अतिरिक्त शीर्ष-स्तरीय निर्देशिकाओं को जोड़ना (मेरे प्रोजेक्ट में चार अलग-अलग बिल्ड वेरिएंट हैं), मैनिफ़ेस्ट प्लेसहोल्डर्स का उपयोग करने से कम साफ है। खासकर जब उन निर्देशिकाओं में सिर्फ एक आइकन होता है।
ग्रेगसेंटुल्ली

यदि आप इस तरह का उपयोग करना चाहते हैं और उत्पादन एपीके में दोनों आइकन जोड़ना बंद कर देते हैं, तो आप manifestPlaceholdersकेवल निष्पादन चरण या पीछे और ifबयान में सेट कर सकते हैं । मैं ऐसा इसलिए कर रहा हूं क्योंकि मेरे पास 1 गैर-उत्पादन बिल्ड प्रकार है जिसमें दो अलग-अलग चिह्न हो सकते हैं (और मैं एक पूरे निर्माण प्रकार को केवल 1 अंतर के साथ दूसरे के साथ नहीं करना चाहता)
नहुएल बैरियोस

11

आप उत्पाद स्वाद में आंशिक AndroidManifest.xml फ़ाइल के रूप में अच्छी तरह से आइकन निर्दिष्ट कर सकते हैं:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
    <application
        tools:replace="android:icon"
        android:icon="@drawable/alternative_icon" />
</manifest>

यह उस आइकन को अधिलेखित कर देगा जिसे आप मूल AndroidManifest.xml में निर्दिष्ट करते हैं


4
प्रश्न की जाँच करें। "क्या इसका कोई तरीका सिर्फ बिल्ड प्रकार के माध्यम से है, उत्पाद जायके में शामिल हुए बिना ?"
इन्सानिटीऑनबून

4
जबकि पूछा नहीं, मेरी बहुत मदद की! ~ फ्लेवर्स का उपयोग ~
फ्लुमॉक्स -

2
इसे करने का सबसे अच्छा तरीका है, यदि आपके पास पहले से ही स्वाद विशिष्ट मैनिफ़ेस्ट फाइलें हैं।
ज़ैक्स

यह एकमात्र समाधान है जिसे मैंने अब तक देखा है जहाँ आप लॉन्चर आइकन के लिए अद्वितीय नाम रख सकते हैं .. बनाम के 10+ संस्करण हैं ic_launcher.png, यह जानने के लिए कि कौन सा केवल ऐसा है जहां यह स्थित है या वास्तव में इसे खोल रहा है (ऐसा नहीं है) अच्छा)। मुझे नहीं पता था कि इस तरह की मैनिफ़ेस्ट फ़ाइल के लिए विस्तार भी संभव था, यह एसओ पर कहीं और उल्लेख नहीं किया है या अन्यथा यहाँ से पहले। यकीन के लिए सुरुचिपूर्ण
बो में जीन बो

6

विभिन्न आयामों के साथ विभिन्न स्वादों का उपयोग करते हुए विभिन्न आइकन प्राप्त करने के लिए, जैसे:

flavorDimensions "color", "size"
productFlavors {
    black {
        dimension "color"
    }
    white {
        dimension "color"
    }

    big {
        dimension "size"
    }
    small {
        dimension "size"
    }
}

इसे निम्न प्रकार से प्राप्त किया जा सकता है:

सबसे पहले, डिबग संसाधनों को अलग-अलग फ़ोल्डरों में रखें, जैसे:

src/blackDebug/res
src/whiteDebug/res

दूसरा, कई स्वाद आयामों के साथ कुंजी रखो कि स्रोत नाम में सभी संभव स्वाद संयोजन होने चाहिए, भले ही इनमें से कुछ आयाम आइकन को प्रभावित न करें।

sourceSets {
    // Override the icons in debug mode
    blackBigDebug.res.srcDir 'src/blackDebug/res'
    blackSmallDebug.res.srcDir 'src/blackDebug/res'
    whiteBigDebug.res.srcDir 'src/whiteDebug/res'
    whiteSamllDebug.res.srcDir 'src/whiteDebug/res'
}

बस इसे स्पष्ट करने के लिए, निम्नलिखित काम नहीं करेगा जब कई आयाम उपयोग में हों:

sourceSets {
    // Override the icons in debug mode
    blackDebug.res.srcDir 'src/blackDebug/res'
    whiteDebug.res.srcDir 'src/whiteDebug/res'
}

यह निश्चित नहीं है कि यह कैसे प्रकट होगा क्योंकि लॉन्च आइकन को प्रकट फ़ाइल में घोषित किया गया है। क्या आप उस मुद्दे को संबोधित कर सकते हैं?
डेविड रेक्टर

3
मेनिफेस्ट में संसाधन नाम घोषित किया गया है, लेकिन मेरे पोस्ट में वर्णित विभिन्न स्वाद-विशिष्ट फ़ोल्डरों में एक ही फ़ाइल नाम के साथ आपके अलग-अलग चिह्न हो सकते हैं।
जोस गोमेज़

0

Mipmap-anydpi-v26 की जगह और सभी आयामों के लिए फ़ाइलें रखने सहित चरण समाधान,

सबसे पहले build.gradle (मॉड्यूल: ऐप) में अपने बिल्ड प्रकार को android -> buildTypes -> debug, आंतरिक आदि में परिभाषित करें।

Android के नीचे प्रोजेक्ट पदानुक्रम पर, एप्लिकेशन पर राइट क्लिक करें -> नया -> छवि परिसंपत्ति -> पथ में अपना आइकन चुनें -> बैकग्राउंड लेयर और लिगेसी पर कोई अन्य परिवर्तन -> अगला -> रेस डायरेक्टरी में अपना वांछित बिल्ड प्रकार चुनें ( डीबग, आंतरिक, मुख्य, आदि) -> समाप्त करें

इस तरह से आइकन आपके पास मौजूद हर पुराने आइकन को बदल देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.