python批量验证apk渠道包脚本

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

#_*_ 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()

原文:https://blog.csdn.net/Cloud_Huan/article/details/50833652?utm_source=copy

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今年老妈老爸要送三姥爷回老家,我突发奇想觉得得领着老公回老家去看看已故的姥爷。 姥爷家里算老大,早早出...
    天雅薇阅读 207评论 0 0