Android的應(yīng)用市場(chǎng)很多,簡(jiǎn)單羅列就有 360、應(yīng)用寶、小米、百度、安卓、91、搜狗、華為、豌豆莢、機(jī)鋒 等等,為了區(qū)分不同市場(chǎng)的推廣效果,一般產(chǎn)品經(jīng)理會(huì)要求在不同的市場(chǎng)上上架的apk有一個(gè)唯一的標(biāo)志,這個(gè)標(biāo)志被稱為渠道號(hào),一般結(jié)合友盟統(tǒng)計(jì)一起用,可以在友盟后臺(tái)上看不同渠道的推廣效果。
那怎么樣快速地打出多個(gè)渠道包呢?
??在Eclipse+ADT時(shí)代,最佳方案是美團(tuán)研發(fā)團(tuán)隊(duì)研究出來(lái)的,利用空文件不影響應(yīng)用簽名驗(yàn)證
的原理,可以1分鐘內(nèi)打完900多個(gè)渠道的包。
操作步驟如下:
- 編譯出一個(gè)原始的不帶渠道的apk
- 利用腳本在apk中添加空的渠道文件,渠道名的前綴為mtchannel_:
import zipfile
zipped = zipfile.ZipFile(your_apk, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=your_channel)
zipped.write(your_empty_file, empty_channel_file)
- 在Java代碼中讀取空渠道文件名
public static String getChannel(Context context) {
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
String ret = "";
ZipFile zipfile = null;
try {
zipfile = new ZipFile(sourceDir);
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.startsWith("mtchannel")) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String[] split = ret.split("_");
if (split != null && split.length >= 2) {
return ret.substring(split[0].length() + 1);
} else {
return "";
}
}
現(xiàn)在步入了Android Studio+Gradle的時(shí)代,我們也可以利用Gradle的productFlavors機(jī)制來(lái)做多渠道打包。以友盟為例,操作步驟如下:
- 在 AndroidManifest.xml中修改
UMENG_CHANNEL
:
<meta-data android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
- 在模塊下的build.gradle文件中增加
android{
productFlavors {
yingyongbao{}
baidu{}
anzhuo{}
jiuyi91{}
sanliuling360{}
sougou{}
huawei{}
xiaomik{}
wandoujia{}
jifeng{}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
}
- 在項(xiàng)目文件夾下執(zhí)行命令
gradlew assembleRelease
- 最后在
build/outputs/apk
下面就能看到生成的包了。
這種方式,簡(jiǎn)單方便不用寫腳本,但是耗時(shí)比較長(zhǎng),10個(gè)渠道打包要3~4分鐘,從時(shí)效上來(lái)看,還是美團(tuán)提供的方法比較好。
打完包之后,要驗(yàn)證一下,同樣以友盟統(tǒng)計(jì)為例,怎么樣知道自己的渠道號(hào)有沒(méi)有修改成功呢?
- 把設(shè)備在友盟后臺(tái)注冊(cè)為測(cè)試設(shè)備
- 在代碼中打開(kāi)調(diào)試開(kāi)關(guān)
MobclickAgent.setDebugMode( true );
- 點(diǎn)擊不同頁(yè)面,在logcat中查看
MobclickAgent
標(biāo)簽的信息,看到信息上傳后,去友盟后臺(tái)統(tǒng)計(jì)到的渠道是否符合預(yù)期。
參考:
Panda
2016-08-25