知识库

Android 热修复 Tinker接入及源码浅析

网站:知识库   来源:网络收集

Android 热修复 Tinker 接入及源码浅 析 一、概述 放了一个大长假,happy,先祝大家 2017 年笑口常开。

假期中一行代码没写, 但是想着马上要上班了, 赶紧写篇博客回顾下技能, 于是便有了本文。

热修复这项技术,基本上已经成为项目比较重要的模块了。

主要因为项目在上线之后,都难 免会有各种问题,而依靠发版去修复问题,成本太高了。

现在热修复的技术基本上有阿里的 AndFix、QZone 的方案、美团提出的思想方案以及腾讯 的 Tinker 等。

其中 AndFix 可能接入是最简单的一个(和 Tinker 命令行接入方式差不多) ,不过兼容性还 是是有一定的问题的;QZone 方案对性能会有一定的影响,且在 Art 模式下出现内存错乱的 问题(其实这个问题我之前并不清楚,主要是 tinker 在 MDCC 上指出的);美团提出的思想方 案主要是基于 Instant Run 的原理,目前尚未开源,不过这个方案我还是蛮喜欢的,主要是 兼容性好。

这么看来,如果选择开源方案,tinker 目前是最佳的选择,tinker 的介绍有这么一句: Tinker 已运行在微信的数亿 Android 设备上,那么为什么你不使用 Tinker 呢? 好了,说了这么多,下面来看看 tinker 如何接入,以及 tinker 的大致的原理分析。

希望通过 本文可以实现帮助大家更好的接入 tinker,以及去了解 tinker 的一个大致的原理。

二、接入 Tinker 接入 tinker 目前给了两种方式,一种是基于命令行的方式,类似于 AndFix 的接入方式;一 种就是 gradle 的方式。

考虑早期使用 Andfix 的 app 应该挺多的,以及很多人对 gradle 的相关配置还是觉得比较繁 琐的,下面对两种方式都介绍下。

(1)命令行接入 接入之前我们先考虑下,接入的话,正常需要的前提(开启混淆的状态) 。

对于 API 一般来说,我们接入热修库,会在 Application#onCreate 中进行一下初始化操作。

然后在某 个地方去调用类似 loadPatch 这样的 API 去加载 patch 文件。

对于 patch 的生成 简单的方式就是通过两个 apk 做对比然后生成;需要注意的是:两个 apk 做对比,需要的前 提条件,第二次打包混淆所使用的 mapping 文件应该和线上 apk 是一致的。

最后就是看看这个项目有没有需要配置混淆; 有了大致的概念,我们就基本了解命令行接入 tinker,大致需要哪些步骤了。

依赖引入 dependencies { // ... //可选,用于生成 application 类 provided('com.tencent.tinker:tinker-android-anno:1.7.7') //tinker 的核心库 compile('com.tencent.tinker:tinker-android-lib:1.7.7') } 顺便加一下签名的配置: android{ //... signingConfigs { release { try { storeFile file("release.keystore") storePassword "testres" keyAlias "testres" keyPassword "testres" } catch (ex) { throw new InvalidUserDataException(ex.toString()) } } } buildTypes { release { minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug {

debuggable true minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } 文末会有 demo 的下载地址, 可以直接参考 build.gradle 文件, 不用担心这些签名文件去哪找。

API 引入 API 主要就是初始化和 loadPacth。

正常情况下,我们会考虑在 Application 的 onCreate 中去初始化,不过 tinker 推荐下面的写 法: @DefaultLifeCycle(application = ".SimpleTinkerInApplication", flags = ShareConstants.TINKER_ENABLE_ALL, loadVerifyFlag = false) public class SimpleTinkerInApplicationLike extends ApplicationLike { public SimpleTinkerInApplicationLike(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); } @Override public void onCreate() { super.onCreate(); TinkerInstaller.install(this); } } ApplicationLike 通过名字你可能会猜, 并非是 Application 的子类, 而是一个类似 Application 的类。

tinker 建议编写一个 ApplicationLike 的子类,你可以当成 Application 去使用,注意顶部的注

解:@DefaultLifeCycle,其 application 属性, 会在编译期生成一个 SimpleTinkerInApplication 类。

所以, 虽然我们这么写了, 但是实际上 Application 会在编译期生成, 所以 AndroidManifest.xml 中是这样的: 编写如果报红,可以 build 下。

通过该文会对一个编译时注解的运行流程和基本 API 有一定的掌握, 文中也会对 tinker 该部 分的源码做解析。

上述,就完成了 tinker 的初始化,那么调用 loadPatch 的时机,我们直接在 Activity 中添加 一个 Button 设置: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void loadPatch(View view) { TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() "/patch_signed.apk"); } } 我们会将 patch 文件直接 push 到 sdcard 根目录; + 所以一定要注意:添加 SDCard 权限,如果你是 6.x 以上的系统,自己添加上授权代码,或 者手动在设置页面打开 SDCard 读写权限。

除以以外,有个特殊的地方就是 tinker 需要在 AndroidManifest.xml 中指定 TINKER_ID。

//... 到此 API 相关的就结束了,剩下的就是考虑 patch 如何生成。

patch 生成 tinker 了 patch 生成的工具,源码见:tinker-patch-cli,打成一个 jar 就可以使用,并且提 供了命令行相关的参数以及文件。

命令行如下: java -jar tinker-patch-cli-1.7.7.jar -old old.apk -new new.apk -config tinker_config.xml -out output 需要注意的就是 tinker_config.xml,里面包含 tinker 的配置,例如签名文件等。

这里我们直接使用 tinker 的签名文件,所以不需要做修改,不过里面有个 Application 的 item 修改为与本例一致: 大致的文件结构如下: 可以在 tinker-patch-cli 中提取,或者直接下载文末的例子。

上述介绍了 patch 生成的命令,最后需要注意的就是,在第一次打出 apk 的时候,保留下生 成的 mapping 文件,在/build/outputs/mapping/release/mapping.txt。

可以 copy 到与 proguard-rules.pro 同目录, 同时在第二次打修复包的时候, 在 proguard-rules.pro 中添加上: -applymapping mapping.txt 1 1

保证后续的打包与线上包使用的是同一个 mapping 文件。

tinker 本身的混淆相关配置,可以参考: tinker_proguard.pro 如果,你对该部分描述不了解,可以直接查看源码即可。

测试 首先随便生成一个 apk(API、混淆相关已经按照上述引入) ,安装到手机或者模拟器上。

然后,copy 出 mapping.txt 文件,设置 applymapping,修改代码,再次打包,生成 new.apk。

两次的 apk,可以通过命令行指令去生成 patch 文件。

如果你下载本例,命令需要在[该目录]下执行。

最终会在 output 文件夹中生成产物: 本例修改了 title。

点击 loadPatch,观察 log,如果成功,应用默认为重启,然后再次启动即可达到修复效果。

到这里命令行的方式就介绍完了,和 Andfix 的接入的方式基本上是一样的。

值得注意的是:该例仅展示了基本的接入,对于 tinker 的各种配置信息,还是需要去读 tinker 的文档(如果你确定要使用)tinker-wiki。

相关内容
  • Android开发—— 热修复Tinker源码浅析

    Android开发—— 热修复Tinker源码浅析

    Android开发—— 热修复Tinker源码浅析...

  • Android源码分析工具及方法

    Android源码分析工具及方法

    Android源码分析工具及方法...

  • Android热修复学习之旅——Tinker接入全攻略

    Android热修复学习之旅——Tinker接入全攻略

    Android热修复学习之旅——Tinker接入全攻略...

  • Android Native服务实现及源码分析

    Android Native服务实现及源码分析

    Android Native服务实现及源码分析...

  • Android 热修复方案分析

    Android 热修复方案分析

    Android 热修复方案分析...

  • android生日提醒分析和源码提供

    android生日提醒分析和源码提供

    android生日提醒分析和源码提供...

  • Android 源码分析-打电话和发短信

    Android 源码分析-打电话和发短信

    Android 源码分析-打电话和发短信...

  • Android 主要的热修复方案原理分析

    Android 主要的热修复方案原理分析

    Android 主要的热修复方案原理分析...

  • android仿iPhone滚轮控件实现及源码分析

    android仿iPhone滚轮控件实现及源码分析

    android仿iPhone滚轮控件实现及源码分析...

  • Android源码的获取和编译

    Android源码的获取和编译

    Android源码的获取和编译...

  • 网友在搜
  • tinker 热修复
  • tinker软件安装文档
  • 易语言源码修复
  • udp 转 m3u8 swift 数组类型转换 lived和stayed skopje港口 towerofhero dram led 主板亮黄灯 香港金瑞泰 时间川流不息的歌词 fuhrer of katze ac68u私人云 penicillin romance 找不到air pod dashberlin风格 警察英语怎么发音 群晖nas 下载 蚂蚁 k eleven nerdtree安装 w97m micro.a ran van winkle ipad mini2扩容 rest of humanity p53泛素化 pkpm挠度超限 新娘美妆造型 struts2 socket fair rite 5968000301 录音笔t mark every是什么词 hd598 game one discountenance hm toffeecoffee 地球末日a堡 中国通史楼劲老了好多 4oo8 mifid ii是什么 switchmy wife i5 7300和i7 7700差价 μ s forever iene 00329 火影忍者无修邪恶漫画 gpa有什么用 香港00后照片 下人成语 快乐英语动动动1 合成bios fitc word A3设置 x2 550开核多少度 qnodes pbs 催眠眼镜圣诞节 铁氰化钾 cv

    All Right Reserved 知识库

    声明:本站内容源于网络,出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,请咨询相关专业人士。

    如果无意之中侵犯了您的版权,或有意见、反馈或投诉等情况 网站地图 网站栏目