美文网首页AndroidAndroid
一款安装包升级管理工具库ApkUpdater

一款安装包升级管理工具库ApkUpdater

作者: 蜗牛学开车 | 来源:发表于2020-09-07 14:20 被阅读0次

简介

1.基于DownLoadManager实现,支持断点续传。
2.安装包自动缓存、删除。如果下载完成后用户没有安装,那么下次则直接自动跳过下载。安装成功后会自动删除之前的安装包。
3.支持安装包完整性校验,目前支持MD5和SHA1校验,用与解决网络环境不好时导致下载丢包,从而导致一直提示安装包无效的问题。
4.支持自定义弹窗(提供了默认的弹窗),如果你不喜欢默认提供的弹窗,那么你可以自定义。
5.从3.0.0版本开始改为纯Kotlin实现并基于Androidx库。

演示

按照惯例还是先上图吧。


默认弹窗样式

更新

3.0.1 将DefaultUpdateDialog改为open(可以被继承)。

将DefaultUpdateDialog改为open(可以被继承),这将使得自定义弹窗更加容易,你可以直接继承DefaultUpdateDialog来自定义你的弹窗。

3.0.0 基于Kotlin和Androidx重构

  1. 基于Kotlin语言进行重构并迁移至Androidx。没有迁移至Androidx的小伙伴请使用之前的版本。
  2. 优化升级弹窗的逻辑,使得自定义弹窗更加容易。

2.2.3及以前

基于Java、Support库开发,可自定义弹窗、支持完整性校验、自动缓存。

下载

第一步:添加 JitPack 仓库到你项目根目录的 gradle 文件中。

allprojects {
    repositories {
        //省略部分代码...
        maven { url 'https://jitpack.io' }
    }
}

第二步:添加这个依赖。

dependencies {
    implementation 'com.github.kelinZhou:ApkUpdater:${Last version here!}'
}

使用

第一步:添加权限

你需要在你的清单文件中添加以下权限:

    <!--网络访问权限-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--不弹出通知栏权限-->
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
    <!--DownloadManager-->
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <!--获取网络状态权限-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--APK安装权限-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

第二步:清单文件配置

你需要在你清单文件中的Application节点下添加如下配置:

<!--Android7.0一上安装Apk所需要的文件提供者-->
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileProvider" 
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/apk_updater_file_paths" />
</provider>

<!--版本更新服务-->
<service android:name="com.kelin.apkUpdater.DownloadService" />

provider标签中android:authorities的值可以自定义,需要在初始化ApkUpdater.init(context,fileProvider)方法中传入该值。

在Android7.0以上的设备如果不能正常下载你可能还需要在清单文件的Application节点下增加networkSecurityConfig配置。例如:

<application
        android:name=".App"
        android:networkSecurityConfig="@xml/network_security_config">

        <!--此处省略了你的Activity、Service等四大组件-->
        
</application>

其中 network_security_config 文件需要定义在res的xml文件夹下,它的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

第三步:初始化

你需要在Application的onCreate方法中调用ApkUpdater.init(context, fileProvider)初始化ApkUpdater。例如:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        ApkUpdater.init(this, "$packageName.fileProvider")
    }
}

注意: 别忘记在清单文件中使用你的Application:

<application
        android:name=".App"  //这里是你自定义的Application。
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <!--此处省略了你的Activity、Service等四大组件-->
        
</application>

第五步:检测更新

首先利用你项目的网络访问能力从服务器端获取更新信息并转换为javaBean对象,然后让这个对象实现UpdateInfo接口。下面是这个接口中所有方法:

ApkUpdater.Builder().create().check(
    UpdateInfoImpl(
            "http://test-cloud-yxholding-com.oss-cn-shanghai.aliyuncs.com/yx-logistics/file/file/20200703/1593709201374.apk", //安装包下载地址
            131, //网络上的版本号,用于判断是否可以更新(是否大于本地版本号)。
            "v1.3.1", //版本名称,用于显示在弹窗中,以告知用户将要更到哪个版本。
            false,  //是否是强制更新,如果干参数为true则用户没有进行更新就不能继续使用App。(当旧版本存在严重的Bug时或新功能不与旧版兼容时使用)
            "更新内容如下:",  //升级弹窗的标题。
            "1.修复了极端情况下可能导致下单失败的bug。\n2.增加了许多新的玩法,并且增加了app的稳定性。 \n3.这是测试内容,其实什么都没有更新。", //升级弹窗的消息内容,用于告知用户本次更新的内容。
            SignatureType.MD5, //安装包完整性校验开启,并使用MD5进行校验,如果不想开启,传null。(目前只支持MD5和SHA1)
            ""  //完成性校验的具体值,返回空或null则不会进行校验。
    )
)

其他

构建Updater对象

方法名 说明
setCallback(callback: IUpdateCallback?) 设置监听对象。
setDialogGenerator(generator: (updater: ApkUpdater) -> ApkUpdateDialog) 使用自定义弹窗。
create() 完成Updater对象的构建。

自定义Dialog

ApkUpdater.Builder()
        .setDialogGenerator {
            MyUpdateDialog(it)
        }.create()

MyUpdateDialog 是ApkUpdateDialog接口的实现类,也可以直接继承DefaultUpdateDialog。ApkUpdateDialog接口中都有注释,写的应该还算比较详细的,这里就不在讲了。

检查更新

检查更新的代码如下:

apkUpdater.check(updateInfo)

安装APK

安装是不许要你关心的,下载完成后会自动进入安装页面。除非你禁用了自动安装,或是想安装一个现有的Apk。如果是这样的话你可以使用UpdateHelperfun installApk(context: Context, apkFile: File?): Boolean方法。

其他

该项目中提供了两个工具类:UpdateHelper 和 NetWorkStateUtil。


如果需要源码请点击这里,如果你觉得有用就给个免费的Star支持一下。你的支持将是我继续创作的动力。

相关文章

网友评论

    本文标题:一款安装包升级管理工具库ApkUpdater

    本文链接:https://www.haomeiwen.com/subject/llakektx.html