前言
在前面的文章中,我们已经掌握了升级包的制作
在平常,如果需要进行刷机,通常需要进行以下步骤
如果遇到软件更新的情况,则需要再进行以上的操作,繁琐切麻烦
那么问题来了,如何在没有电脑和没有U盘的情况下进行更新系统呢?
如何快捷的进行更新呢?
如何更接近官方的更新方式呢?
分析
系统中自带的app做为研究对象,通过反编译+抓包的方式进行桥接破解
抓包
车机连接上wifi后设置服务器代理进行抓包,数据源样例
1 2 3 4 5 6 7
| POST http://fota.timasync.com/api/check?componentVersion=A10T.AVNT.S.190427.V6.59.R&mac=123&model=AVNTG2A10&vendor=GAEI_ECU_DEV&locale=zh&imei=456 HTTP/1.1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) chrome/33.0.1750.146 Safari/537.36 Host: fota.timasync.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 0
|
请求参数说明:
- componentVersion=A10T.AVNT.S.190427.V6.59.R 当前系统版本
- mac=123 车机MAC地址
- model=AVNTG2A10 车辆型号
- vendor=GAEI_ECU_DEV 供应商?
- locale=zh 车机语言
- imei=456 车机imei
无升级包时返回值样例
1
| {"code":1006,"packageType":0,"root":0,"success":true}
|
有升级包时返回值样例
1 2 3 4 5 6 7 8 9 10 11 12
| { "code": 0, "packageType": 1, "root": 0, "success": true, "cdnDistribution": 1, "newComponentVersion": "A10T.AVNT.S.200115.HOST.V1.0", "packageMd5": "c10b9cb5cf49b6aab2b543ea870730fa", "packageName": "A10T.AVNT.S.200115.HOST.V1.0", "packageSize": 102400, "packageDesc": "描述" }
|
- root 是否root
- cdnDistribution 升级包cdn的id
- newComponentVersion 新版本名称
- packageMd5 新版本的MD5
- packageName 升级包名称
- packageSize 升级包大小
- packageDesc 此次升级描述、内容
编码
得到以上数据包即可进行编码,做一个服务端,核心代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| [Route("check")] [HttpPost] public async Task<CheckResult> CheckFota(string componentVersion, string mac, string model, string vendor, string locale, string imei) { var package = await _fotaService.CheckPackageUpdate(componentVersion, mac, model, vendor, locale, imei);
var result = new CheckResult(); if (package == null) { result.code = 1004; result.packageType = 0; result.root = 0; result.success = true; } else { result.code = 0; result.packageType = package.Type; result.root = 0; result.success = true; result.cdnDistribution = package.Id; result.newComponentVersion = package.ComponentVersion; result.packageMd5 = package.Md5; result.packageName = package.Name; result.packageSize = package.Size; result.packageDesc = package.Describe; }
return result; }
|
进阶
现在可以实现对系统更新的服务端接管,但是无法实现个性化,举个例子
现有系统更新包A10T.AVNT.S.190427.V6.59.R、A10T.AVNT.S.191125.V6.59.R
现在A想更新190427的版本,B想更新191125的版本,C表示我不想更新系统,不要推送系统给我
如何实现个性化是一个大的问题
纵观系统更新发出来的数据包中带有的参数,mac和imei都可以进行对唯一的车机进行识别
那么我们就做一个推送的规则功能
1 2 3 4 5 6 7 8 9 10 11
| FotaPackage package = null; var rule = await _ruleRepository.FindRule(imei); if (rule != null) { package = await _packageRepository.FindPackage(model, vendor, componentVersion); if (package != null) { return package; } }
|
根据imei识别规则,如果推送规则中有内容,则推送更新,完美解决系统更新中个性化的问题
现在只需要知道自己车机上的imei,然后到平台上选择推送的包,添加到推送规则中即可实现在线更新,大大方便了个性化的需求