一、说明
互联网公司客户端软件升级通常分为:
- 普通升级 (判断条件是软件版本号)
- 增量升级
- 全量升级
- 强制升级
- 全量升级
- 灰度升级
1.根据灰度策略,命中的客户端提示升级
版本升级的判断依据是版本号及其安装包释放文件的md5值。
普通升级的判断条件是软件版本号,强制升级的判断条件是软件基础版本号,或者当有大版本更新或者软件构建框架升级。
增量升级只下载替换md5变化的文件
全量升级重写下载安装包,走安装流程
二、文件md5获取
#ifndef FILEMD5INSTANCE_H
#define FILEMD5INSTANCE_H
#include <QObject>
#include <QMutex>
#include <QDir>
#include <QCryptographicHash>
#include <QFile>
#include <QDebug>
class FileMd5Instance : public QObject
{
Q_OBJECT
public:
explicit FileMd5Instance();
~FileMd5Instance();
static FileMd5Instance* instance();
void fileMd5(const QDir &dir);
void bigFileMd5(const QDir &dir);
private:
static QMutex *m_pmutex;
static FileMd5Instance *m_pinstacne;
};
#endif // FILEMD5INSTANCE_H
#include "filemd5instance.h"
QMutex *FileMd5Instance::m_pmutex = new QMutex;
FileMd5Instance *FileMd5Instance::m_pinstacne = nullptr;
FileMd5Instance::FileMd5Instance()
{
}
FileMd5Instance::~FileMd5Instance()
{
}
FileMd5Instance *FileMd5Instance::instance()
{
if(nullptr == m_pinstacne){
m_pmutex->lock();
if(nullptr == m_pinstacne){
m_pinstacne = new FileMd5Instance;
}
m_pmutex->unlock();
}
return m_pinstacne;
}
void FileMd5Instance::fileMd5(const QDir &dir)
{
QStringList fileList = dir.entryList(QDir::Files, QDir::NoSort);
for(int i=0;i<fileList.size();i++){
QFile file(dir.path()+"/"+fileList.value(i));
file.open(QIODevice::ReadOnly);
QByteArray ba = QCryptographicHash::hash(file.readAll(), QCryptographicHash::Md5);
file.close();
qDebug()<<"fileMd5 file: "<<fileList.value(i)<<" MD5:"<< ba.toHex().constData();
}
}
void FileMd5Instance::bigFileMd5(const QDir &dir)
{
QStringList fileList = dir.entryList(QDir::Files, QDir::NoSort);
for(int i=0;i<fileList.size();i++){
QFile file(dir.path()+"/"+fileList.value(i));
file.open(QIODevice::ReadOnly);
QCryptographicHash md5(QCryptographicHash::Md5);
qint64 totalBytes = 0;
qint64 bytesWritten = 0;
qint64 bytesToWrite = 0;
qint64 loadSize = 1024 * 4;
QByteArray buf;
totalBytes = file.size();
bytesToWrite = totalBytes;
while (1){
if(bytesToWrite > 0){
buf = file.read(qMin(bytesToWrite, loadSize));
md5.addData(buf);
bytesWritten += buf.length();
bytesToWrite -= buf.length();
buf.resize(0);
}else{
break;
}
if(bytesWritten == totalBytes)
break;
}
file.close();
qDebug()<<"bigFileMd5 file: "<<fileList.value(i)<<" MD5:"<< md5.result().toHex().constData();
}
}
三、效果图