阿里最新版热更新修复Sophix

在突然接到经理说需要在老项目接入热更新,当时一脸懵逼,不懂怎么弄,当时考虑对比一下微信Tinker热修复和阿里热修复Sophix,分别写了两个demo测试一下,摸索了差不多一个星期,遇到了好多坑,最后我采用的阿里的Sophix修复.

查看官方文档

接入文档

集成准备

一、添加产品

阿里最新版热更新修复Sophix_第1张图片

进入管理控制台

阿里最新版热更新修复Sophix_第2张图片

新建产品

阿里最新版热更新修复Sophix_第3张图片

阿里最新版热更新修复Sophix_第4张图片

 阿里最新版热更新修复Sophix_第5张图片

 新建产品

    下载aliyun-emas-services.json文件
    后面配置需要的数据,都在该文件中

二、SDK引入

SDK引入有以下两种方式,官方更推荐第一种。
1. gradle远程仓库依赖

添加maven仓库地址

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }
    }
}

在app.gradle中添加依赖

/*
    Android Studio 3.0以后,官方推荐使用  implementation 或 api 添加依赖
    如果是之前的版本,使用compile
 */

阿里最新版热更新修复Sophix_第6张图片
 

implementation 'com.aliyun.ams:alicloud-android-hotfix:3.2.3'

2. SDK下载

SDK下载地址
三、添加必要权限






四、添加meta-data

在AndroidManifest.xml文件的Application节点下面,添加以下内容:





 

这三个值需要到前面下载的aliyun-emas-services.json文件里查找,对应关系如下:
value名     对应字段
App ID     hotfix.idSecret
App Secret     emas.appSecret
RSA密钥     hotfix.rsaSecret

不用怀疑,RSA秘钥就是这么长

官方文档建议,使用setSecretMetaData这个方法进行设置。后面代码配置中会讲到。


五、混淆配置(可选)

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

 

这样,前期的配置准备就完成了。将项目编译以下,准备后面的代码配置。
代码配置

这里我直接贴上初始化的代码,在注释中详细介绍:

package com.huaiwang.zhhw;

import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;

/**
 * 作者: WangSophixApp
 * 时间: 2019/3/11 13:59
 * 描述:
 */
public class WangSophixApp extends SophixApplication {
  private static final String TAG="WangSophixApp";

  @Keep
  @SophixEntry(WangApp.class)
  static class RealApplicationStub {
  }
  @Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    initSophix();
  }

  private void initSophix() {
    String appVersion;

    try {
      appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
      appVersion = "1.3";
      e.printStackTrace();
    }

    SophixManager.getInstance().setContext(this)
        .setAppVersion(appVersion)

        .setAesKey(null)
        .setEnableDebug(false)
        .setPatchLoadStatusStub(new PatchLoadStatusListener() {
          @Override
          public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
            String msg = new StringBuilder("").append("Mode:").append(mode)
                .append(" Code:").append(code)
                .append(" Info:").append(info)
                .append(" HandlePatchVersion:").append(handlePatchVersion).toString();

            Log.d(TAG, "onCreate://...... " + msg.toString());
//            if (msgDisplayListener != null) {
//              msgDisplayListener.handle(msg);
//            } else {
//              cacheMsg.append("\n").append(msg);
//            }
            // 补丁加载回调通知
            if (code == PatchStatus.CODE_LOAD_SUCCESS) {
              // 表明补丁加载成功
            } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
              // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
              // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,详见1.3.2.3
             // SophixManager.getInstance().killProcessSafely();

            } else if (code == PatchStatus.CODE_LOAD_FAIL) {
              // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
               SophixManager.getInstance().cleanPatches();
            } else {
              // 其它错误信息, 查看PatchStatus类说明
            }
          }
        }).initialize();

  }
}

 

这个很容易踩的坑,wangApp.class填写自己的,使用@keep指向自己的Application

阿里最新版热更新修复Sophix_第7张图片

在配置文件引用AndroidManifest添加前面的WangSohixApp文件,这个名字可以取自己的

 

生成补丁工具下载和使用介绍

阿里最新版热更新修复Sophix_第8张图片

 代码配置差不多了,到了打包apk了,首先生成两个旧的apk和新的apk,设置那里是配置自己签名

配置完成之后,点击go

阿里最新版热更新修复Sophix_第9张图片

生成的补丁是这个,然后打开阿里平台

阿里最新版热更新修复Sophix_第10张图片

 注意注意注意了

阿里最新版热更新修复Sophix_第11张图片

阿里最新版热更新修复Sophix_第12张图片

这三个地方的版本号一定要一样

阿里最新版热更新修复Sophix_第13张图片

点击新建发布就成功了

附上代码链接 代码下载

本人摸索一周时间才摸索出来的,加入你在集成热更新的时候跟阿里百川有冲突

https://mp.csdn.net/postedit/88422123

你可能感兴趣的:(android)