AutoUpdateProject

Introduction: App 内部更新 提供 12 种更新的样式 适配到 Android 9.0 支持自定义 UI 断点续传
More: Author   ReportBugs   
Tags:

系列

在工作之余,打算将一些常用的逻辑页面,模块,功能点做成 library 库,这样当有相似需求的时候,可以做到插拔式开发!现在系列中有以下内容

特点概述

  • 最大亮点,提供12种更新的样式,总有一个是你喜欢的类型!
  • 支持三种设置更新信息的方式,您可以直接传 model,传 json 数据,或者直接配置请求链接,sdk 会自主请求并发起 app 的更新,满足多方需求!
  • 文件下载支持断点续传,下载错误拥有重试机制;相同版本的 apk 只会下载一次,防止重复下载!
  • 使用接口方式获取数据时支持设置请求头,支持 POST 和 GET 请求方式,更灵活。
  • 调用者可以自定义 UI 实现更新功能。
  • 已适配 Android 6.0,Android 7.0,Android 8.0,Android 9.0。
  • 提供强制更新,不更新则无法使用 APP,同时可以根据后台返回受影响的版本号,可控制多个版本同时被强制更新。
  • 通知栏图片自定义
  • 新增文件 MD5 校验,防止安装文件被恶意替换(2019-10-22 18:48:39 添加)
  • 新增静默下载更新的方式,实现进入 App 直接后台下载,下载完成后弹出安装页面(静默安装需要 Root 权限,而且体验很不好,不做支持)(2019-10-25 18:09:05 添加)。

新版本说明

  • 2019-11-08 18:13:56 更新版本,版本号为:v2.0.4

    • 修复静默下载时网络环境为数据网络的时候无法下载的问题
    • 修复其他问题,#22
  • 2019-11-04 12:38:12 更新版本,版本号为:v2.0.3

    • 新增配置 DownloadConnection 的入口,可切换文件下载器的内核
    • 提供了配置 Okhttp3 作为下载器的 demo,在 demo 中提供了 OkHttp3Connection 的实现,并提供信任所有证书的工具类 SSLUtils,可解决 https 根证书不被信任导致无法下载的问题
  • 2019-10-25 18:09:05 更新新版,版本号为:v2.0.2

    • 新增静默下载更新的方式
    • 新增获取是否有新版本更新的事件回调
    • 优化下载状态中的文案显示逻辑,点击 Demo 右上角第五个 item 体验
    • 修复多次调用 checkUpdate 多次弹窗的 bug
  • 2019-10-22 18:53:42 更新新版,版本号为:v2.0.1

    • 新版新增文件的 MD5 校验
    • 新版新增对文件下载进度的监听
    • 新版新增对文件 MD5 校验结果的回调
    • DEMO 中提供了获取文件 MD5 检验码的工具页面,也提供了加密工具类 Md5Utils

博客地址

掘金-【需求解决系列之四】Android App 在线自动更新 Library(V2.0)

简书-【需求解决系列之四】Android App 在线自动更新 Library(V2.0)

Demo 体验

Demo 下载

扫描二维码下载:

效果预览

说明: 以下 12 个更新的样式的类型值从左到右从上到下一次为

TypeConfig.UI_THEME_ATypeConfig.UI_THEME_BTypeConfig.UI_THEME_CTypeConfig.UI_THEME_DTypeConfig.UI_THEME_ETypeConfig.UI_THEME_FTypeConfig.UI_THEME_GTypeConfig.UI_THEME_HTypeConfig.UI_THEME_ITypeConfig.UI_THEME_JTypeConfig.UI_THEME_KTypeConfig.UI_THEME_L

UI_THEME_AUI_THEME_BUI_THEME_CUI_THEME_DUI_THEME_EUI_THEME_FUI_THEME_GUI_THEME_HUI_THEME_IUI_THEME_JUI_THEME_KUI_THEME_L

使用方式

Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:

allprojects { repositories { ... maven { url 'https://jitpack.io' } } }

Step 2. Add the dependency

    dependencies { implementation 'com.github.MZCretin:AutoUpdateProject:latest_version' }

Step 3. Init it in BaseApplication or MainActivity before using it.And then register BaseApplication in AndroidManifest(Don't forget it).

        //如果你想使用 okhttp 作为下载的载体,那么你需要自己依赖 okhttp,更新库不强制依赖 okhttp!可以使用如下代码创建一个 OkHttpClient 并在 UpdateConfig 中配置 setCustomDownloadConnectionCreator start
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(30_000, TimeUnit.SECONDS)
                .readTimeout(30_000, TimeUnit.SECONDS)
                .writeTimeout(30_000, TimeUnit.SECONDS)
                //如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 start
                .sslSocketFactory(SSLUtils.createSSLSocketFactory())
                .hostnameVerifier(new SSLUtils.TrustAllHostnameVerifier())
                //如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 end
                .retryOnConnectionFailure(true);
        //如果你想使用 okhttp 作为下载的载体,那么你需要自己依赖 okhttp,更新库不强制依赖 okhttp!可以使用如下代码创建一个 OkHttpClient 并在 UpdateConfig 中配置 setCustomDownloadConnectionCreator end

        //更新库配置
        UpdateConfig updateConfig = new UpdateConfig()
                .setDebug(true)//是否是 Debug 模式
                .setBaseUrl("http://www.cretinzp.com/system/versioninfo")//当 dataSourceType 为 DATA_SOURCE_TYPE_URL 时,配置此接口用于获取更新信息
                .setMethodType(TypeConfig.METHOD_GET)//当 dataSourceType 为 DATA_SOURCE_TYPE_URL 时,设置请求的方法
                .setDataSourceType(TypeConfig.DATA_SOURCE_TYPE_URL)//设置获取更新信息的方式
                .setShowNotification(true)//配置更新的过程中是否在通知栏显示进度
                .setNotificationIconRes(R.mipmap.download_icon)//配置通知栏显示的图标
                .setUiThemeType(TypeConfig.UI_THEME_AUTO)//配置 UI 的样式,一种有 12 种样式可供选择
                .setRequestHeaders(null)//当 dataSourceType 为 DATA_SOURCE_TYPE_URL 时,设置请求的请求头
                .setRequestParams(null)//当 dataSourceType 为 DATA_SOURCE_TYPE_URL 时,设置请求的请求参数
                .setAutoDownloadBackground(false)//是否需要后台静默下载,如果设置为 true,则调用 checkUpdate 方法之后会直接下载安装,不会弹出更新页面。当你选择 UI 样式为 TypeConfig.UI_THEME_CUSTOM,静默安装失效,您需要在自定义的 Activity 中自主实现静默下载,使用这种方式的时候建议 setShowNotification(false),这样基本上用户就会对下载无感知了
                .setCustomActivityClass(CustomActivity.class)//如果你选择的 UI 样式为 TypeConfig.UI_THEME_CUSTOM,那么你需要自定义一个 Activity 继承自 RootActivity,并参照 demo 实现功能,在此处填写自定义 Activity 的 class
                .setNeedFileMD5Check(false)//是否需要进行文件的 MD5 检验,如果开启需要提供文件本身正确的 MD5 校验码,DEMO 中提供了获取文件 MD5 检验码的工具页面,也提供了加密工具类 Md5Utils
                .setCustomDownloadConnectionCreator(new OkHttp3Connection.Creator(builder))//如果你想使用 okhttp 作为下载的载体,可以使用如下代码创建一个 OkHttpClient,并使用 demo 中提供的 OkHttp3Connection 构建一个 ConnectionCreator 传入,在这里可以配置信任所有的证书,可解决根证书不被信任导致无法下载 apk 的问题
                .setModelClass(new UpdateModel());
        //初始化
        AppUpdateUtils.init(this, updateConfig);

Step 4. Start using it wherever you want as below with 3 ways.

    //有三种方式实现 app 更新,您可选其中一种方式来进行,推荐使用第三种方式!
    //新增下载进度和 MD5 检测结果的回调监听 2019-10-22 18:51:19

    //第一种方式,使用 JSON 字符串,让 sdk 自主解析并实现功能
    String jsonData = "{\"versionCode\": 25,\"isForceUpdate\": 1,\"preBaselineCode\": 24,\"versionName\": \"v2.3.1\",\"downurl\": \"http://jokesimg.cretinzp.com/apk/app-release_231_jiagu_sign.apk\",\"updateLog\": \"1、优化细节和体验,更加稳定\n2、引入大量优质用户\r\n3、修复已知 bug\n4、风格修改\",\"size\": \"31338250\",\"hasAffectCodes\": \"1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24\"}";
    AppUpdateUtils.getInstance()
                        .addMd5CheckListener(...)
                        .addAppDownloadListener(...)
                        .checkUpdate(jsonData);

    //第二种方式,使用 MODEL 方式,组装好对应的 MODEL,传入 sdk 中
    DownloadInfo info = new DownloadInfo().setApkUrl("http://jokesimg.cretinzp.com/apk/app-release_231_jiagu_sign.apk")
            .setFileSize(31338250)
            .setProdVersionCode(25)
            .setProdVersionName("2.3.1")
            .setMd5Check("68919BF998C29DA3F5BD2C0346281AC0")
            .setForceUpdateFlag(listModel.isForceUpdate() ? 1 : 0)
            .setUpdateLog("1、优化细节和体验,更加稳定\n2、引入大量优质用户\r\n3、修复已知 bug\n4、风格修改");
    AppUpdateUtils.getInstance()
                        .addMd5CheckListener(...)
                        .addAppDownloadListener(...)
                        .checkUpdate(info);

    //第三种方式,在初始化的时候配置接口地址,sdk 自主请求+解析实现功能(推荐)
    AppUpdateUtils.getInstance()
                        .addMd5CheckListener(...)
                        .addAppDownloadListener(...)
                        .checkUpdate();

使用注意点

  • 最简单快捷的方式就是使用传入 MODEL 的形式,因为这种方式需要的配置最少,但是你需要自己处理请求,并保证最终调用 checkUpdate(model)的时候是在主线程。
  • 在使用传入 json 这种方式的时候,你需要同样保证调用 checkUpdate(json)的时候在主线程,并且你需要在初始化的时候配置 json 对应的 model【setModelClass(new UpdateModel())】,并保证这个 model 实现了 LibraryUpdateEntity 接口。
  • 在使用配置接口地址的方式的时候,您需要设置一个请求链接地址!当然,如果是需要的话,您需要设置请求方式,设置请求头和请求参数;并且你需要在初始化的时候配置请求成功之后返回的数据所对应的 model【setModelClass(new UpdateModel())】,并保证这个 model 实现了 LibraryUpdateEntity 接口。
  • 如果你需要自定义 UI,请自定义一个普通的 Activity 就可以了,这个 Activity 需要继承 RootActivity,这样你就拥有了自动更新的能力;另外建议给这个自定义的 Activity 添加一个主题@style/DialogActivityTheme,这样他就能以对话框的形式展示,据我们的 UI 说这样会好看点。

有什么意见或者建议欢迎与我交流,觉得不错欢迎 Star

使用过程中如果有什么问题或者建议,欢迎在 issue 中提出来或者直接联系我 mxnzp_life@163.com 嘿嘿!

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea