Sophix热修复实践

实践环境

1 . Android Studio
2 . win10 64位

集成步骤

在阿里云控制台新建app


  1. 获取appId、secret、以及rsa秘钥 网址链接

依次点击产品->移动服务->移动热修复
image

点击管理控制台

image

进入到后台 新建app 查看三个配置参数

image

app配置

1 . 在app中的build.gradle中配置maven仓库和依赖

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

dependencies {
    ...
      //如果其它阿里系SDK也可能依赖了utdid这个SDK, 编译期间报utdid重复, 此时进行如下处理即可,
    // 关闭传递性依赖,没有其他可以将大括号删除:
    compile ('com.aliyun.ams:alicloud-android-hotfix:3.0.3') {
        exclude(module:'alicloud-android-utdid')
    }
    ...
}

2 . 在AndroidManifest文件中添加Sophix权限

 <!--网络权限-->
    <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"/>

3 . 在AndroidManifest文件中配置上个步骤获取到的appId、secret、rsa秘钥

<meta-data
            android:name="com.taobao.android.hotfix.IDSECRET"
            android:value="your id" />
        <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="your secret" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="your rsa" />

4 . 新建Application子类

attachBaseContext初始化SophixManager

@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // 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) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后应用自杀
                            // SophixManager.getInstance().killProcessSafely();//安全自杀应用推荐
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                            SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                            Log.d("lzc", code + "");
                        }
                    }
                }).initialize();
    }

注意:上面的appVersion与app版本无关可以自己定义只要与自己控制台中版本一致即可。我这里定义的是private static final String appVersion = “1.0.0”;

onCreate中请求差异包

 // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreateSophixManager.getInstance().queryAndLoadNewPatch();

5 . 混淆配置

在app目录下的proguard-rules.pro文件下添加如下代码:

#基线包使用,生成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

测试Sophix

1 . 下载window 差异打包工具
链接地址
2 . 将新旧差异包差异打包
image

3 . 这其中可以设置差异包所用到的签名,签名必须与app签名一致 保证安全性
image

4 . 点击go 就会生成差异包以.jar结尾 路劲就是自己设定的
image

5 . 将生成的差异包上传至控制台
image

image

下发差异包之前最好先下载阿里提供的测试工具测试一下差异包是否能用然后在灰度下发在全量下发

6 . 下载阿里差异包测试工具
下载地址

7 . 将旧的apk和调试工具装在手机中 打开调试工具 输入包名->连接应用->扫描二维码 观察下方输出的日志
image

8 . 成功的话就可以开始下发差异包了,之后就可以观察手机中旧的apk发生了变化了

官方接入指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章