1. 程式人生 > >python 打安卓APK渠道包,分分鐘千把個

python 打安卓APK渠道包,分分鐘千把個

目前安卓APK打渠道包,主要有3種方式,

一、傳統手動, 一個一個的改渠道號,然後改一個打一個,這種只有當渠道數不多時用,如果渠道有幾百甚至上千個,估計眼睛都會花手都會麻,還不知道何時何月才能完成

二、gradle配置,可以先把所有的渠道都在gradle裡面配置好,然後執行打包,就會一個一個的去編譯,直接到打完,一般情況打一個包需要半分到一分鐘,如果100個包需要2個小時,1000個包需要一天,我的神啊,這種方式只能用於渠道包不是很多的情況下

三、接下來講講本文的重點方法,Python打包,原理很簡單,就是把一個APK檔案解壓後放入一個渠道命名的空檔案,然後再把這些檔案壓縮回APK,經過使用,確實非常方便快捷,一分鐘打1000個絕對不是問題,下面有圖有真相,我打了大概500個渠道包,耗時15秒,牛逼吧!大笑

如圖:


 下面貼下打包的Python程式碼,目的就是把APK解壓,然後利用渠道號檔案,生成對應渠道的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
接下來是Java檔案程式碼,目的是根據APK中的渠道檔案獲取渠道號
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:


說下Windows下怎麼執行執行Python指令碼,首先要安裝Python工具,我這裡用的2.7,當然也可以用其他版本,可能會影響的python語法,有語法問題,自行修改,

安裝好配置下環境變數,然後在命令提示符裡面檢查下:輸入   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   點選開啟連結