阿里SopHix热修复框架操作实践基础步骤

  • 首先第一步去阿里云申请注册账户,接下来是管理后台使用说明,链接如下:
    https://help.aliyun.com/document_detail/51434.html?spm=5176.doc53287.6.552.vZxNDm#Step5 发布补丁
  • 列表内容

    在android studio 上创建一个app项目工程,从管理后台获取AppId,和AppSecret以及RSA密钥。
    上面三个参数需要配置在application节点下面:

        <meta-data
            android:name="com.taobao.android.hotfix.IDSECRET"
            android:value="AppId" />
        <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="AppSecret" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="RSA密钥" />
  • 列表内容

    . 在项目对应的build.gradle下添加对应的库

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

在模块对应的build.gradle下添加

 compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.7'
  • 申请对应的权限
     <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" />

关于权限,在6.0以上的手机,需要动态的获取。如果没有相关的权限,启动app是检查不到新的补丁包的。我用的手华为的手机,安装app后,日志总是输出“there is not update”。原因是我没有读取内存卡的权限没有申请成功。

  • 创建MyApplication
package xxq.com.andfixdemo;

import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import com.alipay.euler.andfix.patch.PatchManager;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;

import java.io.File;
import java.io.IOException;

/**
 * Created by Administrator on 2017/12/14 0014.
 */

public class MyApplication extends Application {
    private static final String TAG = "MyApplication";

    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }
    private void init() {
        SophixManager.getInstance().setContext(this)
                .setAppVersion(getAppVersionName(this))
                .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) {
                            // 表明补丁加载成功
                            Log.i(TAG, "onLoad: 成功");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后应用自杀
                            Log.i(TAG, "onLoad: 生效需要重启");
                            restartApp();
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                            // SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                            Log.i(TAG, "onLoad: 其它错误信息"+code);
                        }
                    }
                }).initialize();
//        SophixManager.getInstance().queryAndLoadNewPatch();
    }
    /**
     * 返回当前程序版本名
     */
    public static String getAppVersionName(Context context) {
        String versionName = "";
        try {
            // ---get the package info---
            PackageManager pm = context.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
            versionName = pi.versionName;
            //versioncode = pi.versionCode;
            if (versionName == null || versionName.length() <= 0) {
                return "";
            }
        } catch (Exception e) {
            Log.e("VersionInfo", "Exception", e);
        }
        return versionName;
    }
    public void restartApp(){
        RestartAPPTool.restartAPP(this,2000);
    }
}

在activity oncreate()中添加

SophixManager.getInstance().queryAndLoadNewPatch();

整体代码如下 :

package xxq.com.andfixdemo;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.taobao.sophix.SophixManager;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SophixManager.getInstance().queryAndLoadNewPatch();
        tv = (TextView) findViewById(R.id.textview);
        tv.setOnClickListener(this);


    }
    public void onStart(View V){
        tv.setText("我是原始的app");
//        tv.setText("我是热修复的app");
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, tv.getText(), Toast.LENGTH_SHORT).show();
    }
}

关于SopHix最终如何使用可以参考官网文档
以上内容参考于:http://www.jianshu.com/p/42c436f1b207
感谢杨hai

猜你喜欢

转载自blog.csdn.net/qq_27686729/article/details/78819899