sophix热修复笔记

笔记摘抄于:阿里《深入探索android热修复技术原理》
一.热修复介绍:
1.修复技术对比

2.代码修复的两种方案:
1.阿里的底层替换方案(时效性好,加载快,立即见效,传统的替换方案不能添加,删除 方法和属性)
2.腾讯的类加载方案(时效性差,需要冷启动,但是修复范围广,限制少)

3.sophix特点
1.非入侵式
2.结合类加载方案和底层替换方案
3.资源修复
4.so修复

二.代码热修复技术
1.andfix:
1.替换所有artmethod
2.artmethod是紧密排列的,两个artmethod起始地址的差值就是前一个artmethod的大小
3.访问权限(dex2oat时已经进行了权限检测,所以机器码码中没有权限检测代码)
4.同包名下访问权限问题(利用反射设置新类的classloader为原来的类)
5.非静态方法(采用冷启动方式处理)
6.andfix限制:替换方案不能添加,删除 方法和属性
2.你所不知道的java
1.内部类
1.内部类在编译器会被编译为和外部类一样的顶级类
2.静态内部类不持有外部类的引用,非静态内部类相反
3.内(外)部类会在编译期间生产access&**相关方法贡外(内)部类访问
对应热部署的解决方案:阻止成access&**相关方法

2.匿名内部类
1.匿名内部类编译时生产的类名为:外部类.&number
对应热部署的解决方案:不能新增和删除匿名内部类
3.域编译
1.clinit和init区别
<clinit>:在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行(此方法java源码没有有编译器合成)
<init>:在实例创建出来的时候调用,包括 调用new操作符;调用Class或 Java .lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。
2.热修复不支持clinit(即:不能修复静态变量和静态代码块)
4.final static 域翻译

1.final static 修饰非引用类型可以优化,但是修饰引用类型不能起到优化的作用
处理方案:final static 修饰原始类型和String类型 可以实行热修复
final static 修饰要引用类型 不以实行热修复
5.方法编译
1.如果使用代码混淆,方法可能被内联或裁剪

方法裁剪:方法入参没有使用,在混淆任务之前会先裁剪成无参的方法
防止被裁剪的办法:

热修复处理方案:热修复配置文件加上 -dontoptimaize 不让混淆对方案裁剪和内联
6.switch case 语句编译
1.switch 语句的id资源id不会被替换
热修复处理方案:修改smail反编译流程,碰到packed-switch 指令强转为sparse-switch指令,:pswitch_N等指令也强转为:ppswitch_N指令,然后做资源id暴力替换,然后回编译smail为dex
7.Lambda表达式编译
1.新增Lambda表达式删除Lambda表达式导致类方法错乱,导致热修复失败
2,修改lambda表达式可能新增field也会导致热修复失败
8.访问权限对热修复的 影响
1.类加载有三个阶段:resolve>link>init
3.冷启动类加载原理
1.冷启动比较

2.插桩
1.加载一个dex文件到本地内存时,如果不存在odex文件,就会先执行dexopt。
2.

3.DexFile.loadDex尝试把dex文件解析到natice内存,在加载到native之前,会先检查有没有odex,不过不存在对应odex文件,那么Dalvik下会执行dexopt,Art下会执行dexoat,最后得到odex,实际上虚拟机执行的是odex而不是dex
4.Dalvik:使用自行研发的全量dex加载方案
Art:Art已经支持多dex加载,处理方式为:补丁dex作为知足dex(classes.dex)加载
3.多态对冷启动的影响
1.fidle和static方法不具有多态特性
2.private 方法也不具有多态特性
4.Dalvik下完整dex方案
1.一般,把新的dex插入到ClassLoader最前面,问题:

2.一种全新的方案:
1.将基线包dex中需要替换的class去除掉,加载时没有这个class就会去补丁dex中找
注意:这里的去除class并不是把素有信息去除掉,这会导致dex各个部分发生变化,只是要完成解析dex时找不到这个class的目的
2.Application的处理(程序入口)

三,资源热修复技术
四,so库热修复技术
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值