📚
handbook
  • Introduction
  • 1.前言
    • 前言
    • 鸣谢
  • 2.环境篇
    • 工具部署和使用
      • 团队协作工具
        • Confluence
      • 开发工具
        • Docker
          • 镜像导入导出
          • 安装
        • Docker Compose
      • 持续集成工具
        • Gerrit
        • Sonarqube
          • 分析参数设定
          • Prerequisite
          • 服务端设置
        • Ubuntu Ci Deploy
          • ubuntu使用docker部署jenkins+sonarqube
        • 持续集成部署
      • 文本编辑工具
        • Gitbook相关注意事项
        • Markdown快速入门
      • 版本控制
        • Git
          • 1.基础
            • Git基础(一)
            • Git基础(二)
            • Git基础(三)
            • Git基础(四)
            • Git基础(五)
          • 2.命令详解
            • 命令速查
          • 3.进阶技巧
            • git技巧
      • 自动化测试工具
        • Appium
          • capability参数配置
          • 安装
          • 简介
      • 项目管理工具
        • Jira
    • 开发环境配置
      • 通用
        • Homebrew安装与使用
        • Git服务器添加SSH Key
        • koroFileHeader使用
        • nodejs与npm的安装
        • npm更换国内源
        • pip使用相关
        • PostgreSQL安装与使用
        • proxychain安装与使用
        • shell配置环境变量
        • snapd安装与使用
        • terminal走代理
    • 快捷键速查
      • shell常用快捷键
  • 3.语言篇
    • C
      • 代码规范
      • 语言技巧
    • Cpp
      • 代码规范
      • 基础知识
        • 理解C++中的左值和右值
      • 语言技巧
        • 并发编程
          • 简单的线程池实现
    • Golang
      • 代码规范
        • 避免使用转义字符串
        • 避免参数语义不明确
        • 嵌套式结构体
        • 函数的分组与顺序
        • 函数命名
        • 声明一致性
        • 导入别名
        • 使用字段名初始化结构体
        • 本地变量声明
        • map初始化
        • nil用法
        • 包命名
        • 命名Printf样式的函数
        • 减少嵌套
        • 缩小变量作用域
        • struct引用初始化
        • 测试表声明
        • 顶层变量声明
        • 不必要的else
      • 环境配置
        • 代码检查格式化工具
          • Go Fmt
          • Goimports
          • Golint
          • Go Vet
        • go mod详解
        • golang安装
        • Golang开发环境
        • Troubleshooting
      • 语言技巧
        • 如何分包
    • Java
      • 代码规范
      • 语言技巧
        • 注解编程
        • 动态代理
    • Js
      • 语言技巧
        • Rollup
    • Kotlin
      • 基础知识
        • 写给开发者Kotlin指引(一)
        • 写给开发者Kotlin指引(二)
    • Python
      • 语言技巧
        • Best Practice Of Python S Project Structure
  • 4.规范篇
    • Git message规范
  • 5.技术篇
    • Android技术
      • Hook
        • EdXposed例子
        • Android 10 上安装Magisk和EdXposed
      • Tinker
        • 1.Tinker及其使用
      • 准备
        • ADB连接设备步骤及注意事项
        • adb连接设备
        • aosp编译
      • 基础
        • Binder接口调用的鉴权方法
        • Make 及 Android 编译系统介绍
        • 使用Content Provider为其他应用提供数据
      • 源码阅读
        • Framework源码分析 Looper Handler
        • Framework源码分析 启动流程 ServiceManager的初始化
        • Framework源码分析 启动流程 Zygote启动SystemServer
    • JS Bridge
      • JSBridge初探
    • Kernel技术
      • kallsyms子系统
    • Test技术
      • 软件测试
        • jnekin+sonar 部署 问题总结
        • 性能测试基础
        • 软件测试的背景
        • 测试基础
        • 测试人员的核心竞争力
    • 操作系统原理
      • 处理器如何实现原子操作
Powered by GitBook
On this page
  • 一、热补丁
  • 1.1 热补丁(hotfix)
  • 二、Tinker
  • 2.1 Tinker
  • 2.2 Tinker的使用
  • 三、Tinker测试
  • 3.1 生成基准包
  • 3.2 修改代码
  • 3.3 生成差分包

Was this helpful?

  1. 5.技术篇
  2. Android技术
  3. Tinker

1.Tinker及其使用

PreviousTinkerNext准备

Last updated 4 years ago

Was this helpful?

一、热补丁

1.1 热补丁(hotfix)

热补丁:让应用能够在无需重新安装的情况实现更新,帮助应用快速建立动态修复能力。

热补丁技术可以理解为一个动态修改代码与资源的通道,它适合于修改量较少的情况。另外针对Android开发的机型碎片化问题,补丁机制也适合使用在远端调试上,即只需要具备给特定用户发送补丁的能力,对于查找问题非常有帮助。

二、Tinker

2.1 Tinker

Tinker是微信官方开发并采用的热补丁方案。支持dex文件、资源文件以及so文件的热更新。局限性在于无法支持AndroidManifest文件的修改。

是一个开源项目。

对于dex文件、资源文件以及so文件的更新,都是通过补丁生成,补丁合成以及补丁加载进行。如,针对dex文件,在编译时通过新旧两个dex文件生成差异patch.dex。在运行时,将差异patch.dex重新跟原始安装包的旧Dex还原为新的Dex。这样相较于直接替换dex文件,减少了文件包的大小。其中包含的主要技术就是patch.dex的生成算法以及dex的合成算法。微信使用的是自研的DexDiff算法。

2.2 Tinker的使用

Tinker开源项目中有tinker-sample-android项目作为示例。

由于在尝试集成过程中遇到各种问题,查阅各大论坛也有相应的问题但没有解决方案。因此,最后决定将tinker-sample-android中相关的配置进行copy,并进行适配,最终结果是能够成功生成差分包

2.2.1 拷贝相关文件

将tinker-sample-android项目中的如下文件拷贝到自己项目中:

app目录下的build.gradle、tinker_multidexkeep.pro

项目根目录下的build.gradle、gradle.properties文件

2.2.2 增加相应patch

gradle.properties文件:

+ TINKER_ID=1.0
+ TINKER_ENABLE=true

build.gradle文件:

        implementation "androidx.multidex:multidex:2.0.1"

+        implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'
+        implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

上述操作之后,已经能够集成Tinker的相关功能。

2.2.3 将项目的Application类修改为SampleApplicationLike类

原因在于,Tinker的主要工作流程如图所示:

程序启动时会加载默认的Application类,由此导致无法在应用启动前加载补丁包。因此,Tinker中将Application类移除并将相应的代码放到ApplicationLike类中。

因此,在集成时,需要将注册的Application类修改为如下的形式:

@DefaultLifeCycle(
        application = ".SampleApplication",     //需要与注册的Application名字相同
        loaderClass = "com.tencent.tinker.loader.TinkerLoader",
        flags = ShareConstants.TINKER_ENABLE_ALL,
        loadVerifyFlag = false)                                //tinkerFlags above
public class SampleApplicationLike extends DefaultApplicationLike {

    public SampleApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag,
                                 long applicationStartElapsedTime, long applicationStartMillisTime,
                                 Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime,
                applicationStartMillisTime, tinkerResultIntent);
    }

    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);

        MultiDex.install(base);
        TinkerManager.installTinker(this);
    }
}

其中,TinkerManager从项目中copy即可。

三、Tinker测试

3.1 生成基准包

点开Gradle,运行app/tasks/other/assembleDebug,会在build/baseApk下生成apk文件及R.txt基准文件。

3.2 修改代码

将build.gradle中的tinkerOldApkPath、tinkerApplyResourcePath字段改成3.1中生成的文件名

并且可以进行代码修改

3.3 生成差分包

修改代码完成后,运行app/tasks/tinker/tinkerPatchDebug生成差分包,文件位置为build/outputs/apk/tinkerPatch/debug/patch_signed.apk文件。

由此,Tinker集成成功。

Tinker
avatar