一文接入Android阿里Sophix热更新
最近公司项目渐趋成熟,已经不需要经常更新版本,并且更新版本对客户的影响特别大,但是日常维护难免需要更新代码,因此热修复的技术,就比较迫切了。
经过一段时间的对比,我们最终决定使用阿里的Sophix方案,因为它实在是太强大,而且接入及其简单。
阿里网址如下:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
应用申请这些因为过于简单,我这里就不说了,直接上代码
1、引入官方库,在app的build.gradle下,直接插入
compile 'com.aliyun.ams:alicloud-android-hotfix:3.3.5'
2、心间自定义Application文件名为SophixStubApplication,继承自SophixApplication,代码如下:
public class SophixStubApplication extends SophixApplication {private final String TAG = "SophixStubApplication";// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。@Keep@SophixEntry(自定义的Application.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) {}final SophixManager instance = SophixManager.getInstance();instance.setContext(this).setUsingEnhance() // 适配加固模式,如果app使用了加固则需要加上此方法.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();instance.queryAndLoadNewPatch();}
}
简单说一下这里,基本是固定格式,最重要的代码是
instance.queryAndLoadNewPatch();
顾名思义,查询并加载新的补丁。这个一定要调用的,不然无法加载补丁,记得把SophixStubApplication注册到AndroidManifest.xml中,举个例子:
<applicationandroid:name="xxxxxx.SophixStubApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:maxAspectRatio="2.4"android:resizeableActivity="true"android:supportsRtl="true"android:theme="@style/AppTheme"android:usesCleartextTraffic="true"><meta-dataandroid:name="com.taobao.android.hotfix.IDSECRET"android:value="" /><meta-dataandroid:name="com.taobao.android.hotfix.APPSECRET"android:value="" /><meta-dataandroid:name="com.taobao.android.hotfix.RSASECRET"android:value="" /></application>
这样一套下来,阿里云热修复就已经成功集成到app中。
接再来再说说一些注意事项
1、不能热更新的场景
1)、新增四大组件
2)、修改了SophixStubApplication的内容
3)、修改了AndroidManifest.xml的内容
4)、其他配置文件
除此之外,其他的一切皆可更新,包括.so文件
2、关于加固的app,如果采用了加固,去打补丁的时候一定要拿未加固前的apk去操作,否则无法加固
相关文章:
一文接入Android阿里Sophix热更新
最近公司项目渐趋成熟,已经不需要经常更新版本,并且更新版本对客户的影响特别大,但是日常维护难免需要更新代码,因此热修复的技术,就比较迫切了。 经过一段时间的对比,我们最终决定使用阿里的Sophix方案&am…...
【高阶数据结构】并查集和图
目录 1.数据结构--并查集 2.数据结构--图 1.图的基础概念 2.图的简单实现 2.1.邻接矩阵的图实现 2.2.邻接表的图实现 2.3.图的DFS和BFS 2.4.最小生成树 2.4.1.Kruskal(克鲁斯卡尔算法) 2.4.2.Prim(普里姆算法) 2.5.最短路径 2.5.1.Dijkstra(…...
Git 提交时提示 GPG 签名错误
本来应该一切都是正常的,但今天提交的时候提示 GPG 签名错误。 错误的信息就是 GPG 签名失败。 gpg: skipped "942395299055675C": No secret key gpg: signing failed: No secret key error: gpg failed to sign the data fatal: failed to write commi…...
vite+vue3实现 tomcat 的本地部署
背景: 很多开发小伙伴在本地开发完前端项目后,碍于服务端环境配置麻烦,想先试试在本地部署,已开发好的前端项目,由于很多文章都是文字性描述,不太直观,为了给大多数新手提供一个教程,…...
docker+playwright
windows10 docker playwright 难点在于windows下docker的安装,以及官方hub被墙的困难。 wsl2 wsl2 ubuntu docker git clone https://gitee.com/lineuman/lcs_playwright.git npm install npx playwright test docker端口怎么映射到主机上面? 设置重…...
php框架路由实现
在PHP中也有很多框架(如Laravel、CodeIgniter)提供了路由功能。下面是一个简单的PHP路由实现原理和示例代码: 路由实现原理: 客户端发起请求,请求的URL会被传递给Web服务器。Web服务器将请求传递给PHP解释器ÿ…...
在CentOS 7中手工打造和运行xml文件配置的Servlet,然后使用curl、浏览器、telnet等三种工具各自测试
下载Openjdk并配置环境变量 https://jdk.java.net/java-se-ri/11-MR2是官网下载Openjdk 11的地方。 sudo wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz下载openjdk 11。 sudo mkdir -p /usr/openjdk11创建目录ÿ…...
单例模式.
目录 ♫什么是单例模式 ♫饿汉式单例模式 ♫懒汉式单例模式 ♫单例模式的线程安全问题 ♪原子性 ♪内存可见性与指令重排序 ♫什么是单例模式 单例模式是一种设计模式,通过巧用Java的现有语法,实现一个只能被创建一个实例的类,并提供一个全…...
2023年MathorCup高校数学建模挑战赛大数据挑战赛赛题浅析
比赛时长为期7天的妈杯大数据挑战赛如期开赛,为了帮助大家更好的选题,首先给大家带来赛题浅析,为了方便大家更好的选题。 赛道 A:基于计算机视觉的坑洼道路检测和识别 A题,图像处理类题目。这种题目的难度数模独一档…...
c++小惊喜——stringstream
当需要读取一行字符串时,我们通常会有将这个字符串分开的想法 #include<iostream> #include<sstream> using namespace std;int main() {string str;getline(cin, str);stringstream ssin(str);string s[10];int cnt 0;while (ssin >> s[cnt]) …...
ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路
2023年10月29日 环境说明 操作系统版本:ubuntu 18.04 python版本:3.6.9 gcc版本:7.5.0 编译安装路径:/usr/local cmake: 3.10.2 所需要的源码包我已经打包放到我的资源。 2021年1月份已经写过一篇Ubuntu 编译安装的帖子F…...
深度学习(生成式模型)——DDIM:Denoising Diffusion Implicit Models
文章目录 前言为什么DDPM的反向过程与前向过程步数绑定DDIM如何减少DDPM反向过程步数DDIM的优化目标DDIM的训练与测试 前言 上一篇博文介绍了DDIM的前身DDPM。DDPM的反向过程与前向过程步数一一对应,例如前向过程有1000步,那么反向过程也需要有1000步&a…...
HashMap的遍历方式 -- 好几次差点记不起来总结了一下
public class HashMapDemo {public static void main(String[] args) {// 创建一个HashMap并添加一些键值对Map<String, Integer> hashMap new HashMap<>();hashMap.put("Alice", 25);hashMap.put("Bob", 30);hashMap.put("Charlie"…...
PostgreSQL 两表关联更新sql
PostgreSQL两表关联更新SQL如下: UPDATE user SET username ft.name, age ft.age FROM userinfo WHERE user.id ft.id; user 要更新的表 userinfo数据来源表...
R2R 的一些小tip
批次间控制器(Run-to-run Controller),以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术,可在运行(如批次或晶圆…...
UML中类之间的六种主要关系
UML中类之间的六种主要关系: 继承(泛化)(Inheritance、Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组…...
机器学习-朴素贝叶斯之多项式模型
多项式模型: 记住一定用于离散的对象,不能是连续的 于高斯分布相反,多项式模型主要适用于离散特征的概率计算,切sklearn的多项式模型不接受输入负值 因为多项式不接受负值的输入,所以样本数据的特征为数值型数据&…...
下载的nginx证书转换成tomcat证书格式
1、下载的nginx证书格式 XXX.crt private.key 2、转换成JKS格式证书步骤 #crt格式证书转pem openssl x509 -in xxx.crt -out xxx.pem#先转成p12格式,此时注意,如果有别名,需要设置 openssl pkcs12 -export -in xxx.crt -inkey private.key…...
计算机毕业设计选题推荐-社区志愿者服务微信小程序/安卓APP-项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
ES6中数值扩展
目录 二进制和八进制表示法 Number.isFinite() Number.isNaN() Number.parseInt()和Number.parseFloat() Number.isInteger() Math.trunc() Math.sign() Math.cbrt(): Math.clz32(): Math.imul(): Math.fround(): ES6中…...
PaddleOCR服务化部署实战:从Python Pipeline到C++,性能提升2倍+的保姆级教程
PaddleOCR高并发服务化部署实战:Python到C的性能跃迁指南 当文档批量处理系统每天需要解析十万级图片,或是金融票据识别平台面临秒级响应需求时,Python部署的OCR服务常会遭遇性能瓶颈。本文将揭示如何通过C部署方案实现QPS从23到51的跨越式提…...
当翻译成本趋近于零:AI原生时代,软件工程如何重塑?
当翻译成本趋近于零,软件工程的瓶颈就从“如何写对代码”变成了“如何定义对的事”。 一、两条路线之争:代码约束还是提示约束? 当前AI智能体演进中,出现了一条清晰的分野:以Claude Code为代表的“代码硬约束”路线&am…...
Java毕业设计基于springboot+vue的校内兼职信息管理系统
前言 Spring Boot 校内兼职信息管理系统是以 Spring Boot 框架为核心搭建的,专门用于高效管理校园内各类 兼职信息的平台。随着校园生活的多元化发展,学生对兼职机会的需求日益增长,传统的兼职信息发布与管理方式杂乱无章,存在信息…...
轻量模型不轻量:Nano-Banana Turbo LoRA在A10显卡上30秒出图实测
轻量模型不轻量:Nano-Banana Turbo LoRA在A10显卡上30秒出图实测 1. 项目简介 Nano-Banana是一款专门为产品拆解和平铺展示风格设计的轻量化文生图系统。这个项目的核心在于深度融合了专属的Turbo LoRA微调权重,专门针对Knolling平铺、爆炸图、产品部件…...
【Python异步I/O终极指南】:20年CTO亲授asyncio高并发实战心法,避开97%开发者踩过的12个致命陷阱
第一章:Python异步I/O的本质与演进脉络Python异步I/O并非简单的“多线程替代方案”,其本质是**在单线程内通过事件循环(event loop)协同调度I/O等待任务,避免CPU空转,实现高并发吞吐**。它依赖操作系统底层…...
AI净界开箱即用:无需配置,上传图片秒出透明背景,亲测好用
AI净界开箱即用:无需配置,上传图片秒出透明背景,亲测好用 1. 产品核心价值 在电商设计、内容创作和数字营销领域,背景移除是最频繁却又最耗时的图像处理需求之一。传统方法要么需要专业软件技能,要么效果难以令人满意…...
告别串口调试助手:用Chrome浏览器直接调试Arduino/ESP32(Web Serial API实战)
浏览器直连硬件:Web Serial API在物联网开发中的高阶应用 每次调试Arduino或ESP32设备时,那些繁琐的串口助手切换、驱动安装和兼容性问题是否让您感到疲惫?现在,只需一个Chrome浏览器窗口,就能完成从设备连接到数据可…...
青少年软编等考六级题解目录
这个专栏发布中国电子学会主办的青少年软件编程等级考试 C 语言六级题目解析,每篇文章包含一次考试的全部 444 道题目的思路解析。由于考级允许使用 C/C 语言,因此解析中给出的参考代码均为 C 代码。为了方便大家查找,特此发布一篇文章作为目…...
ResNet50实战:用Fruits-360数据集训练自己的水果分类模型(附完整代码)
ResNet50实战:用Fruits-360数据集训练自己的水果分类模型(附完整代码) 在计算机视觉领域,图像分类是最基础也最实用的任务之一。无论是工业质检、医疗影像分析还是零售商品识别,都需要可靠的分类模型作为支撑。而水果分…...
DAMOYOLO-S与数据库联动:检测结果实时入库与查询
DAMOYOLO-S与数据库联动:检测结果实时入库与查询 你有没有想过,当AI模型在摄像头前“看到”一个人、一辆车时,这些信息除了在屏幕上显示一下,还能做什么?如果这些“看见”的瞬间——谁、在哪儿、什么时候、有多确定—…...
