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
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