android百度多渠道打包,Android多渠道打包方案的实践与优化
目前使用過的多渠道打包方式有兩種 ,一種是通過gradle打包,還有一種是美團的多渠道打包方案具體詳情見這里
1、Gradle打包
1.1、在Androidmanifest.xml中添加
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
1.2、在build.gradle中添加
productFlavors {
// 百度
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
//魅族
meizu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
//搜狗
sougou {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "sougou"]
}
這時候在Android Studio右側的Gradle project工作區中就可以看到在這里配置的多個渠道了,雙擊相應的選項就能build出相應的渠道包了,assembleRelease是build出所有渠道的Release包,這里只使用了少量的渠道作為示例。這里的UMENG_CHANNEL_VALUE需要和meta-data中的value一致才能替換。
1.3、獲取渠道號
public static String getApplicationMetadata(Context context,
String metaDataKey) {
ApplicationInfo info = null;
try {
PackageManager pm = context.getPackageManager();
info = pm.getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
return String.valueOf(info.metaData.get(metaDataKey));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
這里的metaDataKey自然就是UMENG_CHANNEL了
2、美團多渠道打包方案
2.1、環境配置
由于美團的多渠道打包方案需要依靠腳本來實現,這里我用的是python,經試驗腳本文件在windows 下用3.6版本和mac下用2.7版本都能完美運行。并且需要安裝openpyxl模塊。
2.2、文件說明
打包的文件有channels.xlsx 和 package.py
channels.xlsx是一個excel表格里面第一列是渠道號的id,第二列是渠道號的名稱,第三列是渠道名稱的備注(非必須)
package.py 是一個python腳本文件
import datetime
import zipfile
import shutil
import sys
import os
from openpyxl import load_workbook
starttime = datetime.datetime.now()
apk_path = sys.argv[1]
print(os.path.abspath(apk_path))
file_path=os.path.dirname(os.path.abspath(apk_path))+os.path.sep
out_path =file_path+'output'
if not os.path.exists(out_path):
os.makedirs(out_path)
else:
shutil.rmtree(out_path,True)
os.makedirs(out_path)
name = os.path.basename(apk_path)
origin_apk_name = os.path.splitext(name)[0]
wb=load_workbook(filename=file_path+'channels.xlsx',read_only=True)
sheets = wb.get_sheet_names()
ws=wb[sheets[0]]
for row in ws.rows:
idStr=str(row[0].value)
channelStr=str(row[1].value)
channel_apk_name='{}-{}-{}.apk'.format(idStr,channelStr,origin_apk_name)
channel_apk_path=os.path.join(out_path,channel_apk_name)
shutil.copy2(apk_path,channel_apk_path)
zipped=zipfile.ZipFile(channel_apk_path,'a',zipfile.ZIP_DEFLATED)
empty_channel_file="META-INF/channel_{}_{}".format(idStr,channelStr)
zipped.writestr(empty_channel_file, '')
zipped.close()
print(idStr+":"+channelStr)
endtime=datetime.datetime.now()
between=(endtime-starttime).microseconds/1024
print('time:%d ms' % between)
2.3、運行腳本
在命令行中輸入 python package.py xxxx.apk
如果Python命令是在package.py所在目錄下用上面的方式輸入,也可以將package.py和apk文件直接拖入命令窗口中執行,然后就會在apk所在路徑下生成一個output文件夾里面有所有生成的渠道包。
2.4、獲取渠道號
這時候用Android Studio 打開新生成的渠道包,Build——>Analyze Apk選中剛才生成的apk打開META-INF文件夾可以看到這樣的的一個文件channel_{id}_{name}的文件,由于它是一個空文件,所以可以看到它的體積大小為0B。因此新的渠道包也不會需要重新簽名。
代碼中獲取渠道號
public static String[] getChannel() {
ApplicationInfo appinfo = App.getInstance().getContext().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("META-INF/channel")) {
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) {
for (int i = 0; i < split.length; i++) {
Logger.e(split[i]);
}
return split;
} else {
return null;
}
}
在這里獲取到的split信息應該是[“META-INF/channel”,”18”,”uc”],然后獲取自己需要的信息就好了
3、兩種打包方式對比
打包方式
特點
優點
缺點
適用場景
gradle
productFlavors下配置渠道號,assembleRelease一鍵執行打完所有包
配置簡單
每個包都需要重新build,耗時較長
渠道包較少時
美團多渠道打包方案
通過腳本文件在apk的META-INF目錄下生成包含渠道號的空文件
打包速度快
需要依賴外部的腳本文件來實現,修改腳本有學習成本
渠道包比較多時
4、遇到的其他問題
4.1、umeng的渠道號設置
這種方式不會替換meta-data中的信息,好在umeng提供了在代碼中設置channel的方法,詳情見這里
4.2、注意事項
渠道包的位置一定要和channel的配置文件在同一目錄下
4.3、打包方式優化
這種方式還是需要自己輸入命令行,稍后打算寫一份.bat文件讓他雙擊運行。
打包腳本下載
轉載請注明出處:http://blog..net/zhong1113/article/details/54094770
總結
以上是生活随笔為你收集整理的android百度多渠道打包,Android多渠道打包方案的实践与优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式之结构类模式PK
- 下一篇: php stmp 授权码问题,PHPma