Android增量更新

Android更新优化 - 增量更新是如何节省用户时间和流量的 最后聊一聊更新的具体逻辑。增量更新有固定数量法和固定业务法。你可以规定,相差版本小于等于3个,就采用增量更新,大于3个,直接走全量更新。此为固定数量法。固定业务法则是,版本分为大小版本号的更新,每个大版本必须走全量更新,而大版本中的小版本则采用增量更新。大版本采用强制更新,而小版本则可采用选择更新。每次更新到大版本,可能会再次拉取该版本的最终小版本的补丁文件发起二次更新。 阅读详情

1、 什么是增量更新

简单的说就是 apk 更新的时候 不需要下载 新版本apk 只需要下载 旧版本和新版的 差分包,在手机本地 通过 差分包和旧app 合成新的apk,避免版本更新重新下载 新版本apk,造成的流量消耗和下载等待,现在大多数应用商店都已经做了相应的增量更新,如果我们的apk在我们的服务器就需要我们自己去实现。

2、Android 实现增量更新

增量更新是借助bsdiff 一个开源库实现的,这个开源库是根据文件二进制去实现 文件的 差分 ,具体介绍可以查找官网介绍

1、下载源码

1.1、生成bsdiff可执行文件

修改项目中 CMakeLists.txt 文件,然后 build下工程 ,cmake-build-debug 目录下就会生成相应的 可执行文件

cmake_minimum_required(VERSION 3.16)

project(untitled1 C)

set(CMAKE_C_STANDARD 99)

aux_source_directory(bzip2 SOURCE)

include_directories(bzip2) # 批量添加文件

add_executable(bsdiff  bsdiff.c ${SOURCE})  # 生成可执行文件 

可以通过cmd 命令生成差分文件

 bsdiff  old文件  new文件  差分文件 
1.2、生成bspatch可执行文件

和生成bsdiff一样

cmake_minimum_required(VERSION 3.16)

project(untitled1 C)

set(CMAKE_C_STANDARD 99)

aux_source_directory(bzip2 SOURCE)

include_directories(bzip2) # 批量添加文件

add_executable(bspatch  bspatch.c ${SOURCE})  # 生成可执行文件 

可以通过cmd 命令生成新的文件

bsPatch  old文件  new文件  差分文件 

2、bspatch 合并功能合并到Android项目

通过命令生成差分文件 上传到后台,app通过下载对应版本的差分文件去合并成新的apk并安装,app需要用代码的方式去实现 差分合并

2.1 as新建C++ 工程

新建项目的时候选择C++工程即可

2.2 C 源码加到Android 工程 修改相关配置

之前github下载的 bzip2 和 bspatch.c 源文件 拷贝到 新建的Android C++ 工程中的cpp目录下需要配置CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.4.1)

aux_source_directory(bzip2 SOURCE)

add_library(
             native-lib
             SHARED
             native-lib.cpp
             bspatch.c
            ${SOURCE}
)

include_directories(bzip2)

find_library(
              log-lib
              log )


target_link_libraries(
                       native-lib
                       ${log-lib} ) 

修改之后同步下工程 Build–> Refresh Linked C++ Projects

2.3 编写java层代码和native方法

编写 获取旧app和差分文件,生成新app目录,安装apk代码

package com.zyb.testdiff;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.widget.Toast;

import androidx.core.content.FileProvider;

import java.io.File;

public class AppUpDateUtils {

    static {
        System.loadLibrary("native-lib");
    }

    public static void updataApk(Context context){
        // 0、获取旧的apk文件

        String oldApkPath=context.getApplicationInfo().sourceDir;

        //1、生成的apk文件
        File newFile=new File(context.getExternalFilesDir("apk"),"app.apk");


        //2、获取 增量更新包

        File patchFile = new File(context.getExternalFilesDir("apk"), "patch.apk");

        // 3\、 合成新的apk
           int code= patchFile(oldApkPath,newFile.getAbsolutePath(),patchFile.getAbsolutePath());

        // 4、安装新的apk
        if (code==0){
            installApk(context,newFile);
        }else {
            Toast.makeText(context,"增量更新失败",Toast.LENGTH_LONG).show();
        }

    }

    private static void installApk(Context context, File newFile) {

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 7.0+以上版本
            Uri apkUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", newFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(newFile), "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }

    public static native  int patchFile(String oldApkPath, String newApkPath, String patchPath);

} 
2.4 编写 JNI方法调用 bs库C代码
#include <jni.h>
#include <string>
#include <android/log.h>

extern "C"{
extern int patch(int argc, char *argv[]);
}

extern "C"
JNIEXPORT jint JNICALL
Java_com_zyb_testdiff_AppUpDateUtils_patchFile(JNIEnv *env,
                                                jclass clazz,
                                                jstring old_apk_path,
                                                jstring new_apk_path,
                                                jstring patch_path) {
    int argc=4;
    char * argv[4];
    argv[0]="bsPatch";
    argv[1]= const_cast<char *>(env->GetStringUTFChars(old_apk_path, NULL));
    argv[2]= const_cast<char *>(env->GetStringUTFChars(new_apk_path, NULL));
    argv[3]= const_cast<char *>(env->GetStringUTFChars(patch_path, NULL));
    int result=patch(argc,argv);
    env->ReleaseStringUTFChars(old_apk_path, argv[1]);
    env->ReleaseStringUTFChars(new_apk_path, argv[2]);
    env->ReleaseStringUTFChars(patch_path, argv[3]);
    return result;
} 
2.5 模拟升级

生成差分文件,放入本地目录测试升级

最后

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击扫描下方二维码免费领取~

android差异化更新(增量更新) 流程图: 待补充 解释: 1、把当前版本的versionName和versionCode发给服务器,服务器根据版本信息把后台的更新信息发给客户端; 2、判断是否有更新; 3、没有更新则结束,有更新则从服务器获取补丁包; 4、用补丁包和当前包合成新包; 5、验证新包签名是否成功; 6、验证成功则安装新包; 7、验证失败则提醒用户是否下载最新版本的整包; 8、直接下载整包的 阅读详情

相关推荐

漫谈Android 增量更新

在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对较高,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。而google为了解决了这个问题,提出了Smart App Update,即增量更新(也叫做差分升级)。尽管现在网络环境有了很大的提升,但一个不争的事实就是应用越做越大,因此,增量更新在目前的仍然是一种解决APP更新包过大的有效方案。

Floating Cat 2万+

Android增量更新方案

背景 咱们的App由于业务原因安装包尺寸日益加大,目前掌上炫舞已经170M、梦工厂也已经120M+,用户下载成本加大。 什么是增量更新? 增量更新的关键在于增量一词。平时我们的开发过程,往往都是今天在昨天的基础上修改一些代码,app的更新也是类似的,往往都是在旧版本的app上进行修改。这样看来,增量更新就是原有app的基础上只更新发生变化的地方,其余保持原样。 与之前每次更新都要下载完整apk包的做法相比,这样做的好处显而易见,每次变化的地方总是比较少的,因此更新包的体积就会小很多。...

cplasf2012的博客 3187

Android之增量更新详解

前言:自从 Android 4.1 开始, Google Play 引入了应用程序的增量更新功能,App使用该升级方式,可节省约2/3的流量。现在国内主流的应用市场也都支持应用的增量更新了,最常见的应用宝省流量更新。 什么是增量更新? 增量更新的关键在于增量一词。平时我们的开发过程,往往都是今天在昨天的基础上修改一些代码,app的更新也是类似的:往往都是在旧版本的app上进行修改。这样看来...

蒙的博客 1万+

手把手带你实现Android增量更新

当我们开发完一个项目之后,上线维护 , 增加新功能 , 添加第三方库 , APK大小从4 - 5M , 增长到10+M , 用户由原来的几十秒下载 , 到现在几分钟以上的下载 , 网络情况不好的时候 , 或许就是十分钟不等。如果是多个文件都需要进行声明,显然一条条的声明太麻烦了,所以可以在属性中声明,所有的文件都适用。看这么多文件 , 还有一些乱七八糟的不知道什么的文件 , 那么我们只关注 , 我们想要的文件 , 将C/C++源文件以及.h头文件,找出来 ,放到一个干净的文件夹中。

老皮的博客 857

详解Android增量更新

一、Android 增量更新简介 首先需要明确,Android增量更新与热修复是不同的技术概念。 热修复一般是用于当已经发布的app有Bug需要修复的时候,开发者修改代码并发布补丁,让应用能够在不需要重新安装的情况下实现更新,主流方案有Tinker、AndFix等。 而增量更新的目的是为了减少更新app所需要下载的包体积大小,常见如手机端游戏,apk包体积为几百M,但有时更新只需下载十几M的安装包...

weixin_45258969的博客 873

android增量更新

今天学习了一下增量更新,这个技术已经出现很长时间了,但是现实中,估计只有大厂才利用了这一技术在做产品! 国内有些第三方服务平台,像友盟提供自动更新的服务,也是用的增量方式! 其他的像QQ,Sina微博,陌陌,蘑菇街等都用到了,解压一下它们的apk,看一下lib目录: QQ:libbspatch.so 微博:libbsdiffjni.so 陌陌:libbsdiff.so 蘑菇街:libpa

shonegg的技术人生 1933

Android安卓开发高级应用-软件更新(联网-全更新&增量更新)

实现Android安卓开发中APP升级的联网全更新、增量更新

weixin_53743049的博客 729

Android 增量更新完全解析 是增量不是热修复

解决了上述3个问题,就ok了。下面开始解决,首先我们看下增量文件的生成与合并,这个环节可以说是整个流程的核心,也是技术难点,值得开心的是,这个技术难点已经有工具替我们实现了。二、增量文件的生成与合并这个其实就是利用工具做二进制的一个diff和patch了。对了,本文环境为mac,其他系统如果阻碍,慢慢搜索解决即可。下载好了,解压,切到对应的目录,然后执行make:恩,你没看错,报错了,这个错误还比较好解决。

2501_90222587的博客 935

Android增量更新流程讲解

为什么需要增量更新:节省流量,节省流量,节省流量,重要的事情说三遍!    增量更新不仅可以让用户在客户端实现省流量更新,更重要的是增量更新还可以实现服务器端流量的节省,为网站节省成本。增量更新的原理    服务端将应用的旧版本Apk与新版本Apk做差分处理,得到新版APK更新部分的差分包,例如旧版本的APK有6M,新版的有10M,更新的部分则可能只有4M左右(这4M文件除了包含更新内容以外,还包含

Android研发专栏 6662

Android增量更新——bsdiff&bspatch

为了节省流量,增量更新应运而生,用这篇文章来记录下运用patch差分包的形式实现无脑增量更新。为了方便,就将生成差分包和差分包与旧apk合并这两个过程都放在安卓机上完成...

lebron的博客 7372

Android中增量更新

Android中增量更新:差分包的生成与合并,内含封装好的android端项目中差分包合并使用的so库

android studio增量更新包,Android增量更新

首先增量更新应该了解个概念:增量更新:在版本较近的apk升级的时候,根据两个apk之间的差异(生成差异包),合成新的安装包,在应用内部进行升级的一种操作(需要重新安装apk文件)。热更新:在发布的版本有BUG的时候,动态加载dex文件,在不影响apk的情况下进行修复BUG(不需要重新安装apk文件)。所以从本质上增量更新和热更新是不同的!这个概念要明确。。。本文知识点:android 增量更新的一...

weixin_39765290的博客 503

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

android studio增量更新失败,android 增量更新

android增量更新android 4.1开始 google引入了应用程序的增量更新。增量更新的原理实际上是使用服务器最新的apk进行对比,并得到罪行的差分包,当应用程序需要更新是,下载差分包就好了,通过它和现在本机上的版本形成一个新的apk服务端形成差分包拆分包可以在服务端生成,用的是在网上找的一个例子SmartAppUpdates-master当然,我没有编译java服务端的例子,又在网上找...

weixin_34234741的博客 430

qcom bypass node介绍

介绍qcom bypass node,以及如何让其生效

haodada1226的博客 2045

手把手带你编写miniQMT实盘量化执行程序(3) | 交易系统

本文介绍了miniQMT实盘量化执行系统的核心交易系统代码,重点讲解了其模块化设计和工作流程。系统采用主控类LiveSystem管理交易全流程,包含初始化引擎、交易日判断、交易时段划分(开盘前、盘中、收盘等)、主循环调度和异常处理等核心功能。作者详细解析了系统如何实现365天不间断运行、精准判断交易日、分阶段执行交易策略等功能,并强调系统的稳定性和异常处理机制。

1307

Android 如何实现增量更新

什么是增量更新? 现在的APP安装包体积越来越大,几百兆甚至上G的,当版本更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App Updates更新机制,就能实现APP的更新了。 用户手机上已经安装着某个APP,然后只需下载一个增量包,手机上的APP和增量包合并生成完整的新APP,并引导用户安装,这个过程就是增量更新。 很多APP都采用了谷歌Smart App Updates更新机制,例如 :微信,支付宝,Play商店,豌豆荚等等。谷歌官方称

yanhuomatou2015的博客 4100

python数据处理与分析案例,python如何进行数据处理

大家好,本文将围绕基于python的数据处理案例展开说明,python数据处理与分析案例是一个很多人都想弄明白的事情,想搞清楚python如何进行数据处理需要先了解以下几个事情。大家好,小编来为大家解答以下问题,python数据处理案例步骤及其代码,python数据处理与分析教程,今天让我们一起来看看吧!哈喽~今天学习记录的是数据分析实训小案例。就用这个案例来好好巩固一下 python 数据分析三剑客。

a17348的博客 1240

android 官方增量更新,Android 如何实现增量更新

什么是增量更新?现在的APP安装包体积越来越大,几百兆甚至上G的,当APP更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App Updates更新机制,就能实现APP的更新了。用户手机上已经安装着某个APP,然后只需下载一个增量包,手机上的APP和增量包合并生成完整的新APP,并引导用户安装,这个过程就是增量更新。很多APP都采用...

weixin_29058331的博客 480

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1113

【声纳与人工智能融合——从理论前沿到自主系统实战】第一章 声纳AI的数据基础:仿真、数据集与表征学习

该数据集的特点是包含了多种底质背景(沙地、泥地、碎石区)与噪声条件,适合验证模型的背景抑制能力。Urashima数据集由日本海洋研究开发机构(JAMSTEC)发布,基于自主水下航行器(AUV)采集,包含前视声纳序列数据,主要用于水下导航与避障算法评估,其数据包含了精确的姿态与深度标注,支持三维场景重建算法的训练。北约海洋研究与实验中心(CMRE)发布的CMRE datasets包含侧扫与合成孔径声纳数据,特别适用于跨传感器域自适应研究,数据集中包含了同一区域的多种声纳成像结果,为跨模态学习提供了基准。

u012133341的博客 103
上一篇: 【Android TextView】图标下文字的显示
下一篇: 【Android】一文读懂 Activity 的生命周期
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值