当前位置: 移动技术网 > 移动技术>移动开发>Android > Android--热修复

Android--热修复

2018年11月05日  | 移动技术网移动技术  | 我要评论

介绍

产品上线后发现了一个小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 yourapp/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。

  
    //...

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网