美文网首页Android潜修者Android学习Android开发
阿里百川HotFix热更新集成加使用

阿里百川HotFix热更新集成加使用

作者: laer_L | 来源:发表于2016-12-21 15:10 被阅读2413次

    集成步骤:

    1. 首先创建开发者账号,并创建一个应用
    2. Androidstutio集成:
    • 首先还是按照阿里文档集成,有可能不成功的(文档上面说了注意: 1.4.0版本的仓库地址已经发生了变更, 请更新到上述百川最新的仓库地址),反正我是没有成功
    • 我的(这是根据阿里给的dome里面配置的):
      先在project的gradle里面添加:
    allprojects {
        repositories {
            jcenter()
            maven {
                //百川仓库, ut/utdid
                url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
            }
        }
    }
    

    然后在module的gradle中添加:
    dependencies { compile 'com.taobao.android:alisdk-hotfix:1.4.0' }
    在文章的末尾我会贴出我的gradle代码

    1. 创建一个Application
    /**
     * Created by Laer on 2016/12/20.
     */
    public class Myapplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            HotFixManager.getInstance().setContext(this)
                    .setAppVersion("你的版本号")
                    .setAppId("你在开发者平台创建应用的appId")
                    .setAesKey(null)//如果对补丁进行了Aes加密,这里就要填上,具体见开发文档
                    .setSupportHotpatch(true)
                    .setEnableDebug(true)
                    .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                        @Override
                        public void onload(final int mode, final int code, final String info, final int handlePatchVersion) {
                            // 补丁加载回调通知
                            if (code == PatchStatusCode.CODE_SUCCESS_LOAD) {
                                // TODO: 10/24/16 表明补丁加载成功
                            } else if (code == PatchStatusCode.CODE_ERROR_NEEDRESTART) {
                                // TODO: 10/24/16 表明新补丁生效需要重启. 业务方可自行实现逻辑, 提示用户或者强制重启, 建议: 用户可以监听进入后台事件, 然后应用自杀
                            } else if (code == PatchStatusCode.CODE_ERROR_INNERENGINEFAIL) {
                                // 内部引擎加载异常, 推荐此时清空本地补丁, 但是不清空本地版本号, 防止失败补丁重复加载
                                //HotFixManager.getInstance().cleanPatches(false);
                            } else {
                                // TODO: 10/25/16 其它错误信息, 查看PatchStatusCode类说明
                            }
    
                        }
                    }).initialize();
        }
    }
    
    1. 添加网络权限
     <!-- 网络权限 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!-- 外部存储读权限 -->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    1. 在清单文件中添加key
        <meta-data
                android:name="com.taobao.android.hotfix.APPSECRET"
                android:value="你在开发者平台获取的APPSECRET" />
            <meta-data
                android:name="com.taobao.android.hotfix.RSASECRET"
                android:value="你在开发者平台获取的RSASECRET" />
    

    获取这两个参数的链接:
    http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.9IOxxU&treeId=234&articleId=105459&docType=1#s1

    project中的gradle

    buildscript {
            repositories {
                jcenter()
            }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.0'
        }
    }
    allprojects {
        repositories {
            jcenter()
            maven {
                //百川仓库, ut/utdid
                url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
            }
        }
    }
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    module的gradle

    apply plugin: 'com.android.application'
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            applicationId "com.xxx.alihix"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:25.0.0'
        compile 'com.android.support:palette-v7:25.0.0'
        compile 'com.taobao.android:alisdk-hotfix:1.4.0'
        compile 'com.android.support:design:25.0.0'
    }
    

    至此我们的集成过程就已经完成了,下面进入调试使用阶段

    1. 首先我们要创建一个old.apk(也就是有问题的apk)
    • 首先将Myapplication中的.setAppVersion("1.0")//设置一个版本号,随便设置,后面再上传补丁的时候会将补丁的版本号改成这个,这两个地方的版本哈要一致
    • 接下来我们发布一个有问题的apk或是说old.apk,并将这个old.apk放到一个单独的地方(我的:C:\Users\Laer\Desktop\oldApk\old.apk),以免发布新版本的时候覆盖这个旧版本(这个old.apk会在生成补丁时用到)
    1. 然后更改想要修改的代码,直接发布生成一个new.apk,同理将这个新的apk放到一个特定的位置(我的: C:\Users\Laer\Desktop\newApk\new.apk)
    java -jar BCFixPatchTools-1.3.0.jar -c patch -s C:\Users\Laer\Desktop\oldApk\old.apk -f C:\Users\Laer\Desktop\newApk\new.apk -w patch-out
    

    上面是我的最基本的生成补丁的命令,更完善命令或是要看具体含义可以参考文档2.2 生成 patch:
    https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.mFpm4X&treeId=234&articleId=105841&docType=1

    1. 将旧版的apk安装到手机(这只是针对测试,实际不用这样,用户手机里肯定是旧版的)

    2. 将生成的补丁上传到阿里(步骤:创建补丁新版本号---->点击查看详情----->上传补丁---->确定发布),如图:
      注意这里所填的版本号,就是在生成old.apk时在Application中填的版本号

      创建补丁新版本
      查看详情
      上传补丁
      查看详情
      确认发布
    3. 退出当前运行的old.apk,从新进入,这时程序将会自动检测是否有补丁,如果有将自动加载补丁,正常来说你就可以实现热更新后的效果了(有时候会程序会闪退,至于原因可以去看文档)

    4. 顺便提一下文档中官方提到了一个调试工具,具体使用见文档,使用起来也很简单,我就不做介绍了
      http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.x4PkBS&treeId=234&articleId=105842&docType=1

    到这里整个生成补丁,调试都走完了,热更新肯定也是有问题的,下面介绍一个我在调试时遇到的一个问题

    • old.apk代码:
     public void onclick(View view) {
              tv_show.setText("这是热更新之前的");
    //        tv_show.setText("这是热更新过后的");
        }
    

    我为textview添加了一个点击事件,从而根据显示的不同文字来区分是否热更新成功

    • new.apk代码:
     public void onclick(View view) {
    //        tv_show.setText("这是热更新之前的");
              tv_show.setText("这是热更新过后的");
        }
    
    • 调试的结果就是报异常,状态异常,如图:
    异常
    • 然后我改成了这样:
    public void onclick(View view) {
            showMsg();
        }
        private void showMsg() {
    //        tv_show.setText("这是热更新之前的");
              tv_show.setText("这是热更新过后的");
        }
    

    然后就成功了,我也没搞懂到底是为啥
    再给一个使用阿里热更新可能存在的问题的链接

    https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.HbfN1I&treeId=234&articleId=105843&docType=1

    尊重劳动成果,转发请标明原出处,谢谢

    相关文章

      网友评论

      • 开发小菜鸟:你好,请问我的为什么一直报
        Error:Could not find com.taobao.android:alisdk-hotfix:1.4.0.

        laer_L: @heloo泡沫 恩,这样也是可以解决的👍👍
        heloo泡沫:@laer_L 我也遇到了,官方是建议远程仓库访问不了,就本地依赖。完美解决
        laer_L: @小孔同学 没找到1.4.0的依赖包,你完全是按照我的步骤下来的么?如果是,你把1.4.0改成它最新的试试,我估计很可能是配置出错了
      • 大玩具:不错,加油哦

      本文标题:阿里百川HotFix热更新集成加使用

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