阿里SopHix热修复框架

2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案、阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner热更新)和阿里最新出品Sophix.它们在原理各有不同,适用场景各异。不过从技术上来说多数热修复框架是基于ClassLoader加载机制。下面是常见热修复框架的比较。

开通热修复服务

读者可以打开Sophix热修复的官网:Sophix官网1、注册阿里云账号,选择移动热修复服务 ,选择之后需要开通此功能,点击立即开通即可。

2、打开管理控制台,点击右上角创建APP。 

3、点击Hoxfix列表android版本的app后面的管理即可查看基本信息(AppId、AppSecret和密钥)。

本地接入热修复服务

1,添加依赖库和包

打开项目的app的build.gradle文件,添加maven仓库地址和hotfix库依赖:

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

dependencies {
    compile ‘com.aliyun.ams:alicloud-android-hotfix:3.1.0‘
}

注:如果项目中也依赖其它阿里系SDK,可能会同时依赖了utdid这个SDK,为了避免冲突可以这样。

dependencies {
      compile (‘com.aliyun.ams:alicloud-android-hotfix:3.1.0‘) {
           exclude(module:‘alicloud-android-utdid‘)
      }
}

2,AndroidManifest相关配置

在AndroidManifest配置文件中添加如下配置:

<!-- 网络权限 -->
<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"/>

在application标签下添加如下信息:

1 <meta-data
2             android:name="com.taobao.android.hotfix.IDSECRET"
3             android:value="AppId" />
4 <meta-data
5             android:name="com.taobao.android.hotfix.APPSECRET"
6             android:value="AppSecret" />
7 <meta-data
8             android:name="com.taobao.android.hotfix.RSASECRET"
9             android:value="RSA密钥" />

3,在Application中初始化Sophix。

initialize的调用应该尽可能的早,必须在Application.attachBaseContext()或者Application.onCreate()的最开始进行SDK初始化操作,否则极有可能导致崩溃。而查询服务器是否有可用补丁的操作可以在后面的任意地方。

例如:

 1 public class SophixApp extends Application {
 2
 3     @Override
 4     public void onCreate() {
 5         super.onCreate();
 6         initSophix();
 7     }
 8
 9     private void initSophix() {
10         String appVersion;
11
12         try {
13             appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
14         } catch (PackageManager.NameNotFoundException e) {
15             appVersion = "1.0.0";
16             e.printStackTrace();
17         }
18
19         // initialize最好放在attachBaseContext最前面
20         SophixManager.getInstance().setContext(this)
21                 .setAppVersion(appVersion)
22                 .setAesKey(null)
23                 .setEnableDebug(true)
24                 .setPatchLoadStatusStub(new PatchLoadStatusListener() {
25                     @Override
26                     public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
27                         // 补丁加载回调通知
28                         if (code == PatchStatus.CODE_LOAD_SUCCESS) {
29                             // 表明补丁加载成功
30                         } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
31                             // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
32                             // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,详见1.3.2.3
33                         } else {
34                             // 其它错误信息, 查看PatchStatus类说明
35                         }
36                     }
37                 }).initialize();
38         // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
39         SophixManager.getInstance().queryAndLoadNewPatch();
40     }
41
42 }

记得在AndroidManifest中使用我们自己的Application。

生成补丁并上传到控制台

1,为了简单,我们需要生成两个apk,两个apk做一个简单的内容区分即可。将第一个命名为old.apk,代码如下:

 1 public class MainActivity extends AppCompatActivity {
 2
 3     private TextView mTextView;
 4
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9
10         mTextView = (TextView) findViewById(R.id.textView);
11         mTextView.setText("版本修复前");
12
13     }
14 }

将第二个命名为new.apk,内容如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       TextView tv= findViewById(R.id.fix_text);
       tv.setText("版本修复后数据...");
       Toast.makeText(this,"版本修复完成",Toast.LENGTH_LONG).show();
    }
}

2,生成补丁的话需要下载阿里的打补丁工具SophixPatchTool,选择对应的平台,然后分别选择两次打包生成的apk,点击go即可。

补丁生成后,上传到阿里云平台,版本信息和代码的versionName对应。

然后点击上传补丁即可。

在选择正式发布之前,官方建议您先进行本地测试。下载hotfixdebug工具安装后,填写包名,点击连接应用,然后扫描补丁详情中的二维码下载补丁。或者将补丁包放到手机sdcard,填写绝对路径也是可以的。

Mode:1 表示扫码模式, Code:12 表示应用当前已经有一个补丁, 所以新补丁不会立刻加载需要等下一次重启加载。

总结

Sophix的优点:

1、补丁可以即时生效,不需要应用重启(我测试的过程中是因为本地已经存在了,所以需要重启APP);

2、补丁包同样采用差量技术,生成的PATCH体积小,阿里采用自己的SophixPatchTool进行补丁生成,简单易用;

3、对应用无侵入,几乎无性能损耗;

4、傻瓜式接入。

缺点:

开始收费,不过有免费阈值,每月5万台设备免费。具体资费请查看:价格资费

原文地址:https://www.cnblogs.com/ganchuanpu/p/8571493.html

时间: 2024-11-08 21:55:53

阿里SopHix热修复框架的相关文章

阿里 AndFix 热修复框架简介

阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexClassLoader PathClassLoader代码位于libcore\dalvik\src\main\Java\dalvik\system\PathClassLoader.java DexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\sys

阿里Sophix热修复

阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dexposed.但这个方案由于对底层Dalvik结构过于依赖,最终无法继续兼容Android5.0以后ART虚拟机,因此作罢. 后来支付宝提出了新的热修复方案Andfix.Andfix同样是一种底层结构替换的方案,也达到了运行时生效即时修复的效果,并且重要的是,做到了Dalvik和ART环境的全版本兼容

热修复框架Tinker的从0到集成之路

热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.csdn.net/lisdye2/article/details/54411727 本文出自:[Alex_MaHao的博客] 项目中的源码已经共享到github,有需要者请移步[Alex_MaHao的github] 2015年10月,QQ空间提出了热修复方案,一时间热修复风靡Android界,阿里的AndFix,360的插件形式,开源的NUWA等,都分别提出了自己的热修复实现方案,2016年微信推出了自己的热修复框

Android热修复框架AndFix原理解析及使用

一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分析.正好项目中要使用到.首先这个框架是开源的:https://github.com/alibaba/AndFix 其实在最早的时候我已经分析了阿里的另外一个热修复框架:Dexposed框架,还不了解的同学可以点击这里查看:Dexposed框架原理解析以及使用 当时介绍这个框架的时候发现他的实现原理很

探索安卓热修复框架AndFix的奥秘

虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app

十分钟教会你使用安卓热修复框架AndFix

腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的

走进热修复框架AndFix的世界

关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的一种解决方案.2.AndFix

Tinker 热修复框架模拟使用

导言 前不久,腾讯推出了"微信小程序"这一概念,对移动原生应用的影响可谓巨大.而几乎就在同时,腾讯在GitHub上开源了第一个项目Tinker,这是一个Android平台的应用热修复框架.可以在不重新安装应用的情况下,对应用的代码/库/资源进行更新.相关信息官方也已经给出详细介绍.得到这个消息时,笔者也尝试学习它给的Sample,希望能够使用到自己的项目中去.毕竟热修补是如今原生应用的一大痛点,有了热修补技术,类React Native应用的优势将缩小.这是一篇Tinker简单上手的说

Android中热修复框架Robust原理解析+并将框架代码从&quot;闭源&quot;变成&quot;开源&quot;(下篇)

一.回顾框架原理 本篇继续来看热修复框架Robust原理,在之前的一篇文章中已经详细讲解了:Robust框架原理,因为这个框架不是开源的,所以通过官方给出的原理介绍,咋们自己模拟了案例和框架逻辑的简单实践.最后在通过反编译美团app进行验证咋们的逻辑实现是否大致不差.最终确定实践的逻辑大同小异.但是在上一篇文章末尾多次强调了,这个框架吸引我研究的不是他热修复技术,而是他有一个技术点,就是如何在编译期给每个类每个方法都加上修复功能代码,对于上层开发代码是透明的.因为从之前案例可以看到,如果方法没有