您的位置:首页 > 编程语言 > Python开发

python批量验证apk渠道包脚本

2016-03-09 11:12 791 查看
上一篇是通过zipfile解压apk文件,批量提取文件夹里面所有apk的图标,本想着如果manifest文件直接提取出来就可以直接验证渠道包了,明显想多了。所以换着另一个方法提取,需要用到apktool.jar反编译apk,达到目的。

传送上一篇批量提取icon的脚本:我是任意门

原理:

传入一个文件夹路径,通过os模块遍历出文件夹下所有apk,然后为每一个apk开启一个反编译的线程,通过调用shell命令apktool反编译apk,然后re匹配渠道包,放入一个list中。最后,递归延迟检查如果apk数量和渠道号数量相同,那么程序结束,打印出所有渠道号。

ps:apktool和.py文件要在同一个目录下

后续能改进的地方:

可以把已有的渠道号保存到一个txt文件或者xls文件,然后apk提取出每一个渠道号之后和文件遍历比较,存在于列表就验证通过,如此最后结果可以再最后输出一个结论,这样测试直接看结果就行啦。

#!/usr/bin/env python
#_*_ coding:utf-8 _*_

'''
作者:cloudhuan
blog:http://blog.csdn.net/cloud_huan
'''

import os,sys,re
import thread,threading
import shutil
import time

########################################################################
class CheckChannel():
""""""
#----------------------------------------------------------------------
list_channel = []
def __init__(self,apkDir = '/home/cloudhuan/桌面/tmp'):
"""Constructor"""
self.apkDir = apkDir

def check(self):
self.listDir = os.listdir(self.apkDir)
for apk in self.listDir:
CheckThread(apk, self.apkDir,self.list_channel).start()
self.pp()

def pp(self):
if len(self.list_channel) == len(self.listDir):
print "渠道号共有这么多个:",len(self.list_channel)
for i in self.list_channel:
print i
else:
time.sleep(5)
self.pp()

########################################################################
class CheckThread(threading.Thread):
""""""
#----------------------------------------------------------------------
def __init__(self,apk,apkDir,list_channel):
"""Constructor"""
threading.Thread.__init__(self)
self.apk = apk
self.apkDir = apkDir
self.list_channel = list_channel

def run(self):
apk_name = os.path.splitext(self.apk)[0]
apk_in_path = os.path.join(self.apkDir,self.apk)
apk_out_path = os.path.join(self.apkDir,apk_name)
cmd = 'java -jar apktool.jar d -f -s %s %s'%(apk_in_path,apk_out_path)
os.popen(cmd)
manifest_path = os.path.join(apk_out_path,'AndroidManifest.xml')
if manifest_path == None:
raise IOError
with open(manifest_path,'r') as f:
m_result = f.read()
#re正则匹配的渠道key,不同apk可能不一样,这里是InstallChannel,有的是umeng_channel
pattern = re.compile(r'<meta-data android:name="%s" android:value="(\w+)"'%'InstallChannel')
self.list_channel.append(pattern.findall(m_result)[0])
shutil.rmtree(apk_out_path)

if __name__ == '__main__':
#实例化CheckChannel对象传入路径,默认是我的测试路径,如CheckChannel('c:/user/cloudhuan/test')
CheckChannel().check()


源码:http://download.csdn.net/detail/cloud_huan/9456296

最后的截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息