1. 程式人生 > >Android 使用Python實現多渠道打包

Android 使用Python實現多渠道打包

使用前提

需要結合Umeng的多渠道統計,Umeng的整合可以自己去官網瞭解,參考地址

環境配置

  1. Python2.x 可以再Python官網下載
  2. Android Studio

具體使用

1 . 首先在整合Umeng統計時 不要使用標籤在Manifest配置Umeng的APPID和channel。必須在自己的Application實現類中使用如下方式配置:

 private void initUmeng() {
        String appkey =SocializeConstants.APPKEY="58a2ae*************";
        String channelId = ManifestUtils.getChannel(this
); //這個方法會從META_INFO檔案下讀取渠道標誌 MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this, appkey, channelId); //初始化友盟配置資訊 LogUtil.e(config.mChannelId); MobclickAgent.startWithConfigure(config); //設定友盟配置資訊 }

2 . 編寫空的channel.apk檔案 可以直接新建一個空白txt文件,然後通過改字尾名實現。
3 . 新建channel.txt

文件,也就是渠道列表,如下圖所示,每個列表隔行顯示:

xiaomi
360
wandoujia
QQ
baidu
oppo
sougou
zhongyi

4 . 編寫python執行檔案 名字隨意命名.

注意不要直接在新建的文字編輯器中編寫,會出現亂碼問題。檔案內容如下:

import sys,os,shutil,zipfile,time #匯入依賴庫
apkVersion="1.0" #版本號
srcFileName="test.apk"  #需要多渠道打包apk的名字
outputFileName="test_V" #生成apk的字首名
destDir=os.path.abspath('.'
) file=open("channel.txt") #開啟包含渠道名稱的檔案 def writeChannelToApk(filename,channel): z=zipfile.ZipFile(filename,'a',zipfile.ZIP_DEFLATED) empty_channel_file="META-INF/channel_{channe}".format(channe=channel) target_file="channel.apk" z.write(target_file,empty_channel_file) z.close() print ("writeChannelToApkchannel"+channel+","+filename+"\n") def cpFile(srcPath,fileName): destPath = destDir + os.path.sep + fileName if os.path.exists(srcPath) and not os.path.exists(destPath): shutil.copy(srcPath,destPath) def getTime(): return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) if not os.path.exists(srcFileName): print ("sourcefile"+srcFileName+"notexists") sys.exit(1) start = time.clock() for line in file: channel=line.strip('\n').strip() targetFileName="_"+outputFileName+apkVersion+"_"+channel+".apk" #在這裡調整渠道包的名稱 print ("copyfile:"+targetFileName) cpFile(srcFileName,targetFileName) writeChannelToApk(targetFileName,channel) end = time.clock() print("The function run time is : %.03f seconds" %(end-start))

5 . 利用Android Studio打包apk(Eclipse的也可以)
需要注意的是 ,在Android Studio不要配置productFlavors資訊,配置好籤名資訊後,直接在Terminal 輸入gradlew assembleRelease進行簽名打包編譯。打包後的apk檔案放在與上面檔案同名目錄下。

6 . 在命令控制檯中輸入python channel.py命令執行打包操作,1~2s即可完成30個包。實在是太方便了。
7 . 不放心的同學可以再app內鍵入以下程式碼檢視channel是否正確了

 String channelId = AnalyticsConfig.getChannel(getApplicationContext()); //獲取友盟的渠道配置資訊

8 . ManifestUtils工具類中用到的方法如下:

/**
* 獲取META-INFO下面的渠道
* @param context
* @return
*/
public static String getChannel(Context context) {
if (!TextUtils.isEmpty(channel)) {
return channel;
}
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
ZipFile zipfile = null;
final String start_flag = "META-INF/channel_";
try {
zipfile = new ZipFile(sourceDir);
Enumeration<? extends ZipEntry> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.contains(start_flag)) {
channel = entryName.replaceAll(start_flag, "");
return channel;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}

上面用到的檔案可以到這個地址下載