腾讯Bugly热修复

写在前面:

在平时开发中,当稳定版本开发出来后,我们要做的就是发布到各个app市场。但是我们发出去的版本存在着bug,这时我们只能修改后又重新发版,想想国内N多个平台,每次发版都想吐。好在有热补丁这以技术的诞生,热补丁解决了项目有bug而不用重新发版,而是通过打补丁的方式修复我们的bug,一下就记录腾讯基于Tinker的Bugly热修复。

接下来:就开始实现嘛

第一步:添加依赖

在project目录下的build.gradle中添加

// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
classpath "com.tencent.bugly:tinker-support:latest.release"

在module目录下的build.gradle中添加

// 多dex配置
compile 'com.android.support:multidex:1.0.1'
// 升级SDK,其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
compile 'com.tencent.bugly:crashreport_upgrade:latest.release'

然后在module目录下新建tinker-support.gradle文件(与build.gradle同级),并在module的build.gradle添加依赖,如图.

腾讯Bugly热修复_第1张图片
tinker-support.gradle.png

第二步:AndroidMainfest.xml配置








第三步:初始化SDK

在tinker-support.gradle文件中有个参数enableProxyApplication

  1. 为false的情况下需要我们配置Application,官方推荐开发者自定义Application方式,因为这种方式有更好的兼容性,缺点是接入成本增加。
  1. 为true,则无需修改Application,这样tinker帮我们动态替换AndroidMainfest.xml的Application为tinker插件用于反射真是的Application类。

PS 但是以下只介绍自定义Application方式。

(一)自定义Application,不做任何操作

public class MyApplication extends TinkerApplication {
    public MyApplication() {
        super(ShareConstants.TINKER_ENABLE_ALL, "com.cn.one.MyApplicationLik","com.tencent.tinker.loader.TinkerLoader", false);
    }
}

参数解析:####

  1. 参数1:tinkerFlags 表示Tinker支持的类型 dex only、library only or all suuport,默认: TINKER_ENABLE_ALL
  1. 参数2:delegateClassName Application代理类 这里填写我们自定义的ApplicationLike
  2. 参数3:loaderClassName Tinker的加载器,使用默认即可
  3. 参数4:tinkerLoadVerifyFlag 加载dex或者lib是否验证md5,默认为false

将AndroidMainfest.xml中application 的name值改成我们的MyApplication

腾讯Bugly热修复_第2张图片
android-main-fest-application.png

(二)自定义ApplicationLike:

MyApplicationLike这个类是Application的代理类,以前所有在Application的实现必须要全部拷贝到这里, 在onCreate方法调用SDK的初始化方法, 在onBaseContextAttached中调用Beta.installTinker(this)

public class MyApplicationLike extends DefaultApplicationLike {
    public MyApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId
        // 调试时,将第三个参数改为true
        Bugly.init(getApplication(), "709e98ebf0", true);
    }
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        MultiDex.install(base);
        // 安装tinker
        // TinkerManager.installTinker(this); 替换成下面Bugly提供的方法
        Beta.installTinker(this);
    }
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
        getApplication().registerActivityLifecycleCallbacks(callbacks);
    }
}

第三步:混淆配置

-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
-keep class android.support.**{*;}

注意事项:

  1. 打基准包安装上报联网,必须填写唯一tinkerId
  2. 上传补丁包的一定是patch目录的,而不是tinkerPatch目录
  3. 同一基准包多次修复的,每次打补丁包只需修改tinkerId即可
  4. 平时debug开发的话只需将module下build.gradle中的apply from: 'tinker-support.gradle'注释即可

写在最后

后续。。。

你可能感兴趣的:(腾讯Bugly热修复)