背景
每一次发版不仅意味着新功能的上线,也同样会导致安装包大小的改变。
为了解决每次安装包大小的改变测试能完全掌握具体情况,所以需要有这样一个平台实现.apk包所有文件遍历并获取大小。
功能
同一个应用包的两个不同版本文件大小对比
1、获取apk大小等基本信息
2、遍历文件夹,分别展示新增文件、体积增加文件、删除文件、体积减小文件列表木块
3、支持.jar包文件比对
4、前端页面包含:上传文件页面、任务列表页、结果详情页
实现步骤
1、前端页面上传需要对比的两个apk文件,保存到服务器
前端上传文件控件:
<input class="btn btn-default btn-lg" type="file" name='file[]'/>
后端获取文件:
# 需要同时获取多个文件
fuploaded_files = request.files.getlist("file[]")
# 保存到同一个文件夹下
for file in fuploaded_files:
file.save(os.path.join(dirname, file.filename))
2、解压缩文件,判断文件类型,获取基本知识,遍历文件夹
解压缩
def unzip(sourceFile, targetPath):
'''
:param sourceFile: 待解压zip路径
:param targetFile: 目标文件目录
:return:
'''
file = zipfile.ZipFile(sourceFile, 'r')
file.extractall(targetPath)
return file, targetPath
def postfixReplace(file_name):
if '.jar' in file_name:
return 0
if '.apk' in file_name:
return 1
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
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
3、分列同一个文件增加、减少大小信息,新增、删除文件信息
前端
<div class="row">
<div class="col-xs-1 col-xs-offset-1" id="myScrollspy">
<ul class="nav nav-tabs nav-stacked" data-spy="affix" data-offset-top="100" data-offset-bottom="200">
<li class="active"><a href="#section-1">任务信息</a></li>
<li><a href="#section-2">新包中新增文件列表</a></li>
<li><a href="#section-3">新包中体积增大文件列表</a></li>
<li><a href="#section-4">新包中体积减少文件列表</a></li>
<li><a href="#section-5">新包中删除文件列表</a></li>
</ul>
</div>
</div>