python批量反编译android apk包

656 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

为什么要批量处理apk包

最近要统计一批apk包的属性,大约有100多个apk包,大小上百G。所以需要批量对apk包进行解包查属性,选择python脚本调用apktool命令来实现。

1、用python枚举一个目录中所有的apk文件,保存结果到文件中。

def GetAllApkFileList(filepath):    resultlist = []    for root, dirs, files in os.walk(filepath):          for shortfilename in files:            #print('shortfilename:',shortfilename)            if IsApkFile(shortfilename):                fullfilename = root + '\\' + shortfilename                resultlist.append(fullfilename)                #print(fullfilename)    return resultlist

2、读取文件列表中的每一行,并替换回车换行

def DoParseApkFileList(apklistfilename):    count = 0    for line in open(apklistfilename, 'r', encoding='utf8'):        if len(line)>3:            line = line.replace('\r\n', '')            line = line.replace('\n', '')            line = line.replace('\r', '')            count=count+1            print(count, ']', line)            GetApkFileInfo(line)

3、获取一个apk包的信息

apk解包:

def DecompileOneApk(apkfilename, outpath):    decmd = 'java.exe -jar "'+apktool+'" d -f -k -m -s -api 24 -o "'+outpath+'"'+' "'+apkfilename+'"'    CallSystem(decmd)

4、读取Manifest.xml获取apk的包名

def ReGetPackageName(xmldata):    searchObj = re.search( r'package="(\S+)"', xmldata, re.M|re.I)    if searchObj:        return searchObj.group(1)    else:        return ''

5、清理解包结果

# 删除目录下所有文件,包括文件夹def del_dir(dir):    if not os.path.exists(dir):        return False    if os.path.isfile(dir):        os.remove(dir)        return    for i in os.listdir(dir):        t = os.path.join(dir, i)        if os.path.isdir(t):            del_dir(t)        else:            os.remove(t)    os.rmdir(dir)