-
基于 Xposed 实现的无侵入的运行时 AOP (Aspect-oriented Programming) 框架,可以实现在线修复 Bug,修复粒度方法级别,但是由于对 ART 虚拟机不支持,导致其对 Android 5.0、6.0 均不支持,使用局限性太大。目前基于这一原理实现的解决方案是手淘团队开源的 Dexposed 项目。
-
native hook 方式,其核心部分在 JNI 层对方法进行替换,替换有问题的方法,修复粒度方法级别,无法在类中新增和删减字段,可以做到即时生效,该原理的实现方案主要是阿里团队开源的 AndFix 。
-
该原理由 QQ 空间技术团队提出,使用新的 ClassLoader 加载 patch.dex,hack 默认的 ClassLoader,替换有问题的类,修复粒度类级别,一般无法做到即时生效,需要在应用下一次启动时生效。目前基于该原理实现的方案有 Nuwa、HotFix、RocooFix 。
-
dex 文件全量替换,基于 DexDiff 技术,对比修复前后的 dex 文件,生成 patch.dex,再根据 patch.dex 更新有问题的 dex 文件。该方案由微信团队提出:微信Android热补丁实践演进之路 ,暂时还未开源。目前基于这一原理实现的开源方案只有一个:Tinker_imitator 。
- 只能修复方法,无法新加类和字段;
- 对部分机型不支持;
- 方法的参数类型有限制;
- 暂时不支持新增方法、新增类
- 不支持新增 Field
- 不支持针对同一个方法的多次 patch,如果客户端已经有一个 patch 包在运行,则下一个 patch 不会立即生效。
- 三星 note3、S4、S5 的 5.0 设备以及 X8 6设备不支持(点击查看具体支持的机型)
- 参数包括:long、double、float 的方法不能被 patch
- 被反射调用的方法不能被 patch
- 使用 Annotation 的类不能 patch
- 参数超过 8 的方法不能被 patch
- 泛型参数的方法如果 patch 存在兼容性问题
[TOC]
X-EDU-CLIENTVERSION #客户端版本号,比如v1.9.1
Type:Post
Url:api/app/check
Request:
{
"versionCode":int,
"currentPatchName":String #已经加载的patch名字,如果没加载过,则为null。
}
Response StatusCode 200
{
"downloadUrl":string #如果有需要下载的则返回下载地址,没有则不返还该字段。
}
###2.1_当前apk列表 Type: Get URI:api/h5/apk/list
Request:none
Response
StatusCode 200
{
"apkList":[
apkName:string,
apkSize:int
]
}
###2.2_删除某个apk Type Delete URI:api/h5/apk/del?appName={apkName} #包括后缀名
Request:none
Response
StatusCode 200
###2.3_上传apk Type Post URI:api/h5/apk/upload
Request
{
"apkFile":File
}
Response
StatusCode 200
Type:Get
URI:api/h5/patch/list
Request:none
Response
StatusCode 200
{
"patchList":[
patchName:String,
patchSize:int
]
}
Type:Delete
URI:api/h5/patch/del?patchName={patchName}
Request:None
Response
StatusCode 200
Type:POST
URI:api/h5/patch/create
Request
{
"oldName":string,
"newName",string
}
Response
StatusCode 200