2014-04-05 68 views
48

我在我的gradle文件中設置了兩種構建類型:debugrelease。我希望能夠爲debug構建類型設置不同的應用圖標。有沒有什麼辦法可以通過構建類型,而不需要進入產品口味?下面是build.gradle文件。如何爲不同的gradle buildTypes提供不同的Android應用圖標?

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

檢查這個http://stackoverflow.com/questions/18460095/how-to -provide-different-launcher-icon-per-product-flavor – Libin

+3

[Android - 應用程序圖標的調試和發佈模式]的可能重複(http://stackoverflow.com/questions/19528063/android-app-icon-for-調試和釋放模式) –

回答

90

想通了。您需要做的是創建一個名爲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。

+0

您是否不必使用sourceSets聲明指定額外的調試文件夾? – ncoronges

+1

@ncoronges我沒有。這似乎是因爲調試是一種內置的構建類型,爲它設置的源也是內置的。 – InsanityOnABun

+0

您是否將所有其他資源都保留在常用「主」文件夾中?發佈圖標是否仍然位於「主」文件夾中? AndroidManifest或build.gradle中沒有其他設置?當我嘗試這個時,我沒有看到圖標變化。 – Scott

8

您可以指定在產品風味的部分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

+1

雖然沒有問,但是幫了我很多! 〜使用口味〜 – Flummox

+1

最好的方法來做到這一點,如果你已經有味道特定的清單文件。 – Zax

36

這指定圖標是一個方便的方法,雖然它有一個重要的缺點...兩個發射器將被放入你的apk。 - Bartek Lipinski

更好的方法:InsanityOnABun's answer

AndroidManifest.xml中

<manifest 

    ... 
     <application 
     android:allowBackup="true" 
     android:icon="${appIcon}" 
     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" 
      ] 
     } 

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

GitHub的網址:Build multi-version App with Gradle

+0

這是一個方便的方法,雖然它有一個重要的缺點...兩個發射器將被放入你的apk。 –

+0

-_-#這是一個問題,我更新它。更好的方法: - > http://stackoverflow.com/a/22876224/703225 – qinmiao

+1

爲什麼它是重要的缺點?它對我來說看起來不太重要,它是好的和乾淨的gradle解決方案 – luky

2

爲了得到不同的圖標,而使用具有多層面的不同口味,如:

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

不知道這將有助於自啓動圖標聲明在清單文件中。你能解決這個問題嗎? –

+1

資源名稱在清單中聲明,但您可以在我的文章中描述的不同風格特定文件夾中具有相同文件名稱的不同圖標。 –

相關問題