我們知道,很多的app需要發布在不同的利用商店中,但是各利用商店對上架的要求有時候又不相同,也就意味著我們需要針對不同的渠道,構建不同的渠道包,如果手動做這些事情,會比較繁瑣,那末使用Gradle會方便很多!本篇在前文的基礎上介紹1下使用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
}
}
我們在正常情況下,我們發布生產包,需要簽名信息的,這時候我們可以配置1下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文件中我們可以像以下1樣援用:
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。到此基本上就可以滿足1般的需求了。
如果我們在利用啟動時候,需要用到渠道的信息,可以這樣獲得:
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;
}