python 打安卓APK渠道包,分分鐘千把個
目前安卓APK打渠道包,主要有3種方式,
一、傳統手動, 一個一個的改渠道號,然後改一個打一個,這種只有當渠道數不多時用,如果渠道有幾百甚至上千個,估計眼睛都會花手都會麻,還不知道何時何月才能完成
二、gradle配置,可以先把所有的渠道都在gradle裡面配置好,然後執行打包,就會一個一個的去編譯,直接到打完,一般情況打一個包需要半分到一分鐘,如果100個包需要2個小時,1000個包需要一天,我的神啊,這種方式只能用於渠道包不是很多的情況下
三、接下來講講本文的重點方法,Python打包,原理很簡單,就是把一個APK檔案解壓後放入一個渠道命名的空檔案,然後再把這些檔案壓縮回APK,經過使用,確實非常方便快捷,一分鐘打1000個絕對不是問題,下面有圖有真相,我打了大概500個渠道包,耗時15秒,牛逼吧!
下面貼下打包的Python程式碼,目的就是把APK解壓,然後利用渠道號檔案,生成對應渠道的APK
接下來是Java檔案程式碼,目的是根據APK中的渠道檔案獲取渠道號import sys,os,shutil,zipfile,time apkVersion="1.0" srcFileName="source.apk" apksDir="apks" destDir=os.path.abspath('.') target_file="channel.apk" 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) if not os.path.exists(target_file): open(target_file,'a').close() 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) if not os.path.exists(srcFileName): print "source file "+srcFileName+" not exists" sys.exit(1) start = time.clock() if not os.path.exists(apksDir): os.makedirs(apksDir) for line in file: channel=line.strip('\n').strip() targetFileName=apksDir+"/hoolay_"+channel+".apk" print "copyfile:"+targetFileName cpFile(srcFileName,targetFileName) writeChannelToApk(targetFileName,channel) end = time.clock() print("The function run time is : %.03f seconds" %(end-start)) #heliao-app-91-5.1.1
package com.hoolay.core.util; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.text.TextUtils; import java.io.IOException; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ManifestUtil { private static final String SP_KEY = "device_channel"; public static final String START_FLAG = "META-INF/channel_"; /** * 獲取META-INFO下面的渠道 * * @param context * @return */ public static String getChannel(Context context) { SharedPreferences sp = context.getSharedPreferences("hoolay_sp", Context.MODE_PRIVATE); String channel = sp.getString(SP_KEY, null); if (!TextUtils.isEmpty(channel)) { return channel; } ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; 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.contains(START_FLAG)) { channel = entryName.replaceAll(START_FLAG, ""); sp.edit().putString(SP_KEY, channel).apply(); return channel; } } } catch (IOException e) { e.printStackTrace(); } finally { if (zipfile != null) { try { zipfile.close(); } catch (IOException e) { e.printStackTrace(); } } } return ""; } }
下面是渠道號,按需自行增刪
360
appChina
wandoujia
91
baidu
QQ
3G
eoe
anzhi
163
hiapk
jifeng
xiaomi
meizu
oppo
lenovo
打好的APK:
安裝好配置下環境變數,然後在命令提示符裡面檢查下:輸入 python
如果有上提示,說明就好了,都完事了就可以執行Python指令碼了,接著需要進入到python指令碼所在的檔案目錄,因為這個腳本當前用的是相對路徑,然後輸入:python batch_apk.py
回車後就會看到在打包了,如果提示有語法錯誤或者找不到某個檔案,說明前置任務還沒完成,請自行百度和檢查,好了,各位童鞋,
最後我把打包工具的下載連結貼上
http://download.csdn.net/detail/msn465780/9572954
後續問題請看這篇文章
http://www.jianshu.com/p/52a3c3187dcc
Android 新一代多渠道打包神器
https://zhuanlan.zhihu.com/p/26674427 點選開啟連結新一代開源Android渠道包生成工具Walle
https://tech.meituan.com/android-apk-v2-signature-scheme.html 點選開啟連結