美文网首页
使用bugly热更新记录(一)

使用bugly热更新记录(一)

作者: 闫回 | 来源:发表于2017-11-09 13:51 被阅读0次

    现在市面上热更新方案很多,本篇尝试使用bugly方案,bugly对tinker进行封装并添加后台管理,使用更新方便,目前免费。
    bugly热更新官方使用指南地址:https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170912151050
    如果有时间的话最好看下介绍视频,你会避免接入过程中的很多问题。


    上述步骤可以参考文档完成,很简单,第三步我们采用enableProxyApplication = false 的情况,这也是bugly推荐的方式。
    这时我们可以打开热更新API接口,把设置bugly的一些参数加入到自己的SampleApplicationLike类中,https://bugly.qq.com/docs/user-guide/api-hotfix/?v=20170912151050
    例如我加入的
    @Override
    public void onCreate() {
        super.onCreate();
    
        initBuglyHotFix();
    
    }
    
    private void initBuglyHotFix() {
    
        // 设置是否开启热更新能力,默认为true
        Beta.enableHotfix = true;
        // 设置是否自动下载补丁,默认为true
        Beta.canAutoDownloadPatch = true;
        // 设置是否自动合成补丁,默认为true
        Beta.canAutoPatch = true;
        // 设置是否提示用户重启,默认为false
        Beta.canNotifyUserRestart = true;
        // 补丁回调接口
        Beta.betaPatchListener = new BetaPatchListener() {
            @Override
            public void onPatchReceived(String patchFile) {
                Toast.makeText(getApplication(), "补丁下载地址" + patchFile, Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onDownloadReceived(long savedLength, long totalLength) {
                Toast.makeText(getApplication(),
                        String.format(Locale.getDefault(), "%s %d%%",
                                Beta.strNotificationDownloading,
                                (int) (totalLength == 0 ? 0 : savedLength * 100 / totalLength)),
                        Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onDownloadSuccess(String msg) {
                Toast.makeText(getApplication(), "补丁下载成功", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onDownloadFailure(String msg) {
                Toast.makeText(getApplication(), "补丁下载失败", Toast.LENGTH_SHORT).show();
    
            }
    
            @Override
            public void onApplySuccess(String msg) {
                Toast.makeText(getApplication(), "补丁应用成功", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onApplyFailure(String msg) {
                Toast.makeText(getApplication(), "补丁应用失败", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onPatchRollback() {
    
            }
        };
    
        // 设置开发设备,默认为false,上传补丁如果下发范围指定为“开发设备”,需要调用此接口来标识开发设备
        Bugly.setIsDevelopmentDevice(getApplication(), true);
        // 多渠道需求塞入
        // String channel = WalleChannelReader.getChannel(getApplication());
        // Bugly.setAppChannel(getApplication(), channel);
        // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId
        //第三个参数就是是否开启debug的参数
        Bugly.init(getApplication(), "900029763", true);
    }
    

    请注意这里面的参数设置,例如这行Beta.canNotifyUserRestart = true;
    是否提示用户重启,为了方便我们看到自己的效果,这时我们这时了true,还有这行 Bugly.init(getApplication(), "900029763", true);
    第三个参数就是开启debug的参数
    然后我们需要在bugly平台注册一个账号,创建自己的应用,获取自己的App ID



    我们需要在SampleApplicationLike中修改这个参数
    Bugly.init(getApplication(), "900029763", false);第二个参数就是我们的App ID。
    我在自己的demo里面写了一个bug

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
        findViewById(R.id.bt_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    
                Toast.makeText(MainActivity.this, Bug.getBugString(), Toast.LENGTH_SHORT).show();
    
    
            }
        });
    
    }
    

    class Bug{

      static String getBugString(){
    
         String str=null;
    
         Log.e("BugClass","get string length:"+str.length());
    
         return "This is a bug class";
     }
    

    }
    这时一个空指针异常
    这时我们打开tinker-support.gradle文件,修改tinkerId


    记得要在build.grade文件里面配置自己的签名信息,这时我们可以生成自己的基准包了,注意关闭自己的instant run模式,我们打开右侧的gradle,双击assembleRelease,就会生成自己的基准包

    我们把app-release.apk安装到自己的手机上面

    这时点击TEST按钮程序就会崩溃,错误信息如下

    好了,这时我们可以修复我们的bug

    然后修改tinker-support.gradle文件中的baseApkDir,一定要和左侧基准包一致,不然无法修复,修改第二个参数就是tinkerId,把1.0.1-base改成1.0.1-patch即可


    这时我们可以生成对应的补丁包了,双击下图中的buildTinkerPatchRelease即可

    然后在左侧可以看到生成的补丁包

    patch_signed_7zip.apk就是补丁包,这时我们打开bugly热更新管理平台

    点击发布新补丁,上传patch_signed_7zip.apk文件即可,注意我们上传补丁包前一定要运行我们的基准包,上传我们的基准包的信息给bugly平台,这样我们上传补丁包才可以修复我们的bug,上传过后我们重新运行我们的基准包
    可以看到bug修复成功,上面的提示信息和弹框都可以在SampleApplicationLike设置关闭,注意一定要重启应用或者屏幕关闭后开启,bug才能修复成功。
    实际的开发中都会有很多的渠道包,而且会加固,多个渠道包如何进行热修复呢?下篇会将自己集成美团walle多渠道打包和360加固的过程分享出来。
    demo地址https://github.com/yanchenling/MyHotFixDemo

    相关文章

      网友评论

          本文标题:使用bugly热更新记录(一)

          本文链接:https://www.haomeiwen.com/subject/dspymxtx.html