阿里云Sophix 3.0热修复技术接入总结

对比各种热修复技术和开发难度,我最终选择了Sophix

接入之前先了解一下Sophix文档:

阿里热修复https://www.aliyun.com/product/hotfix

快速接入直通车:https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11174283.3.1.D6UW0D

稳键接入直通车:https://help.aliyun.com/document_detail/61082.html?spm=a2c4g.11186623.6.547.ArjpX7

我在项目里使用的是  稳键接入  下面介绍 稳键接入  的流程

  1.在app中gradle文件中添加(仓库)

   

   repositories {

         maven  {

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

               }

            }

    2.然后在app的build.gradle里面添加依赖:

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

     注意,若SDK集成过程中出现UTDID冲突,请参考:https://help.aliyun.com/knowledge_detail/59152.html

   (我接入友盟sdk,造成了UTDID冲突,原因是友盟sdk和SopHix有重复的东西)

  3.稳健接入需要加入一个SophixStubApplication 的类

    这里有一点需要注意SophixStubApplication 类里有个 括号里写原来自己的Application名字

    import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
 
import com.jiaoyu.utils.ILog;
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;
 
 
public class SophixStubApplication extends SophixApplication {
    private final String TAG = "SophixStubApplication";
 
    // 此处SophixEntry括号里面应填写原来的的Application,并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(Application.class)
    static class RealApplicationStub {
    }
 
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//         MultiDex.install(this);
        initSophix();
    }
 
    private void initSophix() {

//你的后台版本,和控制台版本一样

        String appVersion = "2.4.4";
        try {
            appVersion = this.getPackageManager()
                    .getPackageInfo(this.getPackageName(), 0)
                    .versionName;
        } catch (Exception e) {
        }
        final SophixManager instance = SophixManager.getInstance();
        instance.setContext(this)
                .setAppVersion(appVersion)
                .setSecretMetaData(null, null, null)
                .setEnableDebug(true)
                .setEnableFullLog()
                .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) {
                            Log.i(TAG, "sophix load patch success!");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 如果需要在后台重启,建议此处用SharePreference保存状态。
                            //必须使用原生的SharePreference
 
                            Log.i(TAG, "sophix preload patch success. restart app to make effect.");
                        }
                    }
                }).initialize();
    }
}
4.之后我们在配置下刚才新写的SophixStubApplication类
<application
        android:name="com.XX.XXXX.SophixStubApplication"
总结一下:
把此SophixStubApplication入口类添加进项目中,所有Sophix相关初始化放在此类中。并且不应包含开发者的任何业务逻辑代码。 若使用了MultiDex,也应在SophixStubApplication的initSophix之前添加,并且需要记得在原来的Application里面去除MultiDex,避免重复调用导致问题。
把RealApplicationStub的SophixEntry注解的内容改为自己原先真正的MyRealApplication类
AndroidManifest里面的application改为新增的SophixStubApplication入口类

 

在AndroidManifest.xml中间的application节点下添加如下配置:
<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密钥" />

将上述value中的值分别改为通过平台HotFix服务申请得到的App Secret和RSA密钥

5.混淆配置

  1. #hotfix
  2. -keep class com.taobao.sophix.**{*;}
  3. -keep class com.ta.utdid2.device.**{*;}


至此配置完成

发布了36 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34895720/article/details/94774966