Farklı gradle buildType'lar için farklı Android uygulama simgeleri nasıl sağlanır?


107

Gradle dosyamda ayarlanmış iki yapı türü var: debugve release. debugDerleme türü için farklı bir uygulama simgesi ayarlayabilmek istiyorum . Ürün lezzetlerine girmeden, sadece yapı türü aracılığıyla bunu yapmanın bir yolu var mı? build.gradle dosyası aşağıdadır.

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'])
}


3
Olası Android
Jose Gómez

Yanıtlar:


165

Anladım. Yapmanız gereken debug, farklı simgeleri barındıran ayrı bir src klasörü oluşturmaktır . Örneğin, proje düzeniniz aşağıdaki gibiyse ve başlatıcı simgeniz çağrılırsa ic_launcher.png:

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

Ardından, hata ayıklama derleme türü için ayrı bir simge eklemek üzere şunları eklersiniz:

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

Ardından, hata ayıklama derleme türü altında derlediğinizde, hata ayıklama klasöründe bulunan ic_launcher'ı kullanır.


Bir sourceSets bildirimiyle ek hata ayıklama klasörünü belirtmeniz gerekmedi mi?
ncoronges

1
@ncoronges yapmadım. Hata ayıklama yerleşik bir yapı türü olduğundan, bunun için kaynak kümesi de yerleşiktir.
InsanityOnABun

1
@Scott Simgemi her bir çekilebilir klasöre koyarsam 'hata ayıklama' kullanarak benim için çalışır. Örneğin, drawable-mdpi, drawable-hdpi, vb. Hata ayıklama klasöründeki diğer kaynaklara veya koda ihtiyacım yok.
roarster

3
çekicilik gibi çalışır. Tüm mipmap dizinlerini hata ayıklama klasörüne kopyalamak zorunda kaldım
Amit Bhandari

1
Nasıl farklı bir uygulama adına sahip olunur?
DKV

95

Bu kullanışlı bir yaklaşımdır, ancak önemli bir dezavantajı vardır ... Her iki başlatıcı da apk'nize eklenecektir. - Bartek Lipinski

Daha iyi yol: InsanityOnABun'un cevabı

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'si: Gradle ile çok sürümlü Uygulama oluşturun


1
Bu kullanışlı bir yaklaşımdır, ancak önemli bir dezavantajı vardır ... Her iki başlatıcı da apk'nize eklenecektir.
Bartek Lipinski

-_- # Bu bir Sorun, onu güncelliyorum. Daha iyi bir yol: -> stackoverflow.com/a/22876224/703225
qinmiao 01

2
neden önemli dezavantaj? benim için çok önemli görünmüyor ve iyi ve temiz gradle çözümü
luky

2
@ Luky'nin sorusunu ikinci kez düşünüyorum. Bu neden bir dezavantaj? Ek üst düzey dizinler eklemenin (projemde dört farklı yapı varyantım var), manifest yer tutucuları kullanmaktan daha az temiz olduğunu düşünüyorum. Özellikle bu dizinler tek bir simge içerdiğinde.
GregSantulli

Bu şekilde kullanmak ve üretim APK'sına her iki simgeyi de eklemeyi bırakmak istiyorsanız, manifestPlaceholdersyalnızca yürütme aşamasında veya arkasında ve ifdeyiminde ayarlayabilirsiniz . Bunu yapıyorum çünkü iki farklı simgeye sahip olabilen 1 üretim dışı yapı türüne sahibim (ve
diğeriyle

12

Simgeyi ürün çeşidinin kısmi AndroidManifest.xml dosyasında da belirtebilirsiniz:

<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>

Bu, orijinal AndroidManifest.xml'de belirttiğiniz simgenin üzerine yazacaktır.


4
Soruyu kontrol edin. " Ürün tatlarına girmeden , yalnızca yapı türü aracılığıyla bunu yapmanın bir yolu var mı ?"
InsanityOnABun

4
İstendiği gibi olmasa da bana çok yardımcı oldu! ~ tatlar kullanmak ~
Flummox - kötü olma SE

2
Zaten tada özgü bildirim dosyalarınız varsa bunu yapmanın en iyi yolu.
Zax

Başlatıcı simgeleri için benzersiz adlar tutabileceğiniz şimdiye kadar gördüğüm tek çözüm budur .. 10'dan fazla sürümüne ic_launcher.pngsahip olmak, hangisinin yalnızca nerede bulunduğunu veya gerçekten açıldığını bilmek zorunda (öyle değil) Güzel). Manifest dosyası için bu tür bir genişletmenin mümkün olduğunu bile bilmiyordum , burada daha önce SO'da veya başka bir yerde bahsedildiğini görmemiştim. Kesinlikle zarif
Gene Bo

6

Birden çok boyuta sahip farklı tatlar kullanırken farklı simgeler elde etmek için, örneğin:

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

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

Bu şu şekilde elde edilebilir:

İlk olarak, hata ayıklama kaynaklarını aşağıdaki gibi ayrı klasörlere koyun:

src/blackDebug/res
src/whiteDebug/res

İkinci olarak, birden çok lezzet boyutuna sahip anahtarı koyun, kaynak kümesi adının, bu boyutlardan bazıları simgeyi etkilemese bile, tüm olası lezzet kombinasyonlarını içermesi gerekir.

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'
}

Açıkça belirtmek gerekirse , birden çok boyut kullanımda olduğunda aşağıdakiler çalışmayacaktır :

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

Bildirim dosyasında başlatma simgesi bildirildiğinden bunun nasıl yardımcı olacağından emin değilim. Bu sorunu çözebilir misin?
David Rektör

3
Kaynak adı bildirimde belirtilmiştir, ancak yazımda açıklandığı gibi farklı aroma özgü klasörlerde aynı dosya adlarına sahip farklı simgeleriniz olabilir.
Jose Gómez

0

Mipmap-anydpi-v26'nın değiştirilmesi ve tüm boyutlar için dosyaların saklanması dahil olmak üzere adım adım çözüm:

Önce build.gradle'da (Modül: uygulama) derleme türünüzü android -> buildTypes -> hata ayıklama, dahili vb.

Proje hiyerarşisinde, Android'in altında, uygulamaya sağ tıklayın -> Yeni -> Görüntü Varlığı -> Yol'da simgenizi seçin -> Arka Plan Katmanı ve Eski üzerindeki diğer değişiklikler -> İleri -> Res Dizini'nde istediğiniz derleme türünü seçin ( hata ayıklama, dahili, ana, vb.) -> Bitir

Bu şekilde simgeler, sahip olduğunuz her eski simgenin yerini alacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.