阅读本文大概需要10分钟。

其实热修复已经出来很久了,其中包含了很多的厂家的热修复方案,包含收费与免费,集成简单与集成复杂以及一些其他的区别性。综合考虑下选择了阿里的spohix修复方案,这里主要是简单的记录下修复的一些大概步骤,以及包含自己利用sophix加载本地的补丁包内容。

---------------------------------------------------------------分割线---------------------------------------------------------------
tips:
关于版本控制,形式为采取先修复新补丁,然后把旧补丁删掉, 每次打补丁需要基于初始版本进行打补丁

目前已知的一些问题:
1.修复不支持kotlin的协程,如果你的代码中包含协程内容,修复后的应用会崩溃
------------------------------------------------------------------。---------------------------------------------------------------
大致步骤如下:

  • 在阿里云控制台注册你的应用,拿到对应的几个key密钥,这几个密钥后面需要放到你的应用中作为识别的一种标志
  • 依赖(下载)sdk,集成到应用中
  • 选择接入方式(目前有快速接入【对android新版本可能有兼容性问题】和稳健接入),这里采用稳健接入的方式说明
  • 使用sdk中的application替换自己原先的application节点(自己application不用动,到时候放进sdk的application的就好了)
  • 其实做完上面的步骤就已经ok了,如果需要个性化处理自己再整(比如再什么情况下才去拉取热修复补丁包,或者通过加载本地的补丁包来绕过收费(其实理论上来讲是可行的))

友情提示:sophix免费版的阈值:1,每个账号每月5万台设备免费;2,每个账号下的每个应用平均到每台设备,1天免费查询补丁20次

ok,进入正文:
第一步:注册应用,点击链接进去自己注册
第二步:依赖,在需要用到的项目下的build.gradle 文件中添加api 'com.aliyun.ams:alicloud-android-hotfix:3.2.8' 然后编译下就可以了
第三步:application的替换,如果你的项目里有用到自己的application,需要替换成sophix的,在官方接入文档里有这个类,这里也同步贴下

//在manifest文件中的application节点应该用这一个节点
//同时需要注意,在该类里必须所有用到的类都是android原生的,不能用到你自己创建出来的类,不然打补丁会失败
public class SophixStubApplication extends SophixApplication {private final String TAG = "SophixStubApplication";// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。//这里这个myapplication就是你原先的那个application@Keep@SophixEntry(MyApplication.class)static class RealApplicationStub {}
@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//         MultiDex.install(this);initSophix();}
private void initSophix() {String appVersion = "0.0.0";try {appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;} catch (Exception e) {Log.e(TAG,"sophix 获取版本号异常:" + e);e.printStackTrace();}final SophixManager instance = SophixManager.getInstance();instance.setContext(this).setAppVersion(appVersion)//设置一些配置信息,idSecret, appSecret, rsaSecret.setSecretMetaData("","","").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.e(TAG,"sophix 补丁加载成功");} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {// 如果需要在后台重启,建议此处用SharePreference保存状态。// 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,>详见1.3.2.3Log.e(TAG, "sophix 加载成功,但是需要重启后才能生效");} else {Log.e(TAG, "other msg code:" + code);}}}).initialize();//调用这行代码一次,sdk 就回去控制台拉取查询一次,需要注意的是免费阈值只有20次,需要有一些方式来控制,比如先从自己平台查一遍有没有补丁包,如果有的话再调用这行带去去控制台拉补丁包下载,这样能极大减少阈值的使用SophixManager.getInstance().queryAndLoadNewPatch();}

第四步:生成补丁,验证是否集成成功。打包俩个包,新包和旧包,利用工具 进行生成差异补丁包,把补丁包上传到控制台下发,然后应用重新进入触发sdk的拉取操作进行修复。

前面有讲到通过加载本地补丁包来绕过收费的方式,这里进行特殊讲解一下。

其实本质上spohix是支持本地加载补丁包的,但是翻了一圈没有找到对应的api处理,提了工单问对应的技术人员的回复是:“需要买,买了以后给你这种特殊方式操作,你就可以完全不通过阿里控制台进行下发补丁了”,但是其实细心点可以发现,他提供的调试demo是支持本地加载补丁包的,但是!!!很坑爹的来了,他这个调试apk工具是没加本地文件读取的权限申请,所以就导致了调试工具无法加载本地补丁包,别问我为啥知道的,我把这个apk反编译了以后看到的,manifest文件里就没有文件读取的权限内容。通过反编译+一步步的分析他的代码,找到了它里面进行加载本地补丁包的方式,具体方式如下:

//注意这个导包,因为他里面都是混效后的代码,所以最终如果加载本地补丁包的话,形式上就是a.e.x这样子的调用了
import com.taobao.sophix.a.e;
//下面就是完整的代码了,第一个参数是补丁包在手机里的绝对位置,第二个就是修复的回调,和上面application里面的那个一样
((e)SophixManager.getInstance()).a("", new PatchLoadStatusListener() {@Overridepublic void onLoad(int mode, int code, String info, int handlePatchVersion) {}});//注意:这种方式的修复,在3.2.8的spohix版本上试过是可以的,换了版本的话可能就不行了,因为毕竟换了版本会重新混淆,之后的话一些.a.e啥的也会变

ok,本文结束。

阿里热修复集成,sophix加载本地补丁包相关推荐

  1. maven加载本地jar包,无法将本地jar包打进项目

    加载本地jar包,无法将jar打进包 1.问题介绍 ​ 项目依赖某个私有jar包,由于各种原因,没有将jar包打进本地maven库,选择使用放到项目lib下引用,但是打包时lib文件夹下的依赖包打不进 ...

  2. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

  3. android 动态换肤框架,GitHub - ss520k/Android-Skin-Loader: 一个通过动态加载本地皮肤包进行换肤的皮肤框架...

    Android-Skin-Loader 更新日志 导入到Android Studio,使用gradle构建皮肤包(见7. 皮肤包是什么?如何生成?)(2015-12-02) 解决Fragment换肤在 ...

  4. 阿里热修复之Sophix——公有云发布版集成步骤

    Sophix 公有云接入 去年的时候写的一篇阿里云热修复的文章,那时它还是在公测阶段,一直没能投产,而今,公司项目需要集成已经投产的阿里Sophix功能,所以再次集成了一遍,记录下了步骤和遇到的一些问 ...

  5. Composer 本地路径加载 laravel-admin 扩展包

    Composer 提供了 Path 加载本地扩展包的方法,允许我们将扩展包以本地目录形式进行加载,方便快速修改,也可以把修改后的代码提交到项目的 CVS 中. 1. 将项目本地化 你可以通过任何方式将 ...

  6. 剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  7. iOS WKWebView加载本地文件之权威解说

      在实际的iOS开发中,我们有很多的地方需要通过WKWebView加载本地的文件.但是由于WKWebview存在着一些跨域的问题.UIWebView直接加载的方法不能正常使用了.这里就和大家分享一下 ...

  8. android picasso 显示本地图片,剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)...

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  9. WebView通过loadDataWithBaseURL加载本地页面卡死

    最近开发遇到一个使用 Android WebView加载本地页面进度条始终卡在20%左右不动的情况.打 Log.抓包发现卡在 WebView对象调用 loadDataWithBaseURL方法. 去网 ...

最新文章

  1. 每日一皮:都 0202 年了,我怎么可能被骗呢?
  2. missing -D__STDC_CONSTANT_MACROS
  3. 《软件工程》 教 学 大 纲
  4. 五大板块(4)——链表
  5. Android 使用XmlPullParser解析xml
  6. NET问答: 如何记录 EntityFramework 中的所有 SQL 日志 ?
  7. html 前端传入后台为object_浅谈Object.defineProperty()
  8. 130242014057 周陈清 实验一
  9. 刘欣《码农翻身》之动态代理读后感
  10. java中的保护(protected)修饰符的理解
  11. Anaconda创建Pytorch虚拟环境(排坑详细)
  12. 如何使用UltraISO制作U盘系统盘用于重装系统
  13. 使用ffmpeg的调色板对图片压缩
  14. Weakly Guiding Fibers(弱导光纤)
  15. 【51单片机】考试例程|汇编实现
  16. 视觉进阶笔记开源 | AI计算机视觉全栈知识总结
  17. 2017年2月28日 星期二 --出埃及记 Exodus 23:18
  18. Excel中按颜色求和,一键完成。可以按背景色求和也可以按条件格式颜色求和
  19. PostgreSQL 新手入门
  20. 联通的无限流量套餐,比移动好很多

热门文章

  1. 利用matlab对纯电动汽车在nedc工况下的行驶阻力进行计算
  2. HMS Core携手厦门大学打造AR增强现实技术
  3. git删除本地代码库文件后同步到远程仓库同时删除远程仓库文件
  4. abb工业机器人指令lf怎么用_史上最全的ABB工业机器人的指令介绍
  5. STM32学习值传感器篇——max30102心率血氧传感器
  6. 电商ERP进销存系统V3多仓库带扫描php网页版B/S进销存系统多仓库版
  7. 计算机考研330分难吗,工科考研330分是什么难度应该怎么准备
  8. 淘宝API app店铺搜索
  9. java导出excel数字格式_POI 导出excel带小数点的数字格式显示不对解决方法
  10. C#调用LabVIEW VI