Làm cách nào để cung cấp các biểu tượng ứng dụng Android khác nhau cho các loại buildTypes khác nhau?


100

Tôi có hai loại bản dựng được đặt trong tệp gradle của mình: debugrelease. Tôi muốn có thể đặt một biểu tượng ứng dụng khác cho debugloại bản dựng. Có cách nào để thực hiện điều này chỉ thông qua kiểu xây dựng mà không đi vào hương vị sản phẩm không? tệp build.gradle ở bên dưới.

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


Câu trả lời:


156

Tìm ra. Những gì bạn cần làm là tạo một thư mục src riêng có tên debugchứa các biểu tượng khác nhau. Ví dụ: nếu bố cục dự án của bạn như sau và biểu tượng trình khởi chạy của bạn được gọi là ic_launcher.png:

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

Sau đó, để thêm một biểu tượng riêng cho kiểu xây dựng gỡ lỗi, bạn thêm:

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

Sau đó, khi bạn xây dựng theo kiểu xây dựng gỡ lỗi, nó sẽ sử dụng ic_launcher được tìm thấy trong thư mục gỡ lỗi.


Bạn không cần phải chỉ định thư mục gỡ lỗi bổ sung với khai báo sourceSets?
ncoronges

1
@ncoronges Tôi đã không. Có vẻ như vì gỡ lỗi là một loại xây dựng được tích hợp sẵn, bộ nguồn cho nó cũng được tích hợp sẵn.
InsanityOnABun

1
@Scott Nó hoạt động với tôi bằng cách sử dụng 'gỡ lỗi' nếu tôi chỉ đặt biểu tượng của mình vào mỗi thư mục có thể vẽ. Ví dụ: drawable-mdpi, drawable-hdpi, v.v. Tôi không cần bất kỳ tài nguyên hoặc mã nào khác trong thư mục gỡ lỗi.
roarster

2
hoạt động như sự quyến rũ. Chỉ cần phải sao chép tất cả các thư mục mipmap trong thư mục debug
Amit Bhandari

1
Làm thế nào để có một tên ứng dụng khác?
DKV

90

Đây là một cách tiếp cận tiện dụng mặc dù nó có một nhược điểm quan trọng ... cả hai launcher sẽ được đưa vào apk của bạn. - Bartek Lipinski

Cách tốt hơn: Câu trả lời của 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: Xây dựng ứng dụng nhiều phiên bản với Gradle


1
Đây là một cách tiếp cận tiện dụng mặc dù nó có một nhược điểm quan trọng ... cả hai launcher sẽ được đưa vào apk của bạn.
Bartek Lipinski

-_- # Đó là một vấn đề, tôi cập nhật it.The cách tốt hơn: -> stackoverflow.com/a/22876224/703225
qinmiao

2
tại sao nó là nhược điểm quan trọng? nó không nhìn quá quan trọng với tôi, và nó là tốt và giải pháp gradle sạch
luky

2
Tôi thứ hai câu hỏi của @ luky. Tại sao đây là một nhược điểm? Tôi nghĩ rằng việc thêm các thư mục cấp cao nhất bổ sung (tôi có bốn biến thể bản dựng khác nhau trong dự án của mình) kém gọn gàng hơn so với việc sử dụng trình giữ chỗ tệp kê khai. Đặc biệt là khi những thư mục đó chỉ chứa một biểu tượng duy nhất.
GregSantulli

Nếu bạn muốn sử dụng theo cách này và ngừng thêm cả hai biểu tượng vào APK sản xuất, bạn có thể đặt biểu tượng manifestPlaceholdersduy nhất trong giai đoạn thực thi hoặc phía sau và ifcâu lệnh. Tôi đang làm điều này bởi vì tôi có 1 phi sản xuất xây dựng kiểu đó có thể có hai biểu tượng khác nhau (và tôi không muốn có toàn bộ một loại xây dựng với chỉ 1 sự khác biệt với một trong những khác)
Nahuel Barrios

11

Bạn cũng có thể chỉ định biểu tượng trong tệp AndroidManifest.xml một phần của hương vị sản phẩm:

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

Thao tác này sẽ ghi đè lên biểu tượng mà bạn chỉ định trong AndroidManifest.xml gốc


4
Kiểm tra câu hỏi. "Có cách nào để làm điều này chỉ thông qua loại xây dựng, mà không đi vào hương vị sản phẩm không?"
InsanityOnABun

4
Trong khi không như được hỏi, đã giúp tôi rất nhiều! ~ sử dụng hương vị ~
Flummox - đừng là ác. SE

2
Cách tốt nhất để làm điều đó, nếu bạn đã có tệp kê khai cụ thể.
Zax

Đây là giải pháp duy nhất mà tôi đã thấy cho đến nay, nơi bạn có thể duy trì tên duy nhất cho launcher icon .. vs có 10+ phiên bản ic_launcher.png, phải biết cái nào là mà chỉ bởi nó nằm ở đâu hoặc thực sự mở nó (không quá đẹp). Tôi không biết loại mở rộng này cho tệp kê khai thậm chí còn có thể, chưa thấy nó được đề cập ở bất kỳ nơi nào khác trên SO hoặc trước đây ở đây. Thanh lịch cho chắc chắn
Gene Bo

6

Để nhận được các biểu tượng khác nhau trong khi sử dụng các hương vị khác nhau với nhiều kích thước, chẳng hạn như:

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

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

Điều này có thể đạt được là:

Trước tiên, hãy đặt các tài nguyên gỡ lỗi vào các thư mục riêng biệt, chẳng hạn như:

src/blackDebug/res
src/whiteDebug/res

Thứ hai, đặt chìa khóa với nhiều kích thước hương vị là tên bộ nguồn phải chứa tất cả các kết hợp hương vị có thể có, ngay cả khi một số thứ nguyên này không ảnh hưởng đến biểu tượng.

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

Chỉ cần nói rõ, những điều sau sẽ không hoạt động khi sử dụng nhiều thứ nguyên:

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

Không chắc điều này sẽ giúp ích như thế nào vì biểu tượng khởi chạy được khai báo trong tệp kê khai. Bạn có thể giải quyết vấn đề đó?
David Hiệu trưởng

3
Tên tài nguyên được khai báo trong tệp kê khai, nhưng bạn có thể có các biểu tượng khác nhau có cùng tên tệp trong các thư mục cụ thể theo hương vị khác nhau như được mô tả trong bài đăng của tôi.
Jose Gómez

0

Giải pháp từng bước, bao gồm thay thế mipmap-anydpi-v26 và giữ các tệp cho tất cả các kích thước:

Trước tiên, hãy xác định trong build.gradle (Module: app) loại bản dựng của bạn trong android -> buildTypes -> debug, internal, v.v.

Trên hệ thống phân cấp dự án, bên dưới Android, nhấp chuột phải vào ứng dụng -> Mới -> Nội dung hình ảnh -> trong Đường dẫn chọn biểu tượng của bạn -> bất kỳ thay đổi nào khác trên Lớp nền và Kế thừa -> Tiếp theo -> trong Thư mục Res chọn loại bản dựng mong muốn của bạn ( gỡ lỗi, nội bộ, chính, v.v.) -> Kết thúc

Bằng cách đó, các biểu tượng sẽ thay thế mọi biểu tượng cũ mà bạn có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.