本文已参与「新人创作礼」活动,一起开启掘金创作之路。
为什么要批量处理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)