-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
android热修复技术原理-sophix #1
Comments
sophix热修复技术: 1. 代码热修复1.1 传统两大方案:(1) 底层替换方案:在已加载的类中直接替换掉原有方法,在原来类基础上修改; (2) 类加载方案:在app重启后让Classloader去加载新的类。
1.2 sophix采用的方案sophix将两种方案结合,在此两种方案基础上进行改进的方案: 2. 资源热修复Instant Run资源热修复分两步:
3. so库修复把补丁so库的路径插入到nativeLibraryDirectories数组的最前面,就能达到加载so库时是补丁so库,而非原来so库的目录。 4. 其他知识4.1 android虚拟机加载dex的过程加载一个dex文件到本地内存时,若不存在odex文件,会先执行dexopt,最后调用verifyAndOptimizeClass执行verify/optimize操作。 4.2 类加载过程中:会依次调用resolve -> link -> init(1) dvmResolveClass: 类解析,确认方法能正常被调用,如果类被打上了CLASS_ISPREVERIFIED标志,而被调用的类却和它不在同一个dex中,会抛出dvmThrowIllegalAccessError。为了解决此问题,QQ空间采用将一个单独帮助类放到一个单独的dex中,原dex所有类的构造函数都引用这个类(侵入dex打包流程,利用.class字节码修改技术,在所有.class文件构造函数中引用这个帮助类),这就是所谓的插桩实现。使得dexopt过程中dvmVerifyClass类校验近回false,原dex中所有类都没有CLASS_ISPREVERIFIED标志,解决运行时这个异常。 4.3 内部类编译内部类编译:内部类会在编译期被编译为跟外部类一样的顶级类,非静态内部类,编译期间自动合成this$0域表示外部类的引用,非静态内部类会持有外部类的引用,静态内部类不持有外部类的引用。外部类为访问内部类私有域/方法,编译期间会为内部类生成access&**相关方法。 4.4 方法编译如果混淆配置文件中添加上了-dontoptimize这项就不会做方法裁剪和内联,但是没有加则会进行。
4.5 有关混淆input.jars --shrink--> shrunk code --optimize--> optimized code --obfuscate--> obfucated code --preverify--> output.jars
4.6 Java中的泛型泛型完全在编译器中实现,由编译器执行类型检查和类型推断,再生成普通的非泛型字节码,也称为擦除技术。编译器使用泛型类型信息保证类型安全,再在生成字节码前将其清除。 4.7lambda表达式编译规则:lambda为java添加缺失的函数式编程特点。 |
No description provided.
The text was updated successfully, but these errors were encountered: