热搜: Loading  安卓开发  Android  ios  ShareSDK  开源  Python  生命周期  新手  RecyclerView 
  • 首 页
  •  
     
    当前位置: 首页 » 移动开发 » Android开发 » 正文

    SDK热更之如何在SDK代码中自动插桩及如何生成补丁包

    放大字体  缩小字体 发布日期:2017-02-05  浏览次数:172
    核心提示:写在前面本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.htmlSDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix这篇文章主要介绍一下SDK热更

    写在前面

    本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:

    这篇文章主要介绍一下SDK热更中如何自动在代码中插桩以及如何生成补丁包。文中提到所有代码地址: SDKHotfix中插桩及补丁生成对应github地址https://github.com/bihe0832/SDKHoxFix/tree/master/BuildPatch

    代码插桩

    为什么要插桩

    在SDK所有需要热更的代码中插桩是所有使用mutlidex的热更方案的基本原理。通过代码插桩的方式可以解决应用启动dex预检验时因补丁类不在相同dex的报错。详细的原理内容可以参照Qzone的原理介绍文章: 安卓App热补丁动态修复技术介绍

    基本原理

    • 在SDK的源码中保留插桩类 com.bihe0832.hotfix.Fix ,保证SDK工程正常使用不出错

    • 自动构建时完成对所有需要插桩类的默认构造函数插桩

    • 自动构建完成对所有需要插桩的类插桩后删除插桩类 com.bihe0832.hotfix.Fix

    • 自动构建的过程中计算生成所有该版本对应每个class文件的md5,例如 3_hash.txt

    具体流程

    对应代码

    • 自动构建相关代码(具体代码参考根目录build.sh):

      cd $localPath/MD5 && ./gradlew processJarAndGetJarHash
    • 插件相关代码

      BuildPatch 项目 BuildPatchPlugin.groovy 中task processJarAndGetJarHash 对应的内容。

    生成补丁包

    基本原理

    • 自动构建完成所有代码的插桩以及对应文件及其md5

    • 根据版本号获取到历史版本保存对应版本所有文件及其hash值的文件

    • 获取自动构建目录下所有的文件列表,逐个文件与历史版本中的文件对比md5,如果一致则删除,不一致则保留

    • 所有文件对比完成以后,清除空目录,将剩余文件打包为jar,并转为dex

    • 由于补丁信息类 com.bihe0832.hotfix.FixInfo 中保存了SDK的补丁的版本号等信息,因此该文件一定保留不会删除

    具体流程

    对应代码

    • 自动构建相关代码(具体代码参考根目录build.sh):

      cd $localPath/MD5 && ./gradlew buildPatch
        deleteempty
        jar cvf $localPath/MD5/bin/temp/jar/bihe0832_patch.jar *
        cp -r $localPath/MD5/bin/temp/jar/bihe0832_patch.jar $localPath/MD5/bin/bihe0832_patch.jar
        $ANDROID_HOME/build-tools/23.0.2/dx --dex --output=$localPath/MD5/bin/bihe0832_patch_dex.jar $localPath/MD5/bin/temp/jar/bihe0832_patch.jar
    • 插件相关代码

      BuildPatch 项目 BuildPatchPlugin.groovy 中task buildPatch 对应的内容。

    插件说明

    改插件是一个基于groovy开发的gradle的插件,为了方便理解整个项目没有把他集成到SDK的构建中,而是通过shell脚本一步一步完成插桩和生成补丁。开发者可以根据个人兴趣整合到项目gradle中或者保持隔离。已经对插件代码填了一部分注释因此不会专门详细介绍具体实现,这里重点介绍一下插件定义的几个变量。

    • HashSet excludeClass

      项目中所有不可以被热更的类列表,可以是具体类名,也可以是包名

    • int oldSDKVersion

      被热更的SDK的版本号,或者说有问题的SDK的版本号,在生成补丁时通过该版本号可以获取到老版本SDK所有文件的md5值

    • int newSDKVersion

      热更后SDK的版本号,也就是SDK在热更以后升级到的版本

    • String patchCoreClass

      SDK热更中保存SDK的版本、热更测试函数的核心类,这个类在生成补丁包时一定会保留

    • String patchPileClass

      SDK插桩使用的类的类名,这个类在生成SDK或者补丁的时候一定会被删除


    小编为您推荐“SDK热更之如何在SDK代码中自动插桩及如何生成补丁包”相关文章

    android中去掉窗口全屏显示的简单方法
    android 中去掉窗口全屏显示的简单方法,需要的朋友可以参考一下

    WebComponents实例:移动UI组件库GMU介绍
    GMU(Global Mobile UI)是百度前端通用组开发的移动端组件库,具有代码体积小、简单、易用等特点,组件内部处理了很多移动端的bug,覆盖机型广,能大大减少开发交互型组件的工作量,非常适合移动端网站项目。

    Android开机自启动程序详解
    本篇文章是对Android开机自启动程序进行了详细的分析介绍,需要的朋友参考下

    Android Mms之:深入MMS支持
    本篇文章是对Android中MMS支持进行了详细的分析介绍,需要的朋友参考下

    Android如何实现非本地图片的点击态
    Android如何实现非本地图片的点击态,本文提供了详细的实现代码,需要了解的朋友可以参考下

     
    TAGS: 加密解密 Java
     
     
    猜你想看
     
    更多..
    与本文有关加密解密
    • MVP的基本使用
      MVP的基本使用
      MVP的基本使用 整理自 mvp 简介MVP 模式(Model-View-Presenter)可以说是 MVC 模式(Model-View-Controller)在 Android 开发上的一种变种、进化模式。在 MVC 模式中,Activity 应该是属于 View 这一层。而实质上,它既承担了 View,同时也包含一些 Controll
      11-22 关键词:MVC模式加密解密
    • APK反逆向之二:四种基本加固方式
      应该大多数开发者都不会关注应用会不逆向破解,而且现在有第三方厂商提供免费的加固方案,所以 apk 应用的安全性就全部依赖于第三方。但是如果第三方加固方案被破解那么 apk 就陷于被动,所以我们也可以通过一些手段来加固应用本身逻辑,或者数据的加密。最常
      11-07 关键词:Java加密解密
    • Android开发人员不得不收集的代码
      App相关→AppUtils.java安装App installApp卸载指定包名的App uninstallApp获取当前App信息 getAppInfo获取所有已安装App信息 getAllAppsInfo根据包名判断App是否安装 isInstallApp打开指定包名的App openAppByPackageName打开指定包名的App应用信息界面 open
      09-14 关键词:加密解密程序员
    • Android 加密解密字符串详解
      本篇文章是对Android的加密解密字符串进行了详细的分析介绍,需要的朋友参考下
      08-05 关键词:android加密解密字符串
     
    相关评论
     
    猜你喜欢
     
    网站首页 | 关于我们 | 联系方式 | 使用协议 | 版权隐私 | 网站地图 | 网站留言