Android之移动热修复

作者: 沈子羽 | 来源:发表于2017-07-13 18:37 被阅读144次

    阿里云最近推出了移动热修复服务,听说这个服务傻瓜式接入,性能相对较好,对新技术比较好奇的我决定尝试一下。


    移动热修复.png

    首先,需要开通这个服务,创建应用


    创建应用.png
    然后,在项目中接入服务。按照文档所述,
    第一步:gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加如下配置:

    添加maven仓库地址:

    repositories {
       maven {
           url "http://maven.aliyun.com/nexus/content/repositories/releases"
       }
    }
    

    第二步:添加gradle坐标版本依赖:

    compile 'com.aliyun.ams:alicloud-android-hotfix:3.0.6'
    

    第三步:在AndroidManifest.xml中添加权限:

    <!-- 网络权限 -->
        <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"/>
        <!--读取手机设备码-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    

    文档中并没有提到最后一个权限,不过我运行项目的时候有提示需要这个权限。
    第四步:配置AndroidManifest文件:

    <meta-data
    android:name="com.taobao.android.hotfix.IDSECRET"
    android:value="App ID" />
    <meta-data
    android:name="com.taobao.android.hotfix.APPSECRET"
    android:value="App Secret" />
    <meta-data
    android:name="com.taobao.android.hotfix.RSASECRET"
    android:value="RSA密钥" />
    

    这些信息可以在新建的应用中找到


    应用信息.png

    第五步:混淆配置:

    #基线包使用,生成mapping.txt
    -printmapping mapping.txt
    #生成的mapping.txt在app/buidl/outputs/mapping/release路径下,移动到/app路径下
    #修复后的项目使用,保证混淆结果一致
    #-applymapping mapping.txt
    #hotfix
    -keep class com.taobao.sophix.**{*;}
    -keep class com.ta.utdid2.device.**{*;}
    #防止inline
    -dontoptimize
    

    第六步:在Application中初始化:
    initialize的调用应该尽可能的早,必须在Application.attachBaseContext()或者Application.onCreate()的最开始进行SDK初始化操作,否则极有可能导致崩溃。

    // initialize最好放在attachBaseContext最前面
    SophixManager.getInstance().setContext(this)
                    .setAppVersion(appVersion)
                    .setAesKey(null)
                    .setEnableDebug(true)
                    .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                        @Override
                        public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                            // 补丁加载回调通知
                            if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                                // 表明补丁加载成功
                            } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                                // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                                // 建议: 用户可以监听进入后台事件, 然后应用自杀
                            } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                                // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                                // SophixManager.getInstance().cleanPatches();
                            } else {
                                // 其它错误信息, 查看PatchStatus类说明
                            }
                        }
                    }).initialize();
    // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
    SophixManager.getInstance().queryAndLoadNewPatch();
    

    到此,集成完毕。
    接下来,开始测试。
    我刚开始直接在原有项目中撸了一遍,结果跟友盟有冲突(看来尝试新东西还是得新建项目,偷不得懒)。。。所以又新建了一个项目,重新撸一遍。。。
    1.旧版本:不显示“HelloWord”;
    2.新版本:显示“HelloWord”;
    3.下载补丁工具:https://help.aliyun.com/document_detail/53247.html?spm=5176.doc53240.6.548.o2zESp
    4.使用补丁工具生成补丁。
    5.上传补丁文件。在APP列表中,点击“管理”,添加版本(版本要和app版本一致)。

    添加版本.png
    点击对应版本的“查看详情”,上传补丁。
    上传补丁.png
    点击对应补丁版本的“查看详情”,里面可以发布补丁。
    6.发布补丁。

    最后手机上的APP没有立即显示“HelloWord”,关闭重启APP后成功显示“HelloWord”。虽然没有即时生效,但至少成功更新了。

    相关文章

      网友评论

      • DOAING:老哥我报这个错误是怎么回事 QProcess::ProcessError(FailedToStart) ,说是代码比较出问题。求赐教。
        沈子羽:@DOAING :joy:
        DOAING:@掌握当下 找到原因了我重装系统后忘记安jdk了。。。。:flushed: 。。。。。。。。
        沈子羽: @DOAING 建议你重新建个项目试一下,初始化的位置也要注意一下

      本文标题:Android之移动热修复

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