Bagaimana cara menyediakan ikon aplikasi Android yang berbeda untuk tipe build gradle yang berbeda?

103

Saya memiliki dua tipe build yang disetel dalam file gradle saya: debugdan release. Saya ingin dapat menyetel ikon aplikasi yang berbeda untuk debugtipe build. Apakah ada cara untuk ini hanya melalui tipe build, tanpa membahas rasa produk? build.gradle ada di bawah.

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

Jawaban:

160

Menemukannya. Yang perlu Anda lakukan adalah membuat folder src terpisah yang disebut debugberisi ikon berbeda. Misalnya, jika tata letak proyek Anda adalah sebagai berikut, dan ikon peluncur Anda disebut ic_launcher.png:

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

Kemudian untuk menambahkan ikon terpisah untuk jenis build debug, Anda menambahkan:

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

Kemudian, saat Anda membangun di bawah tipe build debug, itu akan menggunakan ic_launcher yang ada di folder debug.

InsanityOnABun
sumber
Apakah Anda tidak perlu menentukan folder debug tambahan dengan deklarasi sourceSets?
ncoronges
1
@ncoronges saya tidak. Tampaknya karena debug adalah tipe build bawaan, kumpulan sumber untuknya juga sudah ada di dalamnya.
InsanityOnABun
1
@Scott Ini bekerja untuk saya menggunakan 'debug' jika saya hanya meletakkan ikon saya di setiap folder drawable. Misalnya drawable-mdpi, drawable-hdpi, dll. Saya tidak memerlukan resource atau kode lain di folder debug.
mengaum
3
bekerja seperti pesona. Hanya harus menyalin semua direktori mipmap di folder debug
Amit Bhandari
1
Bagaimana cara memiliki nama aplikasi yang berbeda?
DKV
94

Ini adalah pendekatan yang berguna meskipun memiliki sisi negatif yang penting ... kedua peluncur akan dimasukkan ke dalam apk Anda. - Bartek Lipinski

Cara yang lebih baik: Jawaban InsanityOnABun

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"
            ]
        }
    }
}

url Github: Buat Aplikasi multi-versi dengan Gradle

qinmiao
sumber
1
Ini adalah pendekatan yang berguna meskipun memiliki sisi negatif yang penting ... kedua peluncur akan dimasukkan ke dalam apk Anda.
Bartek Lipinski
-_- # Ini Masalah, saya memperbaruinya. Cara yang lebih baik: -> stackoverflow.com/a/22876224/703225
qinmiao
2
mengapa downside penting? tidak terlihat terlalu penting bagi saya, dan ini adalah solusi gradle yang bagus dan bersih
luky
2
Saya setuju dengan pertanyaan @ luky. Mengapa ini merugikan? Saya akan berpikir menambahkan direktori tingkat atas tambahan (saya memiliki empat varian build berbeda dalam proyek saya) kurang bersih daripada menggunakan placeholder manifes. Apalagi jika direktori tersebut hanya berisi satu ikon.
GregSantulli
Jika Anda ingin menggunakan cara ini dan berhenti menambahkan kedua ikon ke APK produksi, Anda dapat menyetel manifestPlaceholderssatu - satunya di fase eksekusi atau di belakang dan ifpernyataan. Saya melakukan ini karena saya memiliki 1 jenis build non-produksi yang dapat memiliki dua ikon berbeda (dan saya tidak ingin memiliki seluruh jenis build dengan hanya 1 perbedaan dengan yang lain)
Nahuel Barrios
12

Anda juga dapat menentukan ikon di file AndroidManifest.xml parsial ragam produk:

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

Ini akan menimpa ikon yang Anda tentukan di AndroidManifest.xml asli

isyi
sumber
4
Periksa pertanyaannya. "Apakah ada cara untuk melakukan ini hanya melalui tipe build, tanpa membahas rasa produk ?"
InsanityOnABun
4
Meskipun tidak seperti yang diminta, banyak membantu saya! ~ menggunakan rasa ~
Flummox - jangan jahat SE
2
Cara terbaik untuk melakukannya, jika Anda sudah memiliki file manifes khusus ragam.
Zax
Ini adalah satu-satunya solusi yang saya lihat sejauh ini di mana Anda dapat mempertahankan nama unik untuk ikon peluncur .. vs. memiliki 10+ versi ic_launcher.png, harus tahu mana yang hanya dengan lokasinya atau benar-benar membukanya (tidak begitu bagus). Saya tidak tahu perpanjangan semacam ini untuk file manifes bahkan mungkin, belum melihatnya disebutkan di tempat lain di SO atau sebelumnya di sini. Elegan pasti
Gene Bo
6

Untuk mendapatkan ikon yang berbeda sambil menggunakan rasa yang berbeda dengan berbagai dimensi, seperti:

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

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

Ini dapat dicapai sebagai:

Pertama, letakkan sumber daya debug di folder terpisah, seperti:

src/blackDebug/res
src/whiteDebug/res

Kedua, meletakkan kunci dengan beberapa dimensi ragam adalah bahwa nama kumpulan sumber harus berisi semua kemungkinan kombinasi ragam, meskipun beberapa dari dimensi ini tidak memengaruhi ikon.

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

Hanya untuk memperjelas, berikut ini tidak akan berfungsi saat beberapa dimensi digunakan:

sourceSets {
    // Override the icons in debug mode
    blackDebug.res.srcDir 'src/blackDebug/res'
    whiteDebug.res.srcDir 'src/whiteDebug/res'
}
Jose Gómez
sumber
Tidak yakin bagaimana ini akan membantu karena ikon peluncuran dideklarasikan di file manifes. Bisakah Anda mengatasi masalah itu?
David Rector
3
Nama sumber daya dideklarasikan dalam manifes, tetapi Anda dapat memiliki ikon berbeda dengan nama file yang sama di folder khusus rasa yang berbeda seperti yang dijelaskan dalam posting saya.
Jose Gómez
0

Solusi langkah demi langkah, termasuk mengganti mipmap-anydpi-v26 dan menyimpan file untuk semua dimensi:

Pertama, tentukan di build.gradle (Module: app) jenis build Anda di android -> buildTypes -> debug, internal, dll.

Pada hierarki proyek, di bawah Android, klik kanan pada app -> New -> Image Asset -> di Path pilih ikon Anda -> perubahan lain pada Background Layer dan Legacy -> Next -> di Res Directory pilih jenis build yang Anda inginkan ( debug, internal, main, dll) -> Selesai

Dengan begitu ikon akan menggantikan setiap ikon lama yang Anda miliki.

Robert Pal
sumber