1. 程式人生 > >Gradle多渠道打包

Gradle多渠道打包

Gradle多渠道打包

  • 多渠道打包基本實現
  • 不同的渠道包顯示不同的APP_NAME
  • 不同的渠道包顯示的res資源不一樣

簡單的多渠道打包

1.在AndroidMainfest.xml的application中配置自定義項

    <meta-data
            android:name="channel_key"
            android:value="${CHANNEL_VALUE}" />

2.在主工程的build.gradle中新增下面的程式碼

productFlavors {
        xiaomi {
            manifestPlaceholders = [CHANNEL_VALUE: name]
            // 可以通過下面的程式碼配置不同的包名【這樣不同渠道的包可以同時安裝】,正常情況下不需要 
// applicationId "com.xx.xiaomi" // packageName = "com.xx.xiaomi" } huawei { manifestPlaceholders = [CHANNEL_VALUE: name] // 可以通過下面的程式碼配置不同的包名【這樣不同渠道的包可以同時安裝】,正常情況下不需要 // applicationId "com.xx.huawei" // packageName = "com.xx.huawei"
} yingyongbao { manifestPlaceholders = [CHANNEL_VALUE: name] // 可以通過下面的程式碼配置不同的包名【這樣不同渠道的包可以同時安裝】,正常情況下不需要 // applicationId "com.xx.yingyongbao" // packageName = "com.xx.yingyongbao" } } //上面的可以簡寫成如下的形式(遍歷獲取channel_value) productFlavors { xiaomi { } huawei { } yingyongbao { } productFlavors.all
{ flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] }

不同的渠道包顯示不同的APP_NAME

  1. 修改AndroidMainfest.xml中application的label標籤
    android:label="${NNE_NAME}" 
    tools:replace="android:label" // 宣告android:label是可以修改的。【這一句是非常關鍵的,如果沒有在編譯的時候會出錯。】

2.配置build.gradle中的productFlavors不同的渠道設定不同的APP_NAME

   productFlavors {
            xiaomi {
                manifestPlaceholders = [APP_NAME     : "測試app-xiaomi",
                                        CHANNEL_VALUE: "xiaomi"]
            }
            huawei {
                manifestPlaceholders = [APP_NAME     : "測試app-huawei",
                                        CHANNEL_VALUE: "huawei"]
            }
            yingyongbao {
                manifestPlaceholders = [APP_NAME     : "測試app-yingyongbao",
                                        CHANNEL_VALUE: "yingyongbao"]
            }
        }

擴充套件:配置不同包名需要的不同key可以如上在AndroidManifest.xml中先定義一個自定義的項,然後在productFlavors中對此做具體的配置來實現。


不同的渠道包使用不同的資原始檔res

在main目錄建立和渠道對應的資料夾,資料夾裡邊的目錄結構和res下面的一直【細想一下,它是用來替換res下邊的資原始檔的,當然得一致】。 然後把需要替換的資原始檔放到對應的目錄就行。

注意: 檔名和要替換的資原始檔名要一樣!!!

  1. 切換到Project結構, 正常是 Android結構的目錄
    正常的目錄為:
    —app
    ——build
    ——gradle
    ——src
    ———main
    ————assets
    ————java
    ————res
    —————drawable
    —————drawable-xhdpi
    ————AndroidMainfest.xml

在main下面建立和productFlavors渠道對應的資料夾,如xiaomi, huawei, yingyongbao 等
—app
——build
——gradle
——src
———main
————assets
————java
————res
————xiaomi // 下面的資原始檔夾和res下邊的一樣
————huawei // 下面的資原始檔夾和res下邊的一樣
————yingyongbao // 下面的資原始檔夾和res下邊的一樣
—————drawable
—————drawable-xhdpi
————AndroidMainfest.xml


用java程式碼判斷渠道

    try {
            ApplicationInfo info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            String value = info.metaData.getString("channel_key");
            // 在下面的程式碼裡寫各個渠道不同的邏輯
            switch (value) {
                case "xiaomi":
                    //  todo 小米 
                    break;
                case "huawei":
                    //  todo 華為
                    break;
                case "yingyongbao":
                    // todo 應用包
                    break;
                default:
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
>> 錯誤的或不嚴謹的地方多多指教!