阿里Spohix简介

阿里巴巴对Android热修复技术已经进行了长达多年的探索。

最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dexposed。但这个方案由于对底层Dalvik结构过于依赖,最终无法继续兼容Android5.0以后ART虚拟机,因此作罢。

后来支付宝提出了新的热修复方案Andfix。Andfix同样是一种底层结构替换的方案,也达到了运行时生效即时修复的效果,并且重要的是,做到了Dalvik和ART环境的全版本兼容。阿里百川结合手淘在实际工程中使用Andfix的经验,对相关业务逻辑解耦后,推出了阿里百川Hotfix方案,并得到了良好的反响。

此时的百川Hotfix已经是一个很不错的产品了,对于基本的代码修复需求都可以解决,安全性和易用性都做的比较好。然而,它所依赖的基石,Andfix本身,是有局限性的。且不说其底层固定结构的替换方案稳定性不好,其使用范围也存在着诸多限制,虽然可以通过改造代码绕过限制来达到相同的修复目的,但这种方式既不优雅也不方便。而更大的问题是,Andfix只提供了代码层面的修复,对于资源和so的修复都还未能实现。

再看一下同期的其他热修复方案,此时的热修复技术可谓是百花齐放,微信的Tinker、QQ空间的Nuwa、饿了么的Amigo、美团的Robust等等,各个热修复方案争相发布,都声称自己可以做到全方位全功能的热修复。不过他们各自有自身的局限性,或者不够稳定,或者补丁过大,或者效率低下,或者使用起来过于繁琐,大部分技术上看起来似乎可行,但实际体验并不好。而在我们看来,有很多技术细节能够做得更加完美。

终于在2017年6月11日,手淘技术团队联合阿里云正式发布了新一代Android移动热修复方案——Sophix。

Sophix的横空出世,将会打破各家热修复技术纷争的局面。我们可以满怀信心地说,在Android热修复的三大领域:代码修复、资源修复、so修复方面,以及方案的安全性和易用性方面,Sophix都做到了业界领先.

阿里Spohix使用



首先我们在阿里云创建Demo后,然后创建Android Sophix demo

第一步

我们在project下build.gradle中添加依赖
// 添加emas-services插件
classpath ‘com.aliyun.ams:emas-services:1.0.1’
//
maven { url ‘http://maven.aliyun.com/nexus/content/repositories/releases/’ }

在app的build.gradle中添加依赖

apply plugin: ‘com.aliyun.ams.emas-services’

api ‘com.aliyun.ams:alicloud-android-hotfix:3.2.3’

repositories {maven {url "http://maven.aliyun.com/nexus/content/repositories/releases"}}


在清单文件中添加权限,6.0需要动态申请,还需要添加你在阿里云创建demo的App ID,App Secret,RSA密钥

<! -- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 外部存储读权限,调试工具加载本地补丁需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />

如果需要混淆添加混淆代码

#基线包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release路径下,移动到/app路径下
#修复后的项目使用,保证混淆结果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-dontwarn com.alibaba.sdk.android.utils.**
#防止inline
-dontoptimize

创建SophixApllication

package com.sophix.demo;import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
/*** Sophix入口类,专门用于初始化Sophix,不应包含任何业务逻辑。* 此类必须继承自SophixApplication,onCreate方法不需要实现。* 此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。* AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。* 注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。* 如有其它自定义改造,请咨询官方后妥善处理。*/
public class SophixStubApplication extends SophixApplication {private final String TAG = "SophixStubApplication";// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。@Keep@SophixEntry(MyRealApplication.class)static class RealApplicationStub {}@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//         MultiDex.install(this);initSophix();}private void initSophix() {String appVersion = "1.0.0";try {appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;} catch (Exception e) {}final SophixManager instance = SophixManager.getInstance();instance.setContext(this).setAppVersion(appVersion).setSecretMetaData(null, null, null).setEnableDebug(true).setEnableFullLog().setPatchLoadStatusStub(new PatchLoadStatusListener() {@Overridepublic void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {if (code == PatchStatus.CODE_LOAD_SUCCESS) {Log.i(TAG, "sophix load patch success!");} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {// 如果需要在后台重启,建议此处用SharePreference保存状态。Log.i(TAG, "sophix preload patch success. restart app to make effect.");}}}).initialize();}
}

其中MyRealApplication是我们的真正的application,我们在其中做我们项目的初始化等操作

package com.sophix.demo;import android.app.Application;
import com.taobao.sophix.SophixManager;public class MyRealApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中SophixManager.getInstance().queryAndLoadNewPatch();}
}

然后我们在清单文件中将application添加

  android:name=".SophixStubApplication"

第二生成补丁

我们需要通过阿里云的一个工具生成补丁包

patch补丁包生成需要使用到打补丁工具SophixPatchTool, 如还未下载打包工具,请前往下载Android打包工具。
Mac版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_macos.zip
Windows版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_windows.zip
Linux版本打包工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_linux.zip
调试工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk


通过旧包和新包生成补丁,在阿里云平台上传补丁,这的应用版本需要和SophixStubApplication中 String appVersion = “1.0.0” 一致

上传完成后,等一会就把BUG修复了
其实阿里云的Sophix文档写的很清楚傻瓜式接入,毕竟是收费的,下一篇介绍Sophix原理

Android热修复之阿里Sophix的使用详解相关推荐

  1. Android热修复之 阿里开源的热补丁

    1.概述   上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...

  2. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  3. Android热修复之 - 阿里开源的热补丁

    1.1 基本介绍 我们先去github上面了解它https://github.com/alibaba/AndFix 这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是 ...

  4. 深入解析阿里Android热修复技术原理

    前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...

  5. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  6. [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)

    热修复技术介绍 探索之路 最开始,手淘是基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed. 但该方案对于底层Da ...

  7. android热修复原理底层替换,Android 热修复 - 各框架原理学习及对比

    写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架.如 Jasonross 的 Nuwa,美团的 Robust,阿里的 Andfix,腾讯的 Tinker 等等...均 ...

  8. 动态化部署:Android热修复之代码修复(一)

    前记 传统发版要经过应用市场审核这一过程,但面对需要紧急修复的bug时无疑会增加时间成本,并且为了应对现在日渐强烈的运营需求,动态化部署应运而生,包括插件化和热修复,当然插件化和热修复充满了黑科技,包 ...

  9. Android热修复——深入剖析AndFix热修复及自己动手实现

    前言 去年写过一篇热修复的文章,那时候刚开始接触,照猫画虎画的还算比较成功.但是那种修复需要重新启动APP,也就是在JAVA层实现的热修复.我们知道目前Android主流的修复还有在Native层实现 ...

  10. 干货满满,Android热修复方案介绍

    摘要:在云栖社区技术直播中,阿里云客户端工程师李亚洲(毕言)从技术原理层面解析和比较了业界几大热修复方案,揭开了Qxxx方案.Instant Run以及阿里Sophix等热修复方案的神秘面纱,帮助大家 ...

最新文章

  1. 静态Web开发 JQuery
  2. underscore.js _.initial[Array]
  3. mybatis使用注解替代xml配置,动态生成Sql
  4. 【推荐】最全的积分墙基础知识大全:积分墙渠道运营那些事儿
  5. 一个硬核分布式数据库公司:pingcap
  6. python项目部署到url_项目上线部署
  7. [蓝桥杯][算法提高VIP]开灯游戏(dfs)
  8. VB数据库经典实例总结(二)
  9. 基于Tablestore Tunnel的数据复制实战
  10. 51Talk联合创始人兼COO张礼明离职
  11. python-获取满足条件的索引值np.where
  12. 微信小程序云开发教程-WXSS入门-常用样式
  13. matlab中转置操作,如何转置MATLAB表?
  14. 蜂鸣器常见错误电路分析
  15. SOLIDWORKS+CAD+UG软件培训 三款电脑学习软件
  16. Parameterize Method(令函数携带参数)
  17. Sam版Matlab粒子群PSO工具已经更新
  18. ssRender引擎
  19. 键盘VK键值(java键盘监听)
  20. LinuxC++:网络编程(一)最原始服务端及客户端代码实现和函数释义

热门文章

  1. DBSCAN聚类算法详解
  2. QT样式表设置 之 QComboBox下拉框样式
  3. css修改下拉框样式
  4. 6LowPAN与CoAP协议
  5. 用计算机算重积分,北京邮电大学计算机学院高等数学重积分的计算.ppt
  6. 【自定义WPS插件xlam】
  7. 网络编程项目 (网络词典)
  8. SA8155 QNX 系统启动时序
  9. 项目管理工具——5W1H分析法
  10. OSI七层网络协议归纳