Android 热更新
2020-12-17 本文已影响0人
ryanxun
嘿,今天的你过的还好吗,今天分享一下实现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了