当前位置: 首页 > 编程笔记 >

Android App增量更新详解及实例代码

索曾琪
2023-03-14
本文向大家介绍Android App增量更新详解及实例代码,包括了Android App增量更新详解及实例代码的使用技巧和注意事项,需要的朋友参考一下

Android App增量更新实例--Smart App Updates

       介绍

  你所看到的,是一个用于Android应用程序增量更新的开源库。

  包括客户端、服务端两部分代码。

  原理

  自从 Android 4.1 开始,Google引入了应用程序的增量更新。

  Link: http://developer.android.com/about/versions/jelly-bean.html

Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices. When developers publish an update, Google Play now delivers only the bits that have changed to devices, rather than the entire APK. This makes the updates much lighter-weight in most cases, so they are faster to download, save the device's battery, and conserve bandwidth usage on users' mobile data plan. On average, a smart app update is about 1/3 the sizeof a full APK update.

  增量更新的原理非常简单,就是将手机上已安装apk与服务器端最新apk进行二进制对比,并得到差分包,用户更新程序时,只需要下载差分包,并在本地使用差分包与已安装apk,合成新版apk。

  例如,当前手机中已安装微博V1,大小为12.8MB,现在微博发布了最新版V2,大小为15.4MB,我们对两个版本的apk文件查分比对之后,发现差异只有3M,那么用户就只需要要下载一个3M的差分包,使用旧版apk与这个差分包,合成得到一个新版本apk,提醒用户安装即可,不需要整包下载15.4M的微博V2版apk。

  apk文件的差分、合成,可以通过开源的二进制比较工具bsdiff来实现(Link:http://www.daemonology.net/bsdiff/)

  因为bsdiff依赖bzip2,所以我们还需要用到bzip2(Link:http://www.bzip.org/downloads.html)

  bsdiff中,bsdiff.c用于生成查分包,bspatch.c用于合成文件。

  接下来,我们分开说,需要做3件事。

  1.在服务器端,生成这两个版本微博的差分包;

  2.在手机客户端,使用已安装的旧版apk与这个差分包,合成为一个新版微博apk;

  3.校验新合成的微博客户端文件是否完成,签名时候和已安装客户端一致,如一致,提示用户安装。

  过程分析

  1 生成差分包

  这一步需要在服务器端来实现,一般来说,每当apk有新版本需要提示用户升级,都需要运营人员在后台管理端上传新apk,上传时就应该由程序生成之前所有旧版本们与最新版的差分包。

  例如: 你的apk已经发布了3个版,V1.0、V2.0、V3.0,这时候你要在后台发布V4.0,那么,当你在服务器上传最新的V4.0包时,服务器端就应该立即生成以下差分包:

  V1.0 ——> V4.0的差分包;

  V2.0 ——> V4.0的差分包;

  V3.0 ——> V4.0的差分包;

  ApkPatchLibraryServer工程即为Java语言实现的服务器端查分程序。

  下面对ApkPatchLibraryServer做一些简单说明:

  1.1 C部分

  ApkPatchLibraryServer/jni 中,除了以下4个:

  com_cundong_utils_DiffUtils.c com_cundong_utils_DiffUtils.h com_cundong_utils_PatchUtils.c com_cundong_utils_PatchUtils.h

  全部来自bzip。

  com_cundong_utils_DiffUtils.c com_cundong_utils_DiffUtils.h

  用于生成差分包。

  com_cundong_utils_PatchUtils.c com_cundong_utils_PatchUtils.h

  用于合成新apk文件。

  其中,com_cundong_utils_DiffUtils.c修改自 bsdiff/bsdiff.c,com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。

  我们在需要将jni中的C文件,build输出为动态链接库,以供Java调用(Window环境下生成的文件名为libApkPatchLibraryServer.dll,Unix-like系统下为libApkPatchLibraryServer.so,OSX下为libApkPatchLibraryServer.dylib)。

  Build成功后,将该动态链接库文件,加入环境变量,供Java语言调用。

  1.2 Java部分

  com.cundong.utils包,为调用C语言的Java实现; com.cundong.apkdiff包,为apk查分程序的Demo; com.cundong.apkpatch包,为apk合并程序的Demo;

  调用com.cundong.utils.DiffUtils中genDiff()方法,可以通过传入的新旧apk路径,得到差分包。

Java代码

/** 
 * 类说明:   apk diff 工具类 
 * 
 * @author Cundong 
 * @date  2013-9-6 
 * @version 1.0 
 */ 
public class DiffUtils { 
  
  /** 
   * 本地方法 比较路径为oldPath的apk与newPath的apk之间差异,并生成patch包,存储于patchPath 
   * 
   * @param oldPath 
   * @param newPath 
   * @param patchPath 
   * @return 
   */ 
  public static native int genDiff(String oldApkPath, String newApkPath, String patchPath); 
} 

  调用com.cundong.utils.PatchUtils中patch()方法,可以通过旧apk与差分包,合成为新apk。

Java代码

/** 
 * 类说明:  APK Patch工具类 
 * 
 * @author Cundong 
 * @date  2013-9-6 
 * @version 1.0 
 */ 
public class PatchUtils { 
 
  /** 
   * native方法 
   * 使用路径为oldApkPath的apk与路径为patchPath的补丁包,合成新的apk,并存储于newApkPath 
   * @param oldApkPath 
   * @param newApkPath 
   * @param patchPath 
   * @return 
   */ 
  public static native int patch(String oldApkPath, String newApkPath, 
      String patchPath); 
} 

  2.使用旧版apk与差分包,在客户端合成新apk

  需要在手机客户端实现,ApkPatchLibrary工程封装了这个过程。

  2.1 C部分

  ApkPatchLibrary/jni/bzip2目录中所有文件都来自bzip2项目。

  ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c、ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c实现文件的合并过程,其中com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。

  我们需要用NDK编译出一个libApkPatchLibrary.so文件,生成的so文件位于libs/armeabi/ 下,其他 Android 工程便可以使用该libApkPatchLibrary.so文件来合成apk。

  2.2 Java部分

  com.cundong.utils包,为调用C语言的Java实现;

  调用,com.cundong.utils.PatchUtils中patch()方法,可以通过旧apk与差分包,合成为新apk。

Java代码

/** 
 * 类说明:  APK Patch工具类 
 * 
 * @author Cundong 
 * @date  2013-9-6 
 * @version 1.0 
 */ 
public class PatchUtils { 
 
  /** 
   * native方法 
   * 使用路径为oldApkPath的apk与路径为patchPath的补丁包,合成新的apk,并存储于newApkPath 
   * @param oldApkPath 
   * @param newApkPath 
   * @param patchPath 
   * @return 
   */ 
  public static native int patch(String oldApkPath, String newApkPath, 
      String patchPath); 
} 

  3.校验新合成的apk文件

  新包和成之后,还需要对客户端合成的apk包与最新版本apk包进行MD5或SHA1校验,如果校验码不一致,说明合成过程有问题,新合成的包将不能被安装。

  注意事项

  增量更新的前提条件,是在手机客户端能让我们读取到当前应用程序安装后的源apk,如果获取不到源apk,那么就无法进行增量更新了。

  另外,如果你的应用程序不是很大,比如只有2、3M,那么完全没有必要使用增量更新,增量更新适用于apk包比较大的情况,比如游戏客户端。

  GitHub地址

  GitHub:https://github.com/cundong/SmartAppUpdates

  一些说明

  源码中,包含以下文件:

  1.ApkPatchLibraryServer:Java语言实现的,服务器端生成差分包工程;

  2.ApkPatchLibrary:客户端使用的apk合成库;

  3.ApkPatchLibraryDemo:引用ApkPatchLibrary Library 的Demo,以新浪微博客户端的升级为例,假设手机上安装的是V4.5.0,最新版是V4.5.5,用户需要从V4.5.0升级到V4.5.5。

  4.TestApk:用于测试的,旧版本的微博客户端,以及使用ApkPatchLibraryServer生成的新旧新浪微博差分包。

         通过此文,希望能帮助到有需要的朋友,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍Java Annotation详解及实例代码,包括了Java Annotation详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 一、Annotation简介 从Java1.5开始,Java增加了元数据(MetaData)的支持,也就是Annotation(注释); Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据; Annotation不能影响程序代

  • 本文向大家介绍java HashMap详解及实例代码,包括了java HashMap详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 java HashMap  Map集合的遍历 方式1,根据键查询值 获取所有键的集合 遍历键的集合,获取每一个键 根据键,查询值 方式2,根据键值对的对象查询键和值 获取所有键值对的对象的集合 遍历键值对的对象的集合,获取到每一个键值对的对象 根据键值对的对象

  • 本文向大家介绍ReactNative Alert详解及实例代码,包括了ReactNative Alert详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 Alert顾名思义一就是一个警告框,一般使用情况比如:退出登录,清楚缓存,提示修改密码等等。。。ReactNative中的Alert只有一个静态方法alert()其中有四个参数:标题,信息,按钮和按钮类型 在Android按钮至多有三个 下

  • 本文向大家介绍Angularjs CURD 详解及实例代码,包括了Angularjs CURD 详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 Angularjs CURD 前言        基于一个手机端的项目使用了angularjs,硬着头皮去用,有很多的疑问还需要一一去验证,刚开始总是感觉找不到北,总是感觉有很多概念,而且似乎ng既夹杂MVC又夹杂MVVM的思想, 忙里偷闲敲了个简

  • 本文向大家介绍java 实现 stack详解及实例代码,包括了java 实现 stack详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 栈是限制插入和删除只能在一个位置上进行的 List,该位置是 List 的末端,叫做栈的顶(top),对于栈的基本操作有 push 和 pop,前者是插入,后者是删除。 栈也是 FIFO 表。 栈的实现有两种,一种是使用数组,一种是使用链表。 栈的应用 平

  • 本文向大家介绍Android 混淆代码详解及实例,包括了Android 混淆代码详解及实例的使用技巧和注意事项,需要的朋友参考一下 为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,下面来总结以下混淆代码的步骤: 1. 大家也许都注意到新建一个工程会看到项目下边有这样proguard-project.txt一个文件,这个对混淆代码很重要,如果你不小心删掉了,没关系,从其他地方拷贝一个过