Gradle for Android系列之五 多渠道打包
我們知道,很多的app需要釋出在不同的應用商店中,但是各應用商店對上架的要求有時候又不相同,也就意味著我們需要針對不同的渠道,構建不同的渠道包,如果手動做這些事情,會比較繁瑣,那麼使用Gradle會方便很多!本篇在前文的基礎上介紹一下使用gradle多渠道打包。
今天的內容基本上都是在app目錄對應的build.gradle的android方法中設定的。主要是用到了gradle的Android外掛裡的productFlavors功能。
首先,我們需要設定buildTypes
buildTypes {
release {
//是否啟用混淆
minifyEnabled true
//混淆檔案配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//混淆後的zip優化,預設為true,可以不用設定
zipAlignEnabled true
// 移除無用的resource檔案
shrinkResources true
//是否保留除錯資訊
debuggable false
}
debug {
//是否啟用混淆
minifyEnabled false
//混淆檔案配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//混淆後的zip優化,預設為true,可以不用設定
zipAlignEnabled true
// 移除無用的resource檔案
shrinkResources true
//是否保留除錯資訊
debuggable true
}
}
我們在正常情況下,我們釋出生產包,需要簽名資訊的,這時我們可以配置一下apk的簽名資訊signingConfigs,
signingConfigs {
debug {
//也可以是xxx.keystore具體要看你使用什麼簽名了
storeFile file("GradleDemo.jks")
storePassword "android"
keyAlias "android"
keyPassword "android"
}
release {
storeFile file("GradleDemo.jks")
storePassword "android"
keyAlias "android"
keyPassword "android"
}
}
這些簽名資訊,放在build.gradle檔案中可能不安全,所以我們可以將其放在gradle.proprerties中,這樣可以所有的module的build.gradle都可以引用,現在gradle.proprerties中配置(其他的屬性如compileSdkVersion,buildToolsVersion這些也可以,寫在該檔案中,可以達到複用的目的 ):
STORE_PASSWORD="android"
KEYALIAS="android"
KEYPASSWORD="android"
STORE_PATH="GradleDemo.jks"
接著我們在build.gradle檔案中我們可以像以下一樣引用:
signingConfigs {
release {
storeFile file(STORE_PATH)
storePassword STORE_PASSWORD
keyAlias KEYALIAS
keyPassword KEYPASSWORD
}
release {
storeFile file(STORE_PATH)
storePassword STORE_PASSWORD
keyAlias KEYALIAS
keyPassword KEYPASSWORD
}
}
配置完簽名資訊後,我們可以在buildTypes中新增簽名屬性signingConfig signingConfigs.release:
buildTypes {
release {
//是否啟用混淆
minifyEnabled true
//混淆檔案配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//混淆後的zip優化,預設為true,可以不用設定
zipAlignEnabled true
// 移除無用的resource檔案
shrinkResources true
//是否保留除錯資訊
debuggable false
signingConfig signingConfigs.release
}
debug {
//是否啟用混淆
minifyEnabled false
//混淆檔案配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//混淆後的zip優化,預設為true,可以不用設定
zipAlignEnabled true
// 移除無用的resource檔案
shrinkResources true
//是否保留除錯資訊
debuggable true
signingConfig signingConfigs.debug
}
}
配置好這些基本的資訊後,就需要設定本篇的重點productFlavors,這裡用豌豆莢和應用寶做演示:
productFlavors {
wandoujia {}
yingyongbao {}
}
就這樣設定好每個渠道對應的name,當然可以跟著不同渠道的要求,設定相應的屬性,例如設定不同的applicationId,不同的啟動頁面等。接著在AndroidManifest.xml檔案的application的標籤下設定meta-data:
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}"/>
通過Gradle Android外掛裡的另一個功能manifestPlaceholders來自動的替換CHANNEL_VALUE,我們還需要在build.gradle檔案中新增:
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
到這裡我們已經配置好了各渠道的資訊。但是我們通常還需要根據不同的渠道和版本資訊來命名apk的名稱,以方便我們進行發版:
//app-v1.0-wandoujia-debug.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 輸出apk名稱為wooyun_v1.0_wandoujia.apk
def fileName = "app-v${variant.versionName}-${variant.productFlavors[0].name}-${variant.buildType.name}.apk".toLowerCase()
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
在app的build目錄下生成類似於app-v1.0-wandoujia-debug.apk這種命名方式的apk。到此基本上就能滿足一般的需求了。
如果我們在應用啟動時候,需要用到渠道的資訊,可以這樣獲取:
public static String getChannelName(Context ctx) {
if (ctx == null) {
return null;
}
String channelName = null;
try {
PackageManager packageManager = ctx.getPackageManager();
if (packageManager != null) {
//注意此處為ApplicationInfo 而不是 ActivityInfo,因為我們設定的meta-data是在application標籤中,而不是某activity標籤中,所以用ApplicationInfo
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
channelName = applicationInfo.metaData.getString("");
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return channelName;
}
相關文章
- android gradle 多渠道打包小結AndroidGradle
- Android 詳解Gradle(3.1.4)實現多渠道打包AndroidGradle
- Android持續整合:Jenkins+Gradle+360加固+多渠道打包AndroidJenkinsGradle
- Android多渠道打包Android
- Android 多渠道打包配置Android
- Walle —— Android多渠道打包神器Android
- Gradle系列之Android Gradle基礎配置GradleAndroid
- Android進階之Walle多渠道打包&Tinker熱修復Android
- Android美團多渠道打包Walle整合Android
- Android 多渠道打包開發記錄Android
- Android多渠道打包相關介紹Android
- Gradle多渠道打包的原理、實踐與輔助開發Gradle
- Android Gradle指令碼解決美團多渠道打包再加固渠道資訊丟失問題AndroidGradle指令碼
- 多渠道打包
- Gradle系列之Gradle外掛Gradle
- Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統JenkinsGitAndroid
- Gradle系列之認識Gradle任務Gradle
- Flutter 多渠道打包實踐Flutter
- 《Android Gradle權威指南》之Gradle入門AndroidGradle
- Android 多渠道配置Android
- Gradle入門系列(五)——Gradle其它模組與Plugin外掛GradlePlugin
- Android Studio之Gradle和Gradle外掛的區別AndroidGradle
- Android 註解系列之EventBus3“加速引擎“(五)AndroidS3
- Android面試題之Gradle配置篇Android面試題Gradle
- Flutter 多環境、多渠道自動打包Flutter
- 為什麼說 Gradle 是 Android 進階繞不去的坎 —— Gradle 系列(1)GradleAndroid
- Gradle系列(四) Gradle外掛Gradle
- Gradle多渠道打包(動態設定App名稱,應用圖示,替換常量,更改包名,變更渠道)GradleAPP
- Gradle系列之構建指令碼基礎Gradle指令碼
- Android library 釋出多渠道 AARAndroid
- Android官方多渠道方案詳解Android
- Android開發中Gradle外掛,Gradle版本與JDK版本之間的對應關係 AndroidAndroidGradleJDK
- 360加固+美團walle多渠道自動化打包
- 自動化瓦力多渠道打包python指令碼Python指令碼
- Android中的Gradle之玩轉自定義功能AndroidGradle
- Android打包之配置構建變體Android
- android Gradle錯(一)AndroidGradle
- Android Gradle外掛AndroidGradle
- 寫給 Android 開發者的 Gradle 系列(一)基本姿勢AndroidGradle