Android多版本flavor配置之資源文件和清單文件合併介紹

  • 2022 年 7 月 22 日
  • 筆記

知識背景

Android studio升級到3.0之後,gradle增加了多維度管理配置,便於同一個項目中創建應用的不同版本,分別管理依賴項並簽署配置。創建產品風味與創建構建類型類似:只需將它們添加到productFlavors {}程式碼塊,並配置您想要的設置。產品風味支援與 defaultConfig相同的屬性,這是因為defaultConfig實際上屬於ProductFlavor類。

工程中配置Flavor

如下這個是module裡面的build.gradle部分程式碼(android節點下),這裡面主要增加的是productFlavors,這個就是用來配置不同項目的參數。
圖片

在這裡我配置了三個項目,分別是intermodalTransport、onlineBattle、convergence。不同的項目ID當然需要不同,配置ID的方法有兩種:

  1. 第一種就是直接使用applicationId這個屬性,直接給intermodalTransport配置一個ID屬性即可。

  2. 第二種就是使用applicationIdSuffix這個屬性,這個的意思是在defaultConfig的默認ID基礎上,在後面追加一段,如下圖示例程式碼。

android {
    defaultConfig {
        applicationId "com.flavor.myapp"
    }
    productFlavors {
       intermodalTransport{
            applicationIdSuffix ".a"
        }
       onlineBattle {
            applicationIdSuffix ".b"
        }
    }
}

Ps: 如上是build.gradle文件配置,配置完成後可在如下截圖的Build Variants處看到相應配置的選擇菜單,截圖如下:

圖片

資源文件配置

我在build.gradle配置了三個項目,那麼相應的需要建立三個資源文件夾,main屬於工程主體,如下圖所示。

圖片

Ps:在這三個文件夾裡面創建資源的時候一定要和main的文件格式一致,這個格式一致是指包名必須相同。在配置Flavor中,在進行構建的時候會將選中的Flavor和main進行結合構建,說白了就是如果Flavor沒有的東西就會使用main裡面的代替,一般來說都會各自用各自的資源,比較好管理。

Java文件:要求flavor中只存放各自特性的java文件程式碼,main中放置多個flavor公共的java文件程式碼。

清單文件Manifest

清單文件不像Java程式碼文件那樣,每個項目相同的Java程式碼文件不可以和main中的Java程式碼文件共存,而是main和每個項目都可以有清單文件,但是又不會像res資源文件那樣,項目中的res資源文件會覆蓋main的res資源文件。

在編譯的時候Android studio會把main的清單文件和選中項目的清單文件合併,但是合併就會出現衝突。在這裡只介紹兩種合併方法:merge和replace

具體配置屬性位置如下截圖:

圖片

Application屬性欄位:node

Merge屬性:一般來說以main中為主題,其他flavor為分支差異版本配置的時候使用,一般都是把flavor與main的清單文件合併取交集。

Replace屬性:在出現flavor與main中有相同的屬性名的時候,或優先使用flavor中的清單屬性替換main,這個屬性不建議使用。

如何程式碼識別當前處於哪個flavor開發環境?

程式碼中獲取配置文件”BuildConfig.java”中的各變數,以實現對應型號產品特定的功能和邏輯。

圖片