Gradle多渠道打包
阿新 • • 發佈:2018-12-08
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
- 修改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下邊的資原始檔的,當然得一致】。 然後把需要替換的資原始檔放到對應的目錄就行。
–注意: 檔名和要替換的資原始檔名要一樣!!!–
- 切換到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();
}
>> 錯誤的或不嚴謹的地方多多指教!