介绍
产品上线后发现了一个小bug,急需修复,以热修复补丁方式动态修复紧急bug,不再需要重新发布app,不再需要用户重新下载,覆盖安装。目前开源了许多的热修复框架:如jasonross 的nuwa,美团的robust,阿里的andfix,腾讯的tinker等等。
本文使用腾讯的tinker:
引入:
add tinker-gradle-plugin as a dependency in your mainbuild.gradlein the root of your project:
buildscript { dependencies { classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1') } }
then you need to "apply" the plugin and add dependencies by adding the following lines to your
app/build.gradle.
dependencies { //可选,用于生成application类 provided('com.tencent.tinker:tinker-android-anno:1.9.1') //tinker的核心库 compile('com.tencent.tinker:tinker-android-lib:1.9.1') } ... ... apply plugin: 'com.tencent.tinker.patch'
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下。
这样其实也能猜出来,这个注解背后有个annotation processor在做处理,如果你没了解过,可以看下:
android 如何编写基于编译时注解的项目
通过该文会对一个编译时注解的运行流程和基本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。
//...
如对本文有疑问, 点击进行留言回复!!
荐 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )
Android xhdpi图片转换,能任意转换Android Drawable下“ldpi“, “mdpi“, “hdpi“, “xhdpi“,“xxhdpi“, “xxxhdpi“ 各个类型的图片
unity 之 Bugly(AndroidStudio) 的使用
荐 Android开发7年,疫情期间八家大厂高工的面试经历和真题整理
Android 自定义可编辑可任意全屏拖动的EditText
【android 布局】px和dp的概念和区别,什么情况下用px,dp,sp?
网友评论