Android 热更新

嘿,今天的你过的还好吗,今天分享一下实现app在线更新

这么复杂的东西造轮子指定不是我的性格,先讲怎么用,然后再说原理.这个在网上找了好久,忽然发现这个简单实现方式,一行代码
而且这个实现也挺全的支持MD5加密

基本礼仪,先把人家的Github贴出来,支持Kotlin哦

https://github.com/teprinciple/UpdateAppUtils

//引包
implementation 'com.teprinciple:updateapputilsx:2.3.0'

根据示例,我仿照了一下,把路径之类的写死了

    private String apkUrl = "http://118.24.148.250:8080/yk/update_signed.apk";
    private String updateTitle = "发现新版本V2.0.0";
    private String updateContent = "1、Kotlin重构版\n2、支持自定义UI\n3、增加md5校验\n4、更多功能等你探索";

这样网址信息版本就都有了

然后需要根据官网,去实例化他的UpdateConfig;

UpdateConfig updateConfig = new UpdateConfig();

实例化UpdateConfig之后就可以配置一下他的文件
官方给了几个基本属性,可以根据自己需要来设置

isDebug  // 是否是调试模式,调试模式会输出日志
alwaysShow  // 非强制更新时,是否每次都显示弹窗,用VersionName来判断
thisTimeShow   // 非强制更新时,指定本次显示弹窗
alwaysShowDownLoadDialog  // 非强制更新时,也显示下载进度dialog
force  // 是否强制更新
apkSavePath  // apk下载存放位置
apkSaveName  // apk 保存名(默认是app的名字)
downloadBy  // 下载方式:默认app下载
checkWifi  // 是否检查是否wifi
isShowNotification  // 是否在通知栏显示
notifyImgRes  // 通知栏图标
needCheckMd5  // 是否需要进行md5校验,仅app下载方式有效
showDownloadingToast  // 是否需要显示 【更新下载中】文案
serverVersionName  // 服务器上版本名
serverVersionCode  // 服务器上版本号

配置完需要的属性后,该研究一下ui了
官方也是很给力的给了几个ui实例,去实现UiConfig方法就行

UiConfig uiConfig = new UiConfig();

方法我们有了,看看他的内部

// ui类型,默认简洁版
uiType  //SIMPLE简洁版;PLENTIFUL丰富版;CUSTOM自定义
// 自定义UI 布局id
customLayoutId
 // 更新弹窗中的logo
updateLogoImgRes
 // 标题相关设置
titleTextSize
titleTextColor
 // 更新内容相关设置
contentTextSize
contentTextColor
// 更新按钮相关设置
updateBtnBgColor
updateBtnBgRes
updateBtnTextColor
updateBtnTextSize
updateBtnText
// 取消按钮相关设置
cancelBtnBgColor
cancelBtnBgRes
cancelBtnTextColor
cancelBtnTextSize
cancelBtnText
 // 开始下载时的Toast提示文字
downloadingToastText
// 下载中 下载按钮以及通知栏标题前缀,进度自动拼接在后面
downloadingBtnText
// 下载出错时,下载按钮及通知栏标题
downloadFailText

ui这块我觉得丰富版nei个挺不错的.我也就没尝试自定义.

最后看看主要实现UpdateAppUtils方法

 /**
     * 设置apk下载地址
     */
apkUrl
/**
     * 设置更新标题
     */
updateTitle
/**
     * 设置更新内容
     */
updateContent
/**
     * 设置更新配置
     */
updateConfig
/**
     * 设置UI配置
     */
uiConfig
/**
     * 设置下载监听
     */
setUpdateDownloadListener
/**
     * 设置md5校验结果监听
     */
setMd5CheckResultListener
/**
     * 设置初始化UI监听
     */
setOnInitUiListener
/**
     * 设置 “暂不更新” 按钮点击事件
     */
setCancelBtnClickListener
 /**
     * 设置 “立即更新” 按钮点击事件
     */
setUpdateBtnClickListener
/**
     * 检查更新
     */
update
/**
     * 获取单例对象
     */
getInstance
/**
     * 初始化,非必须。解决部分手机 通过UpdateFileProvider 获取不到context情况使用
     * * @param context 提供全局context。
     */
init

至此结束,可以简单实现,把代码贴出

package cn.ryanliu.updateapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import org.jetbrains.annotations.NotNull;

import constant.UiType;
import listener.Md5CheckResultListener;
import listener.UpdateDownloadListener;
import model.UiConfig;
import model.UpdateConfig;
import update.UpdateAppUtils;

public class MainActivity extends AppCompatActivity {

    private String apkUrl = "http://118.24.148.250:8080/yk/update_signed.apk";
    private String updateTitle = "发现新版本V2.0.0";
    private String updateContent = "1、Kotlin重构版\n2、支持自定义UI\n3、增加md5校验\n4、更多功能等你探索";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UpdateConfig updateConfig = new UpdateConfig();
        updateConfig.setCheckWifi(true);
        updateConfig.setNeedCheckMd5(true);
        updateConfig.setNotifyImgRes(R.drawable.ic_launcher_background);

        UiConfig uiConfig = new UiConfig();
        uiConfig.setUiType(UiType.PLENTIFUL);

        UpdateAppUtils
                .getInstance()
                .apkUrl(apkUrl)
                .updateTitle(updateTitle)
                .updateContent(updateContent)
                .uiConfig(uiConfig)
                .updateConfig(updateConfig)
                .setMd5CheckResultListener(new Md5CheckResultListener() {
                    @Override
                    public void onResult(boolean result) {

                    }
                })
                .setUpdateDownloadListener(new UpdateDownloadListener() {
                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onDownload(int progress) {

                    }

                    @Override
                    public void onFinish() {

                    }

                    @Override
                    public void onError(@NotNull Throwable e) {

                    }
                })
                .update();
    }
}

分析一下原理,个人觉得很明白理解
首先就是根据参数看一下是否需要更新
判断如果需要更新就去服务器上下载最新的apk
最后把新得apk安装上就ok了

没更新动态或者频繁更新动态的时候都是在认真生活

推荐阅读更多精彩内容