Android热修复之—阿里热修复

 如果一个App上线之后发现有重大bug需要紧急修复,那么通常做法是需要修改bug,然后重新打包发布,这样效率会比较低;但是有了热修复,就省事多了,下面就阿里的热修复集成使用做下说明记录,还是比较简单的,主要是对官网的内容做一个整合,看起来更方便一些。

1、首先是要去阿里云官网注册一个账号,然后进入移动研发平台EMAS 创建一个工作空间。之后进入空间按照提示添加应用。

2、上面内容填写完后点击下方的创建应用,进入下面的页面下载配置文件 

下面这个是配置文件的内容,其中status有1和0,1代表开通,0代表不开通,这里只使用热修复功能,所以只把第一个hotfix_service的status设置为1,其他的不用的都设置为0。 

 

  

 3、应用配置

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()

        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'

        // 添加emas-services插件
        classpath 'com.aliyun.ams:emas-services:1.0.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }

        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}
// 在 apply plugin: 'com.android.application' 下添加
apply plugin: 'com.aliyun.ams.emas-services'

 4、需要增加一个SophixStubApplication继承SophixApplication,此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。

import android.content.Context;
import android.util.Log;

import androidx.annotation.Keep;

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;

/**
 * Created by WJY.
 * Date: 2021-11-05
 * Time: 15:10
 * Description: 阿里云 热修复
 * Sophix入口类,专门用于初始化Sophix,不应包含任何业务逻辑。
 * 此类必须继承自SophixApplication,onCreate方法不需要实现。
 * 此类不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。
 * AndroidManifest中设置application为此类,而SophixEntry中设为原先Application类。
 * 注意原先Application里不需要再重复初始化Sophix,并且需要避免混淆原先Application类。
 * 如有其它自定义改造,请咨询官方后妥善处理。
 */
public class SophixStubApplication extends SophixApplication {

    private final String TAG = "SophixStubApplication";

    // 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(MyApplication.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();
    }
}
<application
        android:name=".application.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>

</application>

5、AndroidManifest文件配置SDK参数(这一步要有,官网上只有在继承SDK的情况下才写了这个配置,如果不配置这个,会失败的:CODE_QUERY_BROKEN = 35;//请求完整性校验失败异常)

<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密钥" />

6、拉取补丁是非常简单的,只有一行代码(放在Application或者App启动页吧,或者自己来决定放在一个合适的地方):

SophixManager.getInstance().queryAndLoadNewPatch();

7、混淆配置

#基线包使用,生成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
#看情况是否要混淆
-keepclassmembers class com.example.hotfixtext.MyApplication {
        public <init>();
    }

后面就是补丁的生成以及上传了,使用打包工具生成补丁包

打包工具下载地址(windows版本打包工具下载地址):

http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_windows.zip

 

 

 上传补丁:

 上传后可以测试一下是否好用,之后再发布,

补丁调试工具下载地址:

http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk?spm=a2c4g.11186623.0.0.d8b62c8faBCJ5I&file=hotfix_debug_tool-release.apk

 到这就完成了热更新,在不影响用户使用的过程中不知不觉就把app中的bug给修改了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代新人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值