Android 增量更新
简述
因为有Android apk 增量更新的项目,以前对此一窍不通,踩了不少坑,记录下来,希望可以给像我这样的纯“萌新”有点帮助。
首先介绍一下增量更新,在以前更新一个软件需要将一个软件的完整的安装包都下载下来,然后卸载原先的软件,安装新的安装包就可以了,但是这样会浪费大量的流量,下载也比较费时,因此后面出来了增量跟新的概念,简而言之,将新更新的包和原有包的差距找出来,然后只下载这个“差距”,在手机上再将包合成就可以了。
生成差分包
首先是获取apk,这个可以豌豆荚官网上获取到最新的安装包,和较旧的安装包。
生成差分包,可以直接再服务器上直接生成
sudo apk install bsdiff
bsdiff old.apk new.apk update.patch
将差分包导入手机
首先找到adb.exe,这个是我的目录,如果不知道自己的SDK安装在哪,建议安装一个Everything来查找。
然后添加环境变量
然后打开cmd , 输入adb就可以看到是否成功。紧接着使用下面的命令就可以将数据导入手机,这时候可以在Android中找到相应的安装包,先直接在手机上将旧的软件安装。
adb push file /sdcard/
但是在这地方会出现问题, 我从豌豆荚中获取的apk包只能在api30的安卓虚拟机上安装成功,其他的即使是api29都会失败,因此我是使用自己随便写了个app,然后使用Android studio 来生成apk
在客户端合成
经过上面的步骤,我们在手机应该已经有了旧的软件以及差分包。
这时候就需要将旧包和差分包合成新包然后安装就可以了。
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
后续
具体代码,这两天完善下上传GitHub。
本文地址:https://blog.csdn.net/weixin_43699230/article/details/107598552
推荐阅读
-
Android studio中怎么把代码类转换为静态?
-
Android Studio虚拟机启动的解决办法
-
Android studio不同分辨率的图标该怎么创建?
-
Android studio怎么使用代码检查工具Analyze?
-
android studio怎么设置android Logcat字体颜色?
-
如何阻止Internet Explorer更新为IE10(通过注册表实现)
-
Android studio快捷键怎么修改?
-
Android studio创建多语言ResouuceBundle文件的详细教程
-
Android studio怎么开启代码自动补全?
-
详解WordPress中用于更新和获取用户选项数据的PHP函数