- 接入之前我们先来看下阿里官网的对比图:
- 注册阿里云账号,选择移动热修复服务 ,选择之后需要开通此功能,点击立即开通即可,Sophix地址
- 点击创建应用,如图:
配置:
- Android Studio接入,首先在app目录下的build.gradle文件添加依赖,如图
- 原谅我不会截长图,这里就分成了两张图展示了
- 在AndroidManifest添加权限和配置代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fxx.sophix">
<!-- Sophix热修复权限 -->
<!-- 网络权限 -->
<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" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:name=".SophixStubApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 热修复配置 -->
<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="你的App RSA" />
</application>
</manifest>
-
App RSA 官网获取如下:
-
然后在proguard文件中配置混淆,代码如下:
在#基线包使用,生成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.**{*;}
-dontwarn com.alibaba.sdk.android.utils.**
#防止inline
-dontoptimize
#Application 混淆配置
-keepclassmembers class com.fxx.sophix.SophixApp {
public <init>();
}
# 如果不使用android.support.annotation.Keep则需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub这里插入代码片
- Sophix最新版本引入了新的初始化方式。
原来的初始化方式仍然可以使用。只是新方式可以提供更全面的功能修复支持,将会带来以下优点:初始化与应用原先业务代码完全隔离,使得原先真正的Application可以修复,并且减少了补丁预加载时间等等。另外,新方式能够更完美地兼容Android 8.0以后版本。
具体而言,是需要用户自行加入以下这个类:
package com.fxx.sophix;
import android.content.Context;
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;
/**
* Sophix入口类,专门用于初始化Sophix,不应包含任何业务逻辑。
* <p>
* 此类必须继承自SophixApplication,onCreate方法不需要实现。
* <p>
* 此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。
* <p>
* AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。
* <p>
* 注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。
* <p>
* 如有其它自定义改造,请咨询官方后妥善处理。
*/
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry应指定真正的Application,并且保证SophixApp类名不被混淆。
@Keep
@SophixEntry(SophixApp.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(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保存状态。
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
}
- 其中关键的一点
// 此处SophixEntry应指定真正的Application,并且保证SophixApp类名不被混淆。
@Keep
@SophixEntry(SophixApp.class)
static class RealApplicationStub {
}
- 自己在新建一个Application类,用于检测补丁包,如下:
package com.fxx.sophix;
import android.app.Application;
import com.taobao.sophix.SophixManager;
/**
* FileName: SophixApp
* <p>
* Author: FXX
* <p>
* Date: 2019/10/11 0011 11:19
* <p>
* Description:
*/
public class SophixApp extends Application {
@Override
public void onCreate() {
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
super.onCreate();
//你的代码逻辑
...
}
//你的其他方法
....
}
- 然后,在proguard文件里面需要加上下面内容,上面已经配置好了:
- 到这里配置就已经完成了,接下了我们来测试一下补丁修复
测试:
- 首先需要下载阿里Sophix热修复补丁工具:
- Mac版本打包工具地址
- Windows版本打包工具地址
- Linux版本打包工具地址
- 调试工具地址
- 首先我们在MainActivity布局文件中添加一个TextView,布局文件我就不贴了,java代码如下:
package com.fxx.sophix;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.taobao.sophix.SophixManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setText("我是有BUG的页面!!!");
tv.setTextColor(Color.RED);
}
}
- 记得在build.gradle文件设置版本:
- 哦,对了,在打包版本之前需要把Instant Run选项关闭
- 我们打包一个有bug的apk保存起来
- 然后我们去MainActivity修改代码:
package com.fxx.sophix;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.taobao.sophix.SophixManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setText("我的BUG已经修复好了!!!");
tv.setTextColor(Color.GREEN);
}
}
- 接着打包一个修复好的apk版本,保存起来
- 然后我们需要用到我们之前下载好的补丁工具如图:
- 点击设置:
- 接着利用工具得到补丁包
- 点击GO得到补丁包,在官网上添加app版本:
- 创建好版本之后就可以上传补丁了,如图:
- 上传完后,点击发布如图:
- 发布成功后:
- 到这里我们就已经发布好了补丁,最后附上效果图两张
- bug版本:
- 接着把App进程关闭,再次进入App,如图:
- 到这里就已经全部接入完毕,在此记录一下~~