阿里Sophix热修复接入指南

  • 接入之前我们先来看下阿里官网的对比图:在这里插入图片描述
  • 注册阿里云账号,选择移动热修复服务 ,选择之后需要开通此功能,点击立即开通即可,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文件里面需要加上下面内容,上面已经配置好了:
    在这里插入图片描述
  • 到这里配置就已经完成了,接下了我们来测试一下补丁修复

测试:

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,如图:
  • 在这里插入图片描述
  • 到这里就已经全部接入完毕,在此记录一下~~
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Druid是一种用于实时大数据分析和数据探索的列存储数据库。阿里巴巴作为一家大型云计算和电子商务企业,通过接入Druid可以实现处理海量数据的需求,提供更高效、更快速的数据查询和分析服务。 首先,Druid的列存储特性使得它可以高效地处理大规模数据集。Druid的数据存储方式将数据按列进行存储,在查询时只需要读取相关列的数据,而不需要扫描整个数据表,大大加快了数据查询的速度。对于阿里巴巴这样的企业来说,每天生成的数据量巨大,并且还需要快速分析这些数据来支持决策和业务发展。Druid的接入可以满足阿里对于高效处理海量数据的需求。 其次,Druid具备实时数据处理的能力。阿里巴巴作为一个电商平台,需要对用户行为数据进行实时分析,以及实时调整产品推荐、广告投放等业务策略。Druid可以接收实时数据流并立即对数据进行索引和查询,支持实时的数据分析和探索,帮助阿里巴巴及时把握用户需求和市场变化。 此外,Druid的可扩展性和高可用性也是阿里巴巴接入的优势。Druid的分布式架构和强大的水平扩展能力,可以使阿里巴巴轻松扩展集群的规模,适应不断增长的数据量和用户访问需求。同时,Druid自身具备高可用性的特点,能够在节点故障时保持数据的可用性,提高数据处理的稳定性和可靠性。 综上所述,Druid的列存储、实时数据处理、可扩展性和高可用性等特性,使得它成为阿里巴巴接入的理想选择,为阿里提供更加高效、快速和可靠的大数据分析和数据探索服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值