- 首先第一步去阿里云申请注册账户,接下来是管理后台使用说明,链接如下:
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