欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 增量更新

程序员文章站 2022-06-24 18:30:17
@Android 增量更新简述因为有Android apk 增量更新的项目,以前对此一窍不通,踩了不少坑,记录下来,希望可以给像我这样的纯“萌新”有点帮助。首先介绍一下增量更新,在以前更新一个软件需要将一个软件的完整的安装包都下载下来,然后卸载原先的软件,安装新的安装包就可以了,但是这样会浪费大量的流量,下载也比较费时,因此后面出来了增量跟新的概念,简而言之,将新更新的包和原有包的差距找出来,然后只下载这个“差距”,在手机上再将包合成就可以了。生成差分包首先是获取apk,这个可以豌豆荚官网上获取到...

@Android 增量更新

简述

因为有Android apk 增量更新的项目,以前对此一窍不通,踩了不少坑,记录下来,希望可以给像我这样的纯“萌新”有点帮助。
首先介绍一下增量更新,在以前更新一个软件需要将一个软件的完整的安装包都下载下来,然后卸载原先的软件,安装新的安装包就可以了,但是这样会浪费大量的流量,下载也比较费时,因此后面出来了增量跟新的概念,简而言之,将新更新的包和原有包的差距找出来,然后只下载这个“差距”,在手机上再将包合成就可以了。

生成差分包

首先是获取apk,这个可以豌豆荚官网上获取到最新的安装包,和较旧的安装包。
生成差分包,可以直接再服务器上直接生成

sudo apk install bsdiff
bsdiff old.apk new.apk update.patch

将差分包导入手机

首先找到adb.exe,这个是我的目录,如果不知道自己的SDK安装在哪,建议安装一个Everything来查找。
Android 增量更新
然后添加环境变量
Android 增量更新
Android 增量更新
然后打开cmd , 输入adb就可以看到是否成功。紧接着使用下面的命令就可以将数据导入手机,这时候可以在Android中找到相应的安装包,先直接在手机上将旧的软件安装。

adb push file /sdcard/

但是在这地方会出现问题, 我从豌豆荚中获取的apk包只能在api30的安卓虚拟机上安装成功,其他的即使是api29都会失败,因此我是使用自己随便写了个app,然后使用Android studio 来生成apk
Android 增量更新
Android 增量更新

在客户端合成

经过上面的步骤,我们在手机应该已经有了旧的软件以及差分包。
这时候就需要将旧包和差分包合成新包然后安装就可以了。

        val pkm:PackageManager = packageManager
        val appInfo = pkm.getApplicationInfo("com.example.myapplication", 0)
        var oldPath = appInfo.sourceDir

上面代码可以获取到旧的软件的安装包,而那个安装包的名称,可以通过下面的命令获取,一定要保证软件在运行,而不是在后台。

合成包的操作如下所示

1. 在project的build.gradle添加如下代码(如下图)
allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}


2. 在Module的build.gradle添加依赖(如下图)
compile 'com.github.jiyouliang2:SmartUpdateDemo:1.0.1'


3.添加权限
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4.代码中使用
 PatchUtil.patch(旧版本, 新版本, 差分包);
adb shell dumpsys window w |findstr \/ |findstr name=

这个是用来安装apk, 至于为什么要这样,建议大家看一下这个:
Android7后代码安装apk

doAsync {
            val intent = Intent()
            intent.action = "android.intent.action.VIEW"
            intent.addCategory("android.intent.category.DEFAULT")
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


            val uri = FileProvider.getUriForFile(this@MainActivity,    "com.example.smartupdate.fileProvider", newpath);
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");

            startActivity(intent);

        }

需要注意的点

对于安装的app一定要打开这个软件这个选项,因为不经常使用安卓手机,就这个选项浪费了我一个周六!!!,如果不打开这个选项,每一次都是报错:There is a problem parsing the package
Android 增量更新

后续

具体代码,这两天完善下上传GitHub。

本文地址:https://blog.csdn.net/weixin_43699230/article/details/107598552