今日科技快讯

前段时间国家新闻出版广电总局发布通知,要求新浪微博按照有关规定,对视听节目服务进行全面整改。昨日,新浪微博官方发布公告:使用微博账号传播电影、电视剧,应当具有《电影片公映许可证》或《电视剧发行许可证》。将关闭超过15分钟以上的长视频上传功能。

作者简介

本篇是 带心情去旅行 的第四篇投稿, 介绍了如何使用热修复框架Tinker,希望能够帮助到大家。

带心情去旅行 的博客地址:

http://www.jianshu.com/u/769d3d3a9d4b

前言

不知你是否遇到这样的情况?千辛万苦上开发了一个版本,好不容易上线了,突然发现了一个严重bug需要进行紧急修复,怎么办?难道又要重新打包App、测试,发布新个版本?就为了修改一两行的代码?

莫慌,这种问题其实可以分分钟解决。如果你学会了这项黑科技——热修复。在用户使用App的时候,不知不觉,这个Bug就被修复了。

热修复:热修复(也称热补丁、热修复补丁,英语:hotfix)是一种包含信息的独立的累积更新包,通常表现为一个或多个文件。这被用来解决软件产品的问题(例如一个程序错误)。——维基百科

本文介绍了Tinker的接入方式,更加详细的内容可以查阅官方文档:

http://tinkerpatch.com/Docs/SDK

介绍

Tinker 是微信官方的Android热补丁解决方案,它支持动态下发代码、so库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用 Tinker 来更新你的插件。Tinker 所支持的功能如下:

Tinker 热补丁方案·不仅支持类、So以及资源的替换,它还是 2.X-7.X 的全平台支持。

接入

额,我是说进入正题

在项目的 build.gradle 中:

然后在 app 的 gradle 文件 app/build.gradle 中:

在app目录下,创建 tinkerpatch.gradle(可以去后面的链接下载源码,把这个文件拷进去)

将 TinkerPatch 相关的配置都放于 tinkerpatch.gradle 中,然后在 app 的 gradle 文件 app/build.gradle 中还添加:

apply from: 'tinkerpatch.gradle'

完整的 app/buidl.gradle:

配置参数

打开之前创建的 tinkerpatch.gradle 添加:

参数说明:

  • bakPath:基包路径

  • baseInfo:基包文件夹名(打补丁包的时候,需要修改)

  • appKey:进入官网注册一个账号,新增APP,得到对应的appKey。

使用

创建 FetchPatchHandler 用于检测是否更新(刚打开时会检测一次):

创建 MyApplication 初始化(reflectApplication = true 时)

注意:初始化的代码建议紧跟 super.onCreate(),并且所有进程都需要初始化,已达到所有进程都可以被 patch 的目的

如果你确定只想在主进程中初始化 tinkerPatch,那也请至少在 :patch 进程中初始化,否则会有严重的 crash 问题

打生产包

每次开发完成后,开始打包。打开 Studio 右侧的 Gradle,选择 assemableRelease 打正式包

完成后可以在文件夹 build 中找到生成的文件(这里称为基包)

打开 build -> bakApk -> app-1.0.0-0330-21-40-52 (根据时间命名)。release 文件夹中会出现我们刚打完的包。一个apk,对应一个txt文件。

将apk安装到手机上,这是一个刚创建的项目,里面只有Hello World

将app-1.0.0-0330-21-40-52备份,打补丁包的时候需要用到。多渠道打包时会根据渠道名分包,目录结构相似。

生成补丁包

这里模拟一个修补bug的场景,发一个热补丁,弹一个Toast。注意:在打生产包的代码上做修改

Toast.makeText(this, "这是个补丁", Toast.LENGTH_SHORT).show();

将之前的备份好的基包复制到 build/bakApk 下,打开 tinkerpatch.gradle 修改 baseInfo 成对应的文件名

修改 tinkerpatch.gradle 中的 tinkerpatchSupport -> appVersion

完成后打开 Gradle,如下选择 tinkerPatchRelease

补丁包将位于 build/outputs/tinkerPatch 中,这里只需要用到patch_signed_7zip.apk

发布

最后,只需要将刚生成的补丁包发布,然后静静等待即可。

进入官方网站(http://tinkerpatch.com/Apps/index),选择对应的app,添加APP版本

版本号对应 tinkerpatch.gradle 中的 appVersion

选择 patch_signed_7zip.apk 文件,提交即可(更多下发选项,参考官方文档)

提交后,查看补丁的下载数量以及成功应用数

这时候重新打开app,等待补丁下载。下载完成后关闭app,再次打开,查看结果。就这样,整个热修复的流程就完成了。

注意:一定要关闭后打开,热修复才会生效。

关于兼容多渠道包

关于渠道包的问题,若使用 flavor 编译渠道包,会导致不同的渠道包由于 BuildConfig 变化导致 classes.dex 差异。这里建议的方式有:

  • 将渠道信息写在 AndroidManifest.xml 或文件中,例如 channel.ini;

  • 将渠道信息写在 apk 文件的 zip comment 中,这种是建议方式,例如可以使用项目 packer-ng-plugin 或者可使用 V2 Scheme 的 walle;

  • 若不同渠道存在功能上的差异,建议将差异部分放于单独的dex或采用相同代码不同配置方式实现;

已通过Walle实现:

【Android】Walle多渠道打包&Tinker热修复

http://www.jianshu.com/p/0ba717f7385f

Tinker已知问题
  • Tinker 不支持修改 AndroidManifest.xml,Tinker 不支持新增四大组件;

  • 由于 Google Play 的开发者条款限制,不建议在GP渠道动态更新代码;

  • 在 Android N 上,补丁对应用启动时间有轻微的影响;

  • 不支持部分三星 android-21 机型,加载补丁时会主动抛出 TinkerRuntimeException:checkDexInstall failed;

  • 由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker 不再支持加固的动态更新;

  • 对于资源替换,不支持修改 remoteView。例如 transition动画,notification icon 以及 桌面图标。

Tips
  • dubug模式下,tinkerpatch.gradle —> tinkerpatchSupport—>tinkerEnable 需要改为 false

  • 添加SD卡权限,

  • 下载补丁后,杀掉进程重新打开,补丁才会生效

  • 补丁非即时生效,需要等一会儿

本文源码地址:

https://github.com/Gavin-ZYX/TinkerTest

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐