接手項目後發現公司的渠道信息統計使用的友盟,但是仔細查看代碼後發現打包的方式特別麻煩,換渠道都得手動更改渠道值,於是纔有了更改打包方式的
想法,就以友盟多渠道打包爲例,下面附上代碼.
渠道信息一般在AndroidManifest.xml
中的meta-data中更改ChannelID:
<meta-data
android:name="UMENG_CHANNEL"
android:value="wandoujia"/>
但是以上方式每次換渠道都需要手動更改.所以改用偷懶的方式:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
其中
${UMENG_CHANNEL_VALUE}
中的值就是你在gradle
中自定義配置的值。
productFlavors {
meizu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
c360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
huawei {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
leshi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "leshi"]
}
}
當然,還有另外一種更簡潔的方式:
productFlavors {
wandoujia {}
baidu {}
c360 {}
uc {}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
其他的配置按照開發文檔配置就ok了.再附上獲取渠道的代碼:
public static String getChannelName(Context context) {
if (context == null) {
return null;
}
String channelName = null;
try {
PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
//注意此處爲ApplicationInfo 而不是 ActivityInfo,因爲友盟設置的meta-data是在application標籤中,而不是某activity標籤中,所以用ApplicationInfo
ApplicationInfo applicationInfo = packageManager.
getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return channelName;
}
再來說debug運行正式簽名apk,爲什麼要debug運行正式簽名的apk呢?由於第三方登錄分享和支付需要與正式簽名一致,所以需要debug運行正式
簽名的apk,只是方便測試回調.多的不說直接附上代碼:
在build.gradle中加入signingConfigs:
signingConfigs {
release {
storeFile file("簽名key的路徑")
storePassword "*****"
keyAlias "****"
keyPassword "****"
}
}
在BuildTypes中加入代碼:
debug {
// // 顯示Log buildConfigField "boolean", "LOG_DEBUG", "true"
// versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.release
}
ok了,測試debug運行的就是正式簽名的apk了.
剩下的就是自定義打包的apk名稱了.
release {
// 不顯示Log buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled true
zipAlignEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 輸出apk名稱爲xxx_v1.0_2016-08-26_wandoujia.apk xxx可以進行自定義
def fileName = "我的apk_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
其中releaseTime的方法:
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
OK了.that's all!!!