本文为原创,如需转载,请注明出处:https://www.jianshu.com/p/40d53bbbfb9e
一.为什么需要使用热修复
1.在一次发布新版本的时候,由于是上线前没有测试下检查更新的模块,更新下载apk的地址写死了(一个本地的apk下载地址),导致有新版本的时候,用户不能更新,好在发现得及时,及时撤回,更新了安装包。影响到50多个用户,还是有不小影响到。
2.在一次ios升级的过程中,客服反映,用户点击升级,跳转到appStore里面是其他公司的app的下载界面。后来发现,是在提交appstore的时候,跳转的链接写死了,写的是开发人员之前公司app的链接。如果这两个app存在竞争关系,或者其他的东西,会给用户,公司带来不小的影响。好在这个ios的app处于刚上线的状态,用户量不是很多,影响不是特别大。后面也是通过更新版本,用户重新下载,或官网扫码等渠道更新解决这个问题的。
如果使用了热修复,就能很好的解决这个问题了,不需要重新上传更新包,还可以修复已经存在bug用户的问题。
bug可以分为两种,一种影响大的,需要及时修复,一种是影响较小,可以下个版本更新的时候提交。这只是更新模块出现的问题,这个模块还是比较重要的。每次上线前,最好是测试下这个模块,因为即使这个版本使用没有问题,但是由于bug,会导致不能更新到下个版本。当然其他地方可能也存在一些案列,这里我只列举了我在开发中遇到的。
二、使用tinker,gradle方式实现热修复
tinker,它是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。Tinker 已运行在微信的数亿 Android 设备上,那么为什么你不使用 Tinker 呢?
github 地址:https://github.com/Tencent/tinker
关于tinker原理可以看这篇文章 https://www.jianshu.com/p/5f390be47ce8
这篇文章就是根据tinker的思路实现自己的一套热修复方案,文章中还有视频,感觉是挺有帮助的,推荐给你们看看。
接下来进入正题使用tinker, 建议先下载gitbub的demo,然后先运行起来看下效果。运行domo可参考:
https://www.jianshu.com/p/57264c770c12
之后可以跟着demo,或者看别人的文章,自己搭建个demo,然后就可以在项目进行测试啦。 tinker wiki 地址 https://github.com/Tencent/tinker/wiki
1.加入依赖
![](https://img.haomeiwen.com/i5823355/40c35168a53f689f.png)
2.复制tinker demo中的app ,build.gradle到自己的demo中,修改部分内容即可
tinkerId = getTinkerIdValue()并将其替换成tinkerId = "1.0"
buildConfigField "String", "TINKER_ID", ""1.0""
3.将应用签名,包括debug,release版本,然后在gradle进行配置
signingConfigs {
release {
try {
keyAlias 'china'
keyPassword '123456'
storeFile file('E://test/tinkerdemo2/tinkerdemo2.jks')
storePassword '123456'
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file('E://test/tinkerdemo2/tinkerdemo2debug.jks')
keyAlias 'china'
keyPassword '123456'
storePassword '123456'
}
}
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
4.添加SampleApplicationLike 类,初始化tinker等操作(可以复制tinker demo下的SampleApplicationLike)
@DefaultLifeCycle(application = ".SimpleTinkerInApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = true)
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);
MultiDex.install(base);
TinkerInstaller.install(this);
}
@Override
public void onCreate() {
super.onCreate();
}
}
5.activity修复操作
//加载补丁
public void loadPath(View view) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/patch_signed_7zip.apk";
File file = new File(path);
if (file.exists()){
Toast.makeText(this, "补丁已经存在", Toast.LENGTH_SHORT).show();
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), path);
}else {
Toast.makeText(this, "补丁不存在", Toast.LENGTH_SHORT).show();
}
}
6.修改androidmanifast.xml文件。添加权限,和引入application
![](https://img.haomeiwen.com/i5823355/e8793d9d6afac140.png)
7.gradle运行 生成old包的apk(这里可以生成debug,或者release版本,但是old包要和补丁包是相同版本,release包会生成mapping.txt文件,debug包没有(这个文件要备份起来,这个混淆过后对照文件,方便以后生成补丁))
![](https://img.haomeiwen.com/i5823355/9913d7bfc10fa86b.jpg)
生成old包的位置和补丁包的位置
![](https://img.haomeiwen.com/i5823355/ef5d555559a0ef4e.jpg)
运行效果
![](https://img.haomeiwen.com/i5823355/52f47ec49a6da8e3.png)
8.修改xml,将textview 值修改为222,然后复制old包的文件名,修改app下的build.gradle 配置,gradle运行,生成补丁包
![](https://img.haomeiwen.com/i5823355/58f249d45194f84a.png)
9.测试效果。将补丁包拷贝到sd卡目录下,运行old包,点击更新,重启应用生效。
![](https://img.haomeiwen.com/i5823355/78ffa5e36bb15d14.png)
网上还有通过tinkerpatch第三方实现 tinker的,后台下发补丁的一个平台,需要收费,有兴趣可以了解下
遇到的问题:
1Could not get unknown property 'apkVariantData' for object of type com.androd......
将gradle build 的版本将至2.3.3, 高版本的会出现这个bug
文章demo传送门:https://github.com/xiaotianzhen/tinkerdemo
参考文章:https://blog.csdn.net/qq_15527709/article/details/61921447
网友评论