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

github:https://github.com/Tencent/tinker

关于接入:

Tinker-接入指南

Tinker 自定义扩展

Tinker-常见问题

公司接入tinker过程很顺利,基本问题都能够在tinker上,或者观看源码中获得答案。我们自己搭建的后台下发补丁、验证,安装。

build.gradle:

1、添加dependencies

     //可选,用于生成application类
compile 'com.tencent.tinker:tinker-android-anno:1.7.1'
//tinker的核心库
compile 'com.tencent.tinker:tinker-android-lib:1.7.1'

关于补丁后台管理:

1、Bugly热更新SDK-集成tinker:

http://dev.qq.com/topic/583ccfecb5f2ebea6e610f90

2、tinkerpatch tinker 热修复平台

http://tinkerpatch.com/

3、自己搭建后台管理:

server方面:

(1)提供请求tinker信息接口

(2)tinker补丁包下载

(3)tinker信息添加管理平台(添加,删除,修改tinker补丁包信息)

android方面:

(1)tinker配置类:

  import java.io.Serializable;

  public static class TinkerConfig implements Serializable {
public String tinker_id; // tinkerId
public String version_name; // 版本号
public String download_url; // tinker补丁下载地址
public String md5; // tinker补丁文件的md5值
}

(2)applicationlike create()方法调用时,http请求tinker配置信息,请求成功后,检查tinker版本的,

通过 Tinker.with(context).getTinkerLoadResultIfPresent() 获取现有的tinker版本。

  TinkerLoadResult tinkerLoadResult = Tinker.with(context).getTinkerLoadResultIfPresent();
String newTinkerID = "";
String tinkerID = "";
if (tinkerLoadResult != null) {
newTinkerID = tinkerLoadResult.getNewTinkerID();
tinkerID = tinkerLoadResult.getTinkerID();
}

(3)判断http获取到tinker信息跟现有的tinker信息:

if (tinkerPatch.tinker_id.equals(newTinkerID)) {
Log.e(TAG, "补丁已安装");
return;
}
if (!Utils.getVersionName().equals(tinkerPatch.version_name)) {
Log.e(TAG, "补丁版本不一致");
return;
}
// 下载tinker补丁,并安装。
downloadPatchInstall(context, tinkerPatch);

(4)判断是否已存在tinker补丁,否则下载tinker补丁。

(5)判断下载补丁文件的md5跟服务器的补丁md5是否一致。

(6)执行tinker补丁安装:

 TinkerInstaller.onReceiveUpgradePatch(context.getApplicationContext(), file.getAbsolutePath());

源码解析:

官方事例源码:tinker-sample

http://www.cnblogs.com/yyangblog/p/6249715.html

移动原application逻辑到新的applicationLike中:

一般不建议你自定义Application,把原来Application里的逻辑转移到ApplicationLike里会好很多 不过如果你真的自定义了Application,就要把你的自定义Application直接引用的类也加到loader pattern里,不然就会报preveriried的异常,而且这就导致了你的自定义Application和它直接引用的类无法被补丁更新,所以最好不要在Application里放任何逻辑,原来的Application里的逻辑全部移到ApplicationLike里就好。

包括分包的方法等,全都移到applicationlike,不移动会导致一些类提前加载,导致后续无法对这些类修改的问题。

tinkerId:

tinkerid一致的话,补丁会复用

可以用versioncode, clientversion之类的

只要保证每次发版本都会不一样就可以了。

打包发布:

关于保存基准包apk以及mapping文件以及resc文件,发版出去才需要保存,需结合自己的打包平台使用。

支持加固:

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

tinker的一般模式需要Dex的合成,它并不支持加固,一定要使用加固的app可以使用usePreGeneratedPatchDex模式。

只要加固后重新签名就没问题

关于:patch

:patch 进程, 在回调会自动kill掉的啊

要在Manifest;里面注册服务的。

intentservice 的实现机制就是新开一个handlerthread,然后stopself的时候把thread quit掉。

调用stopself杀死service以后,patch进程就是空进程,空进程什么时候回收,要看系统策略以及当前进程情况。

主要这个进程在,下次就无法修复了,因为补丁的时候,发现这个进程还在,就直接返回了。

检查下自己的代码,自己的service是否已经在manifest注册。

关于assets

例子里面下面这个assets/secondary-dex-?.jar是干什么用的呢?

如果assets里面也有dex, 可以这么设。

关于productFlavors编渠道包:

使用gradle的productFlavors编渠道包,由于会改变BuildConfig类的内容,从而导致dex不一致。 目前有什么好的方案吗?除了zip comment。能够既编出渠道包又不将FLAVOR写入BuildConfig。

只是用flavor来配置友盟的统计渠道

打release包换下保存目录就好了

如果使用Zip comment方式的话,稳定的工具或gradle插件推荐:

https://github.com/seven456/MultiChannelPackageTool

说明:这个方式的还是不支持v2SigningEnabled啊,android 7.0上校验不通过,看来只能把v2SigningEnabled关了,v2SigningEnabled 不是要求打包完后对apk不能做任何修改吗,AndResGuard也不支持。

http://blog.csdn.net/liuyanggofurther/article/details/50978407

tinker-如何兼容多渠道包?

使用packer-ng-plugin命令行的方式

微信tinker 热修复的更多相关文章

  1. android--------微信 Tinker 热修复 (三)

    前面简单介绍了一下Tinker热修复的使用,包含debug和release,今天就来分享一下微信针对Tinker热修复提供的一个平台,TinkerPatch补丁管理后台. 1:什么是TinkerPat ...

  2. android--------微信 Tinker 热修复 (二)

    前面简单介绍了一下Tinker热修复,今天就来分享一下如何在Android中使用,希望对各位有帮助. 1:Tinker 接入指南 在项目的build.gradle中,添加tinker-patch-gr ...

  3. Tinker 热修复框架 简单上手教程

    当你们看到Tinker的时候是不是有点愣逼这个是什么东西? 简单来说就是不需要重新下载app和重新安装app 来进行更新app的技术框架. 看看这个吧,我也是才学习 ,先做个学习记录 参考:Tinke ...

  4. android--------微信 Tinker 热修复 (一)

    什么是热修复 热修复补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速.低成本修复产品软件版本缺陷的方式. 热修复有多种,如:Tinker ,QZone,Andfix, ...

  5. Tinker 热修复

    集成方式: 第一步:在project  build.gradle 文件中添加: dependencies { // Tinker classpath("com.tinkerpatch.sdk ...

  6. Tinker热修复

    集成buggly热修复的时候报错 Error:A problem occurred configuring project ‘:app’. Failed to notify project evalu ...

  7. Android 腾讯bugly Tinker 热修复

    Bugly热更新是腾讯推出的热更新框架,热更新是指无需到应用市场重新下载安装app,只需要在app内下载补丁包即可实现app的更新,主要用于app的bug修复或者少量改动. 大家在使用app(特别是游 ...

  8. Android插件化与热修复(六)-微信Tinker原理分析

    Tinker热修复原理分析 热补丁技术是在用户不需要重新安装应用的情况下实现应用更新,可快速解决一些线上问题.热补丁省去了Android应用发布版本的成本,而且用户端的更新也是无感知的. Tinker ...

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

    一.概述 放了一个大长假,happy,先祝大家2017年笑口常开. 假期中一行代码没写,但是想着马上要上班了,赶紧写篇博客回顾下技能,于是便有了本文. 热修复这项技术,基本上已经成为项目比较重要的模块 ...

随机推荐

  1. MySQL 导出数据库,出现 “mysqldump: Got error: 1146”

    出现场景 在 cmd 导出数据库时: mysqldump -hlocalhost -uroot -p student_db > C:\student_db.sql 出现: mysqldump: ...

  2. Qt: 数据库操作;

    QT的数据库操作有两种方式: 一) 使用QsqlTableModel类, 可以配合QTableView进行界面显示并进行数据库操作, 这种方法比较方便快捷: 二)  使用原始SQL语言, 利用INSE ...

  3. dom4j,json,pattern性能对比【原】

    报文大概2000字节,对比时为只取其中某个节点的值即可. 以下对比可知取少量节点时pattern性能是远大于dom4j,和json的, 但取大量的时候就不能这么以偏概全了. dom4j和pattern ...

  4. DirectX11 With Windows SDK--15 几何着色器初探

    前言 从这一部分开始,感觉就像是踏入了无人深空一样,在之前初学DX11的时候,这部分内容都是基本上跳过的,现在打算重新认真地把它给拾回来. DirectX11 With Windows SDK完整目录 ...

  5. sqlalchemy查询结果类型简析

    Sqlalchemy的查询方式有很多种,例如可以查询全部,可以查询符合条件的,可以查询指定字段的.那么这么多种查询,返回的结果是不是一样的呢?作本文记录分析结果. Sql_forengin.py #c ...

  6. 滚动锚定(Scroll Anchoring)- 让视口内容不再因视口上方 DOM 元素的高度变化而产生跳动

    不知道你有没有经历过这样的场景:当你打开一张“多图杀猫”的页面后,正一张图一张图边滚边看,在你刚准备定睛看某一张图的时候,这张图突然被它上面的内容挤到了视口下方,然后你赶紧把滚动条往下拉,试图追赶这张 ...

  7. mac下go环境搭建开发web工程

    1,golang下载: http://www.golangtc.com/download https://golang.org/ https://beego.me/docs/intro/ 2,安装go

  8. 对评分矩阵进行分解,SVD与LSI

    摘自 推荐系统 https://www.cnblogs.com/lzllovesyl/p/5243370.html 一.SVD奇异值分解 1.SVD简介 SVD(singular value deco ...

  9. webpack学习笔记——打包后直接访问页面,图片路径错误

    我说的这种图片路径错误是这样的,运行webpack-dev-server,一切正常,没有错误.当webpack之后,直接打开index页面,报错,图片找不到,找不到的原因是路径错误. 先看我的项目代码 ...

  10. Java中谈尾递归--尾递归和垃圾回收的比较

    一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点:    1.调用的是同一个 ...