《深入探索Androdi热修复技术原理(阿里巴巴)》--读书笔记
No1:
Hybrid就是原生和Html5混合开发app
No2:
插件化方法Altas或者DroidPlugin
No3:
热修复技术可以把更新补丁上传到云端,此时APP就可以直接从云端下拉补丁直接应用生效
优势:
1)无需重新发版,实时高效热修复
2)用户无感知修复,无需下载新的应用,代价小
3)修复成功率高,把损失降到最低
No4:
热修复框架Sophix:包括代码修复、资源修复、so修复
No5:
代码修复油两大主要方案,一种是阿里系的底层替换方案,另一种是腾讯系的类加载方案
这两种方案各有优劣
* 底层替换方案限制颇多,但时效性最好,加载轻快,立即见效
* 类加载方案时效性差,需要重新冷启动才能见效,但修复范围广,限制少
底层替换方案是在已经加载了的类中直接替换掉原有方法,是在原来类的基础上进行修改的。因而无法实现对与原有类进行方法和字段的增减,因为这样将破坏原有类的结构。
类加载方案的原理是在app重新启动后让Classloader去加载新的类
Sophix的代码修复体系同时涵盖了底层替换方案和类加载方案。
No6:
Instant Run资源热修复分为两步
1)构造一个新的AssetManager,并通过反射调用addAssetPath,把这个完整的新资源包加入到AssetManager中。这样就得到了一个含有所有新资源的AssetManager
2)找到所有之前引用到原有AssetManager的地方,通过反射,把引用处替换为AssetManager
No7:
SO库修复本质上是对native方法的修复和替换
阿里采用的是类似类修复反射注入方式。把补丁so库的路径插入到nativeLibraryDirctories数组的最前面,就能够达到加载so库的时候是补丁so库,而不是原来so库的目录,从而达到修复的目的。
No8:
Sophix的核心设计理念,就是非侵入性
No9:
Sophix资源替换方案优势在于:
1)不修改AssetManager的引用处,替换更快更完全(对比Instant Run以及所有copycat的实现)
2)不必下发完整包,补丁包中只包含有变动的资源(对比Instant Run、Amigo等方式的实现)
3)不需要再运行时合成完整包。不占用运行时计算和内存资源(对比Tinker的实现)
No10:
针对小修改可以采用即时生效的热修复,并且可以结合资源修复,做到资源和代码的即时生效。而如果触及了热替换使用限制,对于比较大的代码改动以及修复方法反射调用情况,Sophix也提供了另一种完整DEX修复机制,不过是需要app重新冷启动,来发挥其更加完善的修复及更新功能。从而可以做到无感知的应用更新。
No11:
内部类在编译期会被编译为跟外部类一样的顶级类
No12:
静态内部类和非静态内部类的区别:
非静态内部类持有外部类的引用,静态内部类不持有外部类的引用
No13:
android虚拟机首先通过javac把源代码编译成.class,然后再通过dx工具优化成适合移动设备的dex字节码文件
No14:
打补丁是通过反编译为smali然后新apk跟基线apk进行差异对比,得到最后的补丁包。
No15:
冷启动实现方案
No16:
Dalvik下采用我们自行研发的全量DEX方案
Art下本质上虚拟机已经支持多dex的加载,我们要做的仅仅是把补丁dex作为主dex(classes.dex)加载而已
No17:
Instant Run中的资源热修复分为两步
1)构造一个新的AssetManager,并通过反射调用addAssetPath,把这个完整的新资源包加入到AssetManager中。这样就得到了一个含有所有新资源的AssetManager
2)找到所有之前引用到原有AssetManager的地方,通过反射,把引用处替换为AssetManager
No18:
资源修复方案:构造了一个package id为0x66的资源包,这个包里只包含改变了的资源项,然后直接在原有AssetManager中addAssetPath这个包
No19:
Sophix资源修复的优势
1)不侵入打包,直接对比新旧资源即可产生补丁资源包(对比修改aapt方式的实现)
2)不必下发完整包,补丁包中只包含有变动的资源(对比Instant Run、Amigo等方式的实现)
3)不需要再运行时合成完整包。不占用运行时计算和内存资源(对比Tinker的实现)
No20:
Java Api提供以下两个接口加载一个so库
1)System.loadLibrary(String libName):传进去的参数:so库名称,表示的so库文件,位于apk压缩文件中的libs目录,最后复制到apk安装目录下
2)System.load(String pathName):传进去的参数:so库在磁盘中的完整路径。加载一个自定义外部so库文件
总结下:
1)动态注册的native方法映射通过加载so库过程中调用JNI_OnLoad方法调用完成
2)静态注册的native方法映射是在该native方法第一次执行的时候才完成映射,当然前提是该so库已经load过
No21:
so库的实时生效必须满足以下几点:
1)so库为了兼容Dalvik虚拟机下动态注册native方法的实时生效,必须对so文件进行改名
2)针对so库静态注册native方法的实时生效,首先需要解注册静态注册的native方法,这个也是难点,因为我们很难知道so库中哪几个静态注册的native方法发生了变更。假设就算我们知道如果静态注册的native方法需要解注册,重新load补丁so库也有可能被修复也有可能不被修复
3)上面对补丁so进行了第二次加载,那么肯定是多消耗了一次本地内存,如果补丁so库够大,补丁so够多,那么JNI层的OOM也不是没可能
4)另外一方面补丁so如果新增了一个动态注册的方法而dex中没有响应方法,直接去加载这个补丁so文件会报NoSuchMethodError异常,具体逻辑在dvmRegisterJNIMethod中。我们知道如果dex如果新增了一个native方法,那么走不了热部署只能冷启动重启生效,所以此时补丁so就不能第二次load了。这种情况下so库的修复严重依赖于dex的媳妇方案
No22:
so库的修复方案目前更多采取的是接口调用替换方案,需要强制侵入用户接口调用。目前我们的so文件修复方案采取的是fanshe注入的方案,重启生效。具有更好的普遍性
No23:
Sophix方案纵向比较
飞速看完这本书,心里是崩溃的,涉及C、C++、Smali、Lambda、虚拟机等,看的一脸懵逼,我先哭一会儿。。等我把其他学了再来阅读这本书。
下面是阿里巴巴的微信订阅号,可以下载此书
《深入探索Androdi热修复技术原理(阿里巴巴)》--读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- JavaScript之判断参数的数值的详细类型
//判断是否为字符串 //返回类型: //{baseType:typeof(arg),numberType:'int','float',-1} function numberType(arg){ va ...
- loadrunner函数解密之web_reg_save_param
loadrunner工具的使用,最关键的在于3个地方: A:脚本的编写 B:场景设计 C:性能测试结果分析 其 中难度比较大的第一步是:编写脚本,有很多人对于loadrunner里面的各种函数使用的并 ...
- Java并发编程(1)-Java内存模型
本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...
- ubuntu14.04 下安装 gsl 科学计算库
GSL(GNU Scientific Library)作为三大科学计算库之一,除了涵盖基本的线性代数,微分方程,积分,随机数,组合数,方程求根,多项式求根,排序等,还有模拟退火,快速傅里叶变换,小波, ...
- 用conda管理Python包
用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...
- headers 替换脚本
python代码 headers = """ Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language ...
- C# .NET Winform等程序一运行就闪退 不同环境 换到其他电脑,例如XP之类的解决方法。
我现在写标题就跟写tag一样,方便大家索引. 有时候经常会把.NET写的程序拿到其他客户机,发现直接闪退,啥也不报错..那就很蛋疼,又不可能去装IDE来检测是吧,网上还有很多说啥看系统日志的,什么图标 ...
- servlet请求中的信息
在servlet中HttpServeltRequest中有一个方法getRequestURL() 假如我们平常输入的地址是:localhost/Demo1/TestServlet?hello=worl ...
- curl, wget常用选项
使用指定的http代理,配合md5sum 对于检查源站与cdn节点资源是否一致很有效 curl -o a.jpg -x http://pbcdn.xximg1.com/v6/global2015/im ...
- spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
关于jdbctemplate: 个人感觉比Java链接mysql那一套方便好维护多了,只需在配置文件维护即可 需要的包: com.springsource.net.sf.cglib-2.2.0.jar ...