测试开发软件测试

APK两个包文件对比

2019-07-31  本文已影响1人  沈宥

功能:同一个应用包的两个不同版本文件大小对比
1、获取apk大小等基本信息
2、遍历文件夹,分别展示新增文件、体积增加文件、删除文件、体积减小文件列表木块
3、支持.jar包文件比对
4、前端页面包含:上传文件页面、任务列表页、结果详情页


结果详情页
一、上传文件,保存到本地
前端
<div class="container">
    <div class="center-block">
        <h4>请选择文件上传</h4>
                <form class="form-horizontal" role="form" action="/tasklist" method="post" enctype="multipart/form-data">
                    <table class="table table-striped table-hover table-condensed table-bordered">
                        <tr>
                            <th>新包</th>
                            <th>老包</th>
                        </tr>
                        <td width="100px">
                            <input class="btn btn-default btn-lg" type="file" name='file[]'/>
                        </td>
                        <td width="100px">
                            <input class="btn btn-default btn-lg" type="file" name='file[]'/>
                        </td>
                    </table>

                     <div class="container">
                        <input class="btn btn-success" type="submit" value="确认提交">
                     </div>
                </form>
    </div>
</div>
后端
# 需要同时获取多个文件
fuploaded_files = request.files.getlist("file[]")

# 保存到同一个文件夹下
for file in fuploaded_files:
    file.save(os.path.join(dirname, file.filename))
二、解压缩文件,判断文件类型,获取基本知识,遍历文件夹
1、解压缩
def unzip(sourceFile, targetPath):
    '''
    :param sourceFile: 待解压zip路径
    :param targetFile: 目标文件目录
    :return:
    '''
    file = zipfile.ZipFile(sourceFile, 'r')
    file.extractall(targetPath)
    return file, targetPath
2、判断文件类型
def postfixReplace(file_name):
    if '.jar' in file_name:
        return 0
    if '.apk' in file_name:
        return 1
3、获取基本知识
from androguard.core.bytecodes.apk import APK
def get_apk_info(apk_path):
    """
    获取apk信息
    :param root:
    :param f:
    :return:
    """
    apk_info = []
    try:
        androguard = APK(apk_path)
        if androguard.is_valid_APK():
            apk_info.append(get_file_md5(apk_path))
            apk_info.append(get_cert_md5(androguard))
            apk_info.append(androguard.get_app_name())
            apk_info.append(androguard.get_package())
            apk_info.append(androguard.get_androidversion_code())
            apk_info.append(androguard.get_androidversion_name())
            apk_info.append(androguard.get_main_activity())

    except Exception as e:
        print(apk_path + ' ->>', e)

    return apk_info

如何安装androguard

4、遍历获取所有文件名和大小
def apk2file(filepath, resultName, taskname):
    '''
        将apk中的dex文件提取出来
        :param filepath: apk文件路径
    '''
    # 直接用zipfule.ZipFile处理.apk文件
    apkfile, targetFile = unzip(filepath, resultName, taskname)

    # 存入数组中
    file_info_data = {}

    # 获取所有文件
    for filename in apkfile.namelist():
        # print(apkfile.namelist())
        # 如果是文件夹,继续遍历

        # 如果是文件,获取到文件大小

        resultFilePath = os.path.join(targetFile, filename)

        file_info_data[filename] = getFileSizeKB(resultFilePath)

        # writeFileInfo(filename, getFileSize(resultFilePath), resultName)

    return file_info_data
三、展示结果
上一篇下一篇

猜你喜欢

热点阅读