• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新,androidtinker

【原】Android热更新开源项目Tinker源码解析系列之三:so热更新,androidtinker

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了【原】Android热更新开源项目Tinker源码解析系列之三:so热更新,androidtinker等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

【原】Android热更新开源项目Tinker源码解析系列之三:so热更新,androidtinker


本系列将从以下三个方面对Tinker进行源码解析:

 

转载请标明本文来源:http://www.cnblogs.com/yyangblog/p/6252855.html
更多内容欢迎star作者的github:https://github.com/LaurenceYang/article
如果发现本文有什么问题和任何建议,也随时欢迎交流~

首先讲下Android里面关于so的加载的两种方式:

方式一:System.loadLibrary, 这种方式传入的是so的名字,会直接从系统的目录去加载so文件,系统的路径包括/data/data/${package_name}/lib、/system/lib、/vender/lib等这类路径。

方式二:System.load, 这种方式传入的是so的绝对路径,直接从这个路径加载so文件。

 

Tinker的so文件热更新的原理就是通过方式二,直接加载新的so实现的。

相对于Dex和资源的更新,是不是简单很多。

 

so文件的热更新流程同dex、资源文件一样,包含补丁生成,补丁合成,补丁加载三个部分。

 

生成补丁时比较新旧so文件使用BSdiff算法生成补丁包,

然后在下发补丁成功后根据BSpatch算法将补丁包和旧的library合成新的library,

并将更新后的Library库文件保存在tinker下面的目录下,

这个目录就是/data/data/${package_name}/tinker/lib。

然后在加载的时候直接通过System.load加载该目录下面的so文件。

具体的源码不再做阐述。

 

需要注意的是,Tinker中so的热更新对用户并不是无感的,需要用户自发的去加载自己需要的库文件,下面是tinker的wiki里关于这方面的描述:

但是Tinker并没有直接将补丁的lib路径添加到DexPathList中,理论上这样可以做到程序完全没有感知的对Library文件作补丁。这里主要是因为在多abi的情况下,某些机器获取的并不准确。

所以想要加载最新的库,需要自己使用TinkerInstaller.load*Library去加载库文件,它会自动尝试先去Tinker中的库文件加载,加载不成功会调用System.loadLibrary调用系统的库文件。

1 //load lib/armeabi library
2 TinkerInstaller.loadArmLibrary(getApplicationContext(), "stlport_shared");
3 //load lib/armeabi-v7a library
4 TinkerInstaller.loadArmV7Library(getApplicationContext(), "stlport_shared");

 

另外,对于第三方库文件的加载,Tinker无法干预其加载时机,但是只要在我们的代码提前加载第三方的库文件即可。

若想对第三方代码的库文件更新,可先使用TinkerInstaller.load*Library对第三方库做提前的加载!

当前使用方式似乎并不能做到开发者透明,这是因为Tinker想尽量少的去hook系统框架减少兼容性的问题。

 

到此,tinker的源码解析系列到此结束。

本系列从dex,资源文件和so的补丁生成,补丁合成和补丁加载角度出发,做了一个简要的流程分析。

因为自己水平有限,很多地方也没有太过深入。

对tinker感兴趣的同学可以到tinker的官方github去看更多的文档。

也欢迎大家多多拍砖。

 

转载请标明本文来源:http://www.cnblogs.com/yyangblog/p/6252855.html
更多内容欢迎star作者的github:https://github.com/LaurenceYang/article
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

 下一篇文章将对在实际使用tinker过程中所需要考虑的问题做一个阐述。

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新,androidtinker

相关文章

  • 2017-05-26Android开发学习之路--Content Provider之初体验
  • 2017-05-26Android--Activity在跳转时携带数据
  • 2017-05-26android adb pull push,androidadb
  • 2017-05-222.5.8 Notification(状态栏通知)详解
  • 2017-05-26通知 listview刷新!一天没搞出来的血泪史,listview血泪史
  • 2017-05-26MVP解析,mvp模式解析实践
  • 2017-05-26硅谷新闻4--解决页签手指按下从左到右滑动的bug,硅谷4--
  • 2017-05-26我的android学习经历11,android学习经历11
  • 2017-05-26Android工程文件下assets文件夹与res文件夹的区别
  • 2017-05-26OpenDigg安卓开源项目月报201704,opendigg安卓201704

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • android:giavity和layout_gravity的区别
    • PopupWindow的使用,PopupWindow使用
    • Android四大组件之Activity
    • 解决关于 在android studio 出现的 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK 问题,whileinstallingapk
    • DroidPlugin插件化开发,droidplugin插件
    • Mac版 Android Studio快捷键大全,android快捷键大全
    • Activity的四种启动模式,activity四种模式
    • android开发,权限获取,android开发权限
    • Solaris IPMP两种配置方法
    • Linux常用命令-50:crontab命令

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有