GradleのbuildTypeごとに異なるAndroidアプリアイコンを提供するにはどうすればよいですか?


99

私のgradleファイルには2つのビルドタイプが設定されています:debugreleasedebugビルドタイプに別のアプリアイコンを設定できるようにしたいと思います。製品のフレーバーを使わずに、ビルドタイプだけでこれを行う方法はありますか?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'])
}


回答:


156

理解した。必要なのdebugは、異なるアイコンを保持するという別のsrcフォルダーを作成することです。たとえば、プロジェクトのレイアウトが次のとおりで、ランチャーアイコンが呼び出された場合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 14

1
@ncoronges私はしませんでした。デバッグは組み込みのビルドタイプであるため、デバッグ用のソースセットも組み込みです。
InsanityOnABun 2014

1
@Scott自分のアイコンを各ドローアブルフォルダーに置くだけで 'debug'を使用できます。たとえば、drawable-mdpi、drawable-hdpiなど。デバッグフォルダーに他のリソースやコードは必要ありません。
爆音2014

2
魅力のように動作します。すべてのミップマップディレクトリをデバッグフォルダーにコピーする必要がありました
Amit Bhandari

1
別のアプリ名にする方法は?
DKV

89

重要な欠点がありますが、これは便利なアプローチです。両方のランチャーがapkに入れられます。Bartek Lipinski

より良い方法: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"
            ]
        }
    }
}

Github url:Gradleでマルチバージョンアプリを構築


1
重要な欠点がありますが、これは便利なアプローチです。両方のランチャーがapkに入れられます。
Bartek Lipinski 2016

-_-#問題です、更新します。より良い方法:-> stackoverflow.com/a/22876224/703225
qinmiao

2
なぜそれが重要な欠点ですか?それは私にとってあまり重要ではないように見えますし、それは優れたクリーンな
Gradle

2
@lukyの質問の2番目です。これはなぜ不利なのですか?トップレベルディレクトリ(プロジェクトに4つの異なるビルドバリアントがある)を追加することは、マニフェストプレースホルダーを使用するよりもクリーンではないと思います。特に、これらのディレクトリにアイコンが1つしかない場合。
GregSantulli 2017

この方法を使用して、両方のアイコンを本番APKに追加するのをやめたい場合manifestPlaceholdersは、実行フェーズまたはビハインドとifステートメントでのみ設定できます。私がこれを行っているのは、2つの異なるアイコンを持つことができる非プロダクションビルドタイプが1つあるためです(そして、ビルドタイプ全体を他のものと1つだけ異なるようにしたくない)
Nahuel Barrios

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
質問を確認してください。「製品のフレーバーを使わずに、ビルドタイプだけでこれを行う方法はありますか?」
InsanityOnABun 2015年

4
尋ねられたわけではありませんが、私を助けてくれました!〜味〜使用
邪悪SEはいけない- Flummoxを

2
フレーバー固有のマニフェストファイルがすでにある場合は、これを行うための最良の方法。
Zax

これは、ランチャーアイコンの一意の名前を維持できる、これまでに見た唯一のソリューションです。10を超えるバージョンのic_launcher.pngを持っている場合と、それがどこにあるか、または実際にそれを開いているだけでどれがどれかを知る必要がある場合(そうではありません)すてきな)。この種類のマニフェストファイルの拡張が可能であることを知りませんでした。SOのどこか他の場所で言及されていたり、他の方法でこの前に言及されていません。確かにエレガント
Gene Bo

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

起動アイコンがマニフェストファイルで宣言されているため、これがどのように役立つかわかりません。その問題に対処できますか?
デビッドレクター2017

3
リソース名はマニフェストで宣言されていますが、私の投稿に記載されているように、フレーバー固有の異なるフォルダーに同じファイル名の異なるアイコンを含めることができます。
JoseGómez17年

0

mipmap-anydpi-v26の置き換えとすべての次元のファイルの保持を含む、段階的なソリューション:

まずbuild.gradle(モジュール:アプリ)でビルドタイプをandroid-> buildTypes-> debug、internalなどで定義します

プロジェクト階層のAndroidの下で、アプリを右クリックします->新規->画像アセット->パスでアイコンを選択します->バックグラウンドレイヤーとレガシーの他の変更->次へ-> Resディレクトリで目的のビルドタイプを選択します(デバッグ、内部、メインなど)->完了

このようにして、アイコンは古いアイコンをすべて置き換えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.