对于热修复无非就是两大类,一类是tencent代表的classloader模式的,另一类是阿里系代表的底层方面替换。

下面以本人的经验介绍下微信的tinker接入:

命令行接入方式; gradle接入方式

1. 核心库引入,在你应用的app模块下build.gradle文件加入

//tinker hotfix
//可选,用于生成application类
// compileOnly("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}")
//tinker's main Android lib
implementation "com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}" 如果应用开启了multiDex(一般应用都会用到),还必须加入如下配置
defaultConfig {
  ...
   ... multiDexEnabled true
//必须打入第一个dex包的java类
multiDexKeepProguard file("tinker_multidexkeep.pro") }
当然其实上述采用的是proguard方式加入到Main dex中,当然也可以采用multiDexKeepFile方式(一行一个类形式)
主要目的就是确保tinker的包中类分到第一个dex中,具体可以参考:https://juejin.im/entry/5893e54f128fe100654763a0https://www.kancloud.cn/alex_wsc/artist/481985https://blog.csdn.net/zhangbuzhangbu/article/details/52770939
其实关于分包模式的问题,可以参考我的一片博文: https://www.cnblogs.com/linghu-java/p/10983671.htmlhttps://www.kancloud.cn/alex_wsc/android_plugin/481528
2、一般应用的application都有很多特殊的初始化和配置的内容,所以这里不打算使用注解生成application的方式,而是自己加入tinker的内容。
明文写出Application的构造函数,在里面调用super类TinkerApplication的构造函数
  public class WishApplication extends TinkerApplication {
    public WishApplication(){
    super(//tinkerFlags, which types is supported dex only, library only, all support
  ShareConstants.TINKER_ENABLE_ALL,
  // This is passed as a string so the shell application does not
  // have a binary dependency on your ApplicationLifeCycle class.
  "com.yunzhiyuan100.wish.SimpleApplicationLike");
    }
}
如果本来extends MultiApplictiaon的话就要换成 extends TinkerApplication了,然后重写attachBaseContext()方法,在该方法里加入MultiDex的内容。
如下 protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
MultiDex.install(this);
}
然后就是你原来Application的代码逻辑的内容,可以不用变动
3. 然后自定义Application中初始化函数用到ApplicationLike类参数实例,可以直接按照tinker给的代码拷贝
 public class SimpleApplicationLike extends ApplicationLike {

     public SimpleApplicationLike(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);
} @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
getApplication().registerActivityLifecycleCallbacks(callback);
} }

4. proguard改变

 #your dex.loader pattern here
-keep class com.tencent.tinker.loader.**
#注意 AndroidManifest.xml中的applicaion
-keep class com.yunzhiyuan100.wish.WishApplication # ***************** Tinker patch包
# 打替换apk包的时候需要
-applymapping mapping.txt

然后就可以打包了,打old.apk的时候自动生成mapping.txt, 第二次打new.apk包的时候为了保持混淆的一致性,要使用第一混淆的时候的mapping文件,

-applymapping mapping.txt

5.  AndroidManifest修改,application标签下面加入

 <meta-data
android:name="TINKER_ID"
android:value="20190604" />
6.下载Thinker的项目 

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

tinker的项目地址: https://github.com/Tencent/tinker

然后通过android studio打开整个项目

  (1). 在控制台输入:./gradlew buildTinkerSdk    (window上gradlew buildTinkerSdk)

在指定路径看到生成的文件之后,将刚才生成的old.apk和new.apk拷贝进去。

(2). 修改tinker_config.xml

    loader修改成自己的application

    <issue id="dex">
<!--only can be 'raw' or 'jar'. for raw, we would keep its original format-->
<!--for jar, we would repack dexes with zip format.-->
<!--if you want to support below 14, you must use jar-->
<!--or you want to save rom or check quicker, you can use raw mode also-->
<dexMode value="jar"/> <!--what dexes in apk are expected to deal with tinkerPatch-->
<!--it support * or ? pattern.-->
<pattern value="classes*.dex"/>
<pattern value="assets/secondary-dex-?.jar"/> <!--Warning, it is very very important, loader classes can't change with patch.-->
<!--thus, they will be removed from patch dexes.-->
<!--you must put the following class into main dex.-->
<!--Simply, you should add your own application {@code tinker.sample.android.SampleApplication}-->
<!--own tinkerLoader {@code SampleTinkerLoader}, and the classes you use in them-->
<loader value="com.tencent.tinker.loader.*"/>
<loader value="com.yunzhiyuan100.wish.WishApplication"/>
</issue>

另外,如果是正式包,需要修改签名配置为你项目的签名,还需要把签名文件yunzhiyuan.jks放到buildSDK的目录build下面

  <!--sign, if you want to sign the apk, and if you want to use 7zip, you must fill in the following data-->
<issue id="sign">
<!--the signature file path, in window use \, in linux use /, and the default path is the running location-->
<path value="yunzhiyuan.jks"/>
<!--storepass-->
<storepass value="bgsb1709@hzyzy"/>
<!--keypass-->
<keypass value="bgsb1709@hzyzy"/>
<!--alias-->
<alias value="wish"/>
</issue>

(3)最后就可以执行patch命令打出差异包了

命令行如下:

  java -jar tinker-patch-cli-1.9.13.jar -old old.apk -new new.apk -config tinker_config.xml -out output

注意tinker-patch-cli这个jar包的名字要和buildSdk/build/目录下的该jar包版本名称一致

把打出来的差异包adb push 到sdcard目录下: adb push patch_sign.apk   /sdcard/

然后在MainActivity中加载差异包,通过加入一个按钮的点击调用下面的loadFix()函数

 public void loadFix(){
  TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
  Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed.apk");
}

这里调用loadFix()之后,应用会被关闭,再次打开,测试得到想要的修改结果。

大功告成了

参考:

  https://blog.csdn.net/YANGDAHUAN/article/details/81021801

    https://blog.csdn.net/lmj623565791/article/details/54882693

    https://github.com/Tencent/tinker

    https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

    https://blog.csdn.net/cjw8990/article/details/79117880

tinker接入的更多相关文章

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

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

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

    本文已在我的公众号hongyangAndroid首发.转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/54882693本文出自张鸿 ...

  3. 微信热修复tinker及tinker server快速接入

    博客: 安卓之家 掘金: jp1017 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 当前热修复方案很多,今天研究了下微信的tinker,使用效果还是不错的,配合tinker serv ...

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

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

  5. 包建强的培训课程(15):Android App热修复技术

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  6. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

  7. 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e Dev Club 是一个交流移动 ...

  8. Android热修复之微信Tinker使用初探

      文章地址:Android热修复之微信Tinker使用初探 前几天,万众期待的微信团队的Android热修复框架tinker终于在GitHub上开源了. 地址:https://github.com/ ...

  9. bugly集成了Tinker热更新

    介绍 热更新能力是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力.Bugly目前采用微信Tinker的开源方案,开发者只需要集成我们提供的SDK就可以实现 ...

随机推荐

  1. [C]表达式结合规律和运算符优先级

    表达式结合规律 如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符): 表达式 结合律 组合方式 a/b%c 从左往右 (a/b) ...

  2. 23.login1(SKCTF)

    没有账号?注册一个试一试~ 题目提示用SQL约束攻击,那么什么是SQL约束攻击呢? 约束攻击的原理就是注册用户名为'admin    '(有多个空格)的账号,密码'*******'(密码可以自定义,符 ...

  3. 高阶组件&&高阶函数(一)

    antd里面的form表单方面,遇到一个高阶函数,以及高阶组件,于是看了一下这方面内容,前辈们的文章写得也非常详细,这里就稍微kobe一下 高阶函数与高阶组件 高阶函数: 高阶函数,是一种特别的函数, ...

  4. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

  5. 一篇文章看懂angularjs component组件

     壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中详细介绍了directive基本用法与完整属性介绍.directive是个很神奇的存在,你可以不设置templa ...

  6. 《机器学习实战之第二章k-近邻算法》

    入坑<机器学习实战>: 本书的第一个机器学习算法是k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 ...

  7. c++.net学习笔记

    Notes for c++ learning 程序根据什么特征来区分调用哪个重载函数? 只能靠参数而不能靠返回值类型的不同来区分重载函数. 编译器根据参数为每个重载函数产生不同的内部标识符 在Visu ...

  8. Github新项目Dress(好耶是女装)

    面向可爱的蓝孩子 (/ω\) 的 git 学习实践项目,包含了600多位蓝孩子的女装照,访问前做好心理准备. 每个人都可以成为这个项目的参与者 访问地址:https://github.com/kome ...

  9. [CrackMe]160个CrackMe之015

    吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.破解 该破解比较简单,其是一个静态密码  2G83G35Hs2 ,输入进去即可破解. 1)栈定位法找到用户代码 ...

  10. Excel导入导出DataGridView

    /// <summary> /// excel表保存到dataTable中 /// </summary> /// <param name="path" ...