文档章节

阿里热修复Sophix的基本使用

d
 djonce
发布于 2017/07/05 16:05
字数 1860
阅读 261
收藏 0
点赞 0
评论 0

什么是热修复?就是指能够修复软件漏洞的一些代码,是一种快速、低成本修复产品软件版本缺陷的方式(百度)。也就是当产品上线遇到bug,这个时候我们去发布一个新的版本,不但要过市场审核,而且发布没有多久又更新,用户体验也不好。这个时候我们就要考虑到使用热修复了,在app启动的时候会去联网下载差分包然后进行修复。
本文主要是介绍阿里的热修复Sophix的基本使用流程。Sophix提供了一套更加完美的客户端服务端一体的热更新方案,做到了图形界面一键打包、加密传输、签名校验和服务端控制发布与灰度功能,让你用最少的时间实现最强大可靠的全方位热更新。


对比.png

创建应用

创建应用主要是到阿里平台去创建,步骤如下:
首先进入MHub控制台
创建1.png

创建1-1.png

创建1-2.png

之后进入移动热修复控制台
步骤1.png

创建2-1.png

上图中AppId、AppSecret以及RSA密钥 后面集成到项目会用到

集成到Android项目

集成准备

1.配置build.gradle(Project:项目名)文件,添加如下配置:

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

下面是我的build.gradle文件内容:

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2.配置build.gradle(Module:app)文件,添加如下配置:

compile 'com.aliyun.ams:alicloud-android-hotfix:3.0.3'

传递性依赖utdid这个sdk, 所以不需要重复依赖utdid.但是另一方面其它阿里系SDK也可能依赖了utdid这个SDK, 如果编译期间报utdid重复, 所以此时进行如下处理即可, 关闭传递性依赖:

compile ('com.aliyun.ams:alicloud-android-hotfix:3.0.3') {
     exclude(module:'alicloud-android-utdid')
}

utdid实际上是为设备生成唯一deviceid的一个基础类库

如若仓库访问失败, 那么用本地依赖的方式进行依赖,SDK下载

3.Sophix使用到以下权限

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

READ_EXTERNAL_STORAGE/ACCESS_WIFI_STATE权限属于Dangerous Permissions,自行做好android6.0以上的运行时权限获取
4.配置AndroidManifest文件
在AndroidManifest.xml中间的application节点下添加如下配置:

<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密钥" />

将上述value中的值分别改为通过平台HotFix服务申请得到的App ID、App Secret和RSA密钥。具体可查看创建应用步骤
5.混淆配置

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

开始使用

在项目的Application中配置如下:

 @Override
public void onCreate() {
    super.onCreate();
    init();
}

private void init() {
    // initialize最好放在attachBaseContext最前面
    SophixManager.getInstance().setContext(this)
            .setAppVersion(BuildConfig.VERSION_NAME)
            .setAesKey(null)
            .setEnableDebug(true)
            .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                @Override
                public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                    // 补丁加载回调通知
                    if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                        // 表明补丁加载成功
                        Log.i(TAG,"表明补丁加载成功");
                    } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                        // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                        // 建议: 用户可以监听进入后台事件, 然后应用自杀
                        Log.i(TAG,"表明新补丁生效需要重启. 开发者可提示用户或者强制重启");
                    } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                        // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                        // SophixManager.getInstance().cleanPatches();
                        Log.i(TAG,"内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载");
                    } else {
                        // 其它错误信息, 查看PatchStatus类说明
                        Log.i(TAG,"其它错误信息, 查看PatchStatus类说明");
                    }
                }
            }).initialize();
    // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
    SophixManager.getInstance().queryAndLoadNewPatch();
}

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

生成补丁包

patch补丁包生成需要使用到打补丁包工具SophixPatchTool
Mac版下载
Windows版下载
生成补丁包工具:
主窗口
补丁工具.png

  • 旧包:<必填> 选择基线包路径(有问题的APK)。

  • 新包:<必填> 选择新包路径(修复过该问题APK)。

  • 日志:打开日志输出窗口。

  • 高级:展开高级选项,见下。

  • 设置:配置其他信息,见下。

  • GO!:开始生成补丁。

高级选项窗口
高级.png

  • 强制冷启动:勾选的话强制生成补丁包为需要冷启动才能修复的格式。默认不选的话,工具会根据代码变更情况自动选择即时热替换或者冷启动修复。

  • 不比较资源:打补丁时不比较资源的变化。

  • 不比较SO库:打补丁时不比较SO库的变化

设置选项窗口
设置.png

  • 补丁输出路径:<必填> 指定生成补丁之后补丁的存放位置,必须是已存在的目录。

  • Key Store Path:<选填>本地的签名文件的路径,不输入则不做签名。

  • Key Store Password:<选填>证书文件的密码。

  • Key Alias:<选填>Key的别名。

  • Key Passwrod:<选填>Key的密码。

  • AES Key:<选填>自定义aes秘钥, 必须是16位数字或字母的组合。必须与setAesKey中设置的秘钥一致。

  • Filter Class File:<选填>本地的白名单类列表文件的路径,放进去的类不会再计算patch,文件格式: 一行一个类名。

注意事项

  • 支持多渠道包仅选用某个渠道包的补丁,只需要保证变化相同即可,不过对于不同的基线包最好进行全面的测试。

  • 发布前请严格按照:扫码内测 => 灰度发布 => 全量发布的流程进行,以保证补丁包能够正常在所有Android版本的机型上生效。

  • mac下的补丁工具若出现一打开就崩溃的情况,请将补丁工具移到“应用程序”目录下即可。

上传补丁包到后台

上传补丁包需要借助于阿里云移动开发平台,登录平台后,首次上传需要创建版本后再上传与之对应版本的补丁包文件,步骤如图:
步骤1.png

步骤2.png

步骤2-1.png

步骤3.png

步骤4.png

步骤4-1.png

注:
补丁文件名称规范:
Android:文件名必须为:sophix-patch.jar;

调试工具

调试工具下载
调试工具用于patch正式发布前的调试环节

  • 扫码二维码方式,将刚刚上传到后台的补丁通过扫描二维码下载到本地,尝试加载补丁;

  • 应用本地补丁方式,传入本地补丁的绝对路径,尝试加载补丁。

调试工具.png

二维码获取方式如下:
调试1.png

调试1-1.png

补丁包加载成功后,打开或重新启动(防止没有及时生效的情况)应用进行查看。

也可查看我博客的另一个地址:https://dev.19ba.cn/android/125.html

© 著作权归作者所有

共有 人打赏支持
d
粉丝 1
博文 19
码字总数 16957
作品 0
杭州
阿里移动热修复Sophix试用

今年Android领域热门技术之一是热修复技术,试用了一下阿里的Sophix,真心给阿里的技术点赞,接入成本非常低。唯一遗憾的是不是完全免费,单个账户创建的应用总活跃设备超过5万台就会收费(偶...

代码坊 ⋅ 2017/08/11 ⋅ 0

阿里热修复Sophot成功案例

这几天研究了一下阿里百川热修复,简单记一下集成流程。 以AndroidStudio为例: 1.SDK下载及导入: ①下载地址:https://mhub.console.aliyun.com/?spm=5176.doc53239.2.1.5l5VVl#/download...

15192761251 ⋅ 2017/07/06 ⋅ 0

笔记 深入探索Android热修复技术原理

阿里电子书《深入探索Android热修复技术原理》整理的笔记 1.热修复技术介绍 代码修复两大主要方案 代码修复底层替换方案 代码修复类加载方案 资源修复 SO库修复:本质上是对native方法的修复和...

幻海流心 ⋅ 05/23 ⋅ 0

阿里热修复——sophix

集成前准备 1.登录、注册阿里云 2.依次选择:产品→移动云→移动热修复→立即开通→管理控制台→创建app(填写信息)→创建 AS集成 添加依赖 添加权限 配置application相关节点 编写Applicati...

文艺狼 ⋅ 2017/12/04 ⋅ 0

Android 插件化和热修复知识梳理

概述 在Android开发中,插件化和热修复的话题越来越多的被大家提及,同时随着技术的迭代,各种框架的发展更新,插件化和热修复的框架似乎已经日趋成熟,许多开发者也把这两项技术运用到实际开...

IAM四十二 ⋅ 2017/11/28 ⋅ 0

全面了解Android热修复技术

作者:赵裕, 腾讯移动客户端开发 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/338.html WeTest 导读 本文探讨了Android热修复技术...

腾讯WeTest ⋅ 2017/09/26 ⋅ 0

Android 热修复 - 各框架原理学习及对比

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

GoileoLee ⋅ 2017/12/12 ⋅ 0

Android热修复Tinker接入实战

自2016年底Android Studio3.0版本退出以来,Android提出了InstantRun热修复方案,基于这种机制,各种热修复框架竞相涌现,国内的软件大厂纷纷开发了自己的热修复框架。对于热修复的更多介绍大...

code_xzh ⋅ 05/04 ⋅ 0

【云周刊】第143期:如何让数据价值最大化?阿里全域大数据系统深度解读

本期头条 如何让数据价值最大化?阿里全域大数据系统深度解读 2016年,阿里巴巴集团提出中台概念,阿里巴巴数据技术及产品部作为中台战略中的组成部分,承载了集团数据中台的工作,其核心就是...

乔川 ⋅ 2017/10/25 ⋅ 0

“百川解码”第一期 热修复的坑和阿里的解

热修复是很多开发者关心的技术,8月27日晚,阿里百川组织了“百川解码”在线直播,以“热修复的坑和阿里的解”为主题,邀请了三位业界嘉宾对热修复技术进行了探讨,并介绍了阿里百川全面接受...

阿里百川 ⋅ 2016/09/12 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 32分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 47分钟前 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 48分钟前 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 55分钟前 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

前端基础(三):函数

字数:1685 阅读时间:5分钟 函数定义 在最新的ES规范中,声明函数有4中方法: -函数声明 -函数表达式 -构造函数Function -生成器函数 1.函数声明 语法: function name([param[, param2 [....

老司机带你撸代码 ⋅ 今天 ⋅ 0

Java虚拟机的Heap监狱

在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的“监狱”里,严格管理,生杀大权尽在掌握。 中国人把Stack翻译成“栈”,把Hea...

java高级架构牛人 ⋅ 今天 ⋅ 0

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 今天 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 今天 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部