阿里最强热修复:Sophix 超高速集成与踩坑

超高速集成

 public class SophixStubApplication extends SophixApplication {
    private final String TAG = "Sophix";

    // 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(GowildApplication.class)
    static class RealApplicationStub {
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //      MultiDex必须在此处
        MultiDex.install(this);
        initSophix();
    }

    private void initSophix() {
        String appVersion = "0.0.0";
        try {
            appVersion = this.getPackageManager()
                    .getPackageInfo(this.getPackageName(), 0)
                    .versionName;
        } catch (Exception e) {
        }
        final SophixManager instance = SophixManager.getInstance();
        instance.setContext(this)
                .setAppVersion(appVersion)
                .setSecretMetaData("appkeyXXX","secret","rsaXXX")
               //注意上线必须改成false,否则会跳过校验,风险较大
                .setEnableDebug(false)
                .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保存状态。
                            Log.i(TAG, "sophix preload patch success. restart app to make effect.");
                        }
                    }
                }).initialize();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        SophixManager.getInstance().queryAndLoadNewPatch();
    }
}

app的gradle加入:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
dependencies {
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.4'}

官方建议

1、建议采用的单独Application类进行隔离,热修复适用性更广
2、建议不要把appkey,rsa等信息放在清单文件,而是放在application中并混淆

疑难问题

1、生成补丁失败,请检查代码
多半是改了清单文件,热修复不支持四大组件的增删;另一种情况是改了热修复独立类SophixStubApplication,该类绝不能调用非官方和androidSDK的代码,包括自己封装的日志类!
2、扫码测试时,弹出校验错误
打补丁时即使加了签名也还要在高级设置里把应用签名配置上。
3、编译报错:Multiple dex失败
移除原application的 MultiDex.install(this),并加入到SophixStubApplication的super.attachBaseContext(base);方法之后。
4、编译报错:Multiple dex files define Lcom/ta/utdid2/device/UTDevice
重复依赖了,多半是引用了多个阿里的类库(比如支付宝+热修复),可以下载精简版支付宝sdk(去utdevice),或者最简单直接采用本地sophix的aar包(不选择UTDevice)。

猜你喜欢

转载自blog.51cto.com/13952501/2169855