android 客户端增量更新

首先我们需要了解什么是增量更新,增量更新通俗点说就是客户端只需要下载新版本与旧版本的差分包,客户端再把差分包与旧版本进行合成得到一个新apk,在安装这个新的apk,这个新的apk其实新版本,实现更新,注意增量更新与热修复的区别。

原理大家可以查看:详情请见这篇文章Android 增量更新完全解析 是增量不是热修复

我们需要了解ndk,jni,以及.so如何生成,下面是我们windows的准备过程

1.下载bsdiff

  下载地址:http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz

  这里需要说明这个包中文件是做什么的:bsdiff.c和bspatch.c都是c文件,bsdiff.c是生成差分包所需要的调用的c文件,bspatch.c是差分包和旧的apk合成所需要的调用的c文件。

  我们下载bsdiff这个文件可以制作bsdiff和bspatch这两个工具,bsdiff这个工具是制作差分包的,bspatch这个工具是把差分包和旧的apk合成得到新apk的(这个合成的新的apk其实就是我们服务器的新apk)
  在这里我们不用制作有现成的,这是下载windows版本中这两个文件的地址http://download.csdn.net/detail/z191726501/9651809(在网上找到的,博文地址为http://blog.csdn.net/z191726501/article/details/52802104)。

2.下载bzip2这个文件

下载地址:http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz,这个文件其实就是压缩使用的。

准备工作做完了我们就可以开始了。

首先你可以按照我的步骤开始简单的感受下效果:

1.准备两个apk,当然是用一个项目下的。一个old.apk,一个是在旧的apk下修改代码生成新的new.apk;

2.下载上文提到的bsdiff和bspatch这两个工具的地址,并解压;

3.把old.apk和new.apk放到bsdiff和bspatch这两个工具的目录中,打开cmd命令行,进入该目录;

3.cmd命令行中生成old.apk和new.apk的增量文件old-to-new.patch,命令为“bsdiff old.apk new.apk old-to-new.patch”;

4.cmd命令行中使用增量文件old-to-new.patch和old.apk合并成新的new2.apk,命令为“bspathc old.apk new2.apk old-to-new.patch”。,这时候生成一个新的apk,运行这个新的apk,是不是和我们new.apk功能是一样的



下面我们讲怎么在项目中使用:

第一:生成.so 文件

1.配置ndk环境,网上很多资料

2.在bzip2文件中,将其中的.h和.c文件提取出来,然后可以选择连文件夹copy到我们module的app/main/jni下。

3.解压下载的bsdiff,将其中的bspatch.c也copy到我们module的app/main/jni下。

4.在app.gradle中,defaultConfig目录下加

    ndk {
       moduleName = ‘bsdiff‘
    }

5.建一个新类BsPatch,注意System.loadLibrary(“bsdiff”)中的bsdiff与上一步中的moduleName中的值bsdiff一样

public class BsPatch {

    static {
        System.loadLibrary("bsdiff");
    }

    public static native int bspatch(String oldApk, String newApk, String patch);
}

6.生成BsPatch这个类的头文件,网上很多资料,例如在Terminal中,切换到项目java目录下执行“javah -jni 包名.类名”,如下图:

7.在bspatch.c中修改#include

JNIEXPORT jint JNICALL Java_com_ce_utils_BsPatch_bspatch
        (JNIEnv *env, jclass cls,
         jstring old, jstring new, jstring patch){
    int argc = 4;
    char * argv[argc];
    argv[0] = "bspatch";
    argv[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));
    argv[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));
    argv[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));

    int ret = patchMethod(argc, argv);

    (*env)->ReleaseStringUTFChars(env, old, argv[1]);
    (*env)->ReleaseStringUTFChars(env, new, argv[2]);
    (*env)->ReleaseStringUTFChars(env, patch, argv[3]);
    return ret;
}

9.build中,Rebuild Project ,app\build\intermediates\ndk\debug\lib中可以看到生成的.so文件

10.我们现在就可以使用这个.so文件,这个.so文件就是bspatch.c的.so文件,我们在使用时一定要注意调用.so文件时的包名

**有两种方法生产.so,第一种是利用mk,第二种是利用ndk

mk编译需要写android.mk和application.mk以及在gradle中配置输出路径,如果不配置输出路径则在debug中,但是ndk只需要在gradle中写ndk的配置,输出在debug中**

第二步:新建项目使用.so文件

1.注意是新建项目,当然在上面使用的项目中也可以使用,只不过为了区分如何生成.so和使用.so文件,在AndroidMainfest.xml中加入权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

2.新建ApkExtract类:

public class ApkExtract {
    public static String extract(Context context) {
        context = context.getApplicationContext();
        ApplicationInfo applicationInfo = context.getApplicationInfo();
        String apkPath = applicationInfo.sourceDir;
        return apkPath;
    }

    public static void install(Context context, String apkPath) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setDataAndType(Uri.fromFile(new File(apkPath)),
                "application/vnd.android.package-archive");
        context.startActivity(i);
        android.os.Process.killProcess(android.os.Process.myPid());
    }

}

3.在MainActivity中:调用doBspatch的方法

 private void doBspatch() {
        final File destApk = new File(Environment.getExternalStorageDirectory(), "dest.apk");
        final File patch = new File(Environment.getExternalStorageDirectory(), "PATCH.patch");
        BsPatch.bspatch(ApkExtract.extract(this),
                destApk.getAbsolutePath(),
                patch.getAbsolutePath());
        if (destApk.exists())
            ApkExtract.install(this, destApk.getAbsolutePath());
    }

4.新建BsPatch类

public class BsPatch {

    static {
        System.loadLibrary("bsdiff");
    }

    public static native int bspatch(String oldApk, String newApk, String patch);

}

5.使用windows下bsdiff和bspatch的工具(http://download.csdn.net/detail/z191726501/9651809,上文中提到的),cmd命令行中生成old.apk和new.apk的增量文件old-to-new.patch,命令为“bsdiff old.apk new.apk old-to-new.patch”,得到差分包,把差分包放到手机sd卡根目录

6.运行当前apk得到old.apk,修改代码运行得到new.apk,记住old.apk和新apk的效果区别,然后手机装old.apk,将生成的patch差分包放入手机sd卡根目录,old.apk调用doBspatch()方法就可以看到效果了

时间: 2024-11-09 09:35:43

android 客户端增量更新的相关文章

开源 Android App 增量更新库 版本升级

开源 Android App 增量更新库 版本升级 经过几天的重构,我将之前写的一个Android 应用增量更新的示例程序重构为了一个开源库,现在已经push 到 GitHub 上,欢迎大家Watch.Star.Fork. 包含以下内容: 服务器端生成差异包的工程:AppUpdate 客户端使用的开源apk合并库:ApkPatchLibrary 引用ApkPatchLibrary,实现增量更新的ApkPatchLibraryDemo 旧版本的微博Android客户端,以及服务端生成的新旧微博差分

Android Apk增量更新

前言 有关APK更新的技术比较多,例如:增量更新.插件式开发.热修复.RN.静默安装. 下面简单介绍一下: 什么是增量更新?   增量更新就是原有app的基础上只更新发生变化的地方,其余保持原样. 与原来每次更新都要下载完整apk包的做法相比,这样做的好处显而易见:每次变化的地方总是比较少,因此更新包的体积就会小很多. 增量更新的流程   1.APP检测最新版本:把当前版本告诉服务端,服务端进行判断. 如果有新版本,服务端需要对当前版本的APK与最新版本的APK进行一次差分,产生patch差分文

【Android-功能】Android应用增量更新

很久没有更新博客了,真是堕落啊,几次想提起笔,却总是被各种琐事耽搁,以后会多写文章记录点滴. 背景 随着android应用体积的不断增大,以及应用版本发布的不断更迭,用户的升级成了一个问题,google也意识到不断更新应用对用户流量的损耗,在Google I/O 上提及的 Smart App update,即应用增量升级,或者叫做差分升级的做法,并在新版本的Google Play中得到支持,某天在和群友聊天是扯到这方面的话题,好奇就稍微研究了一下. 增量升级的原理 今天我们就来实现类似的应用的增

转 android客户端版本检测更新,服务下载,通知栏显示

看图, 只要点击取消或是下载完毕 通知才会消失!      代码是大部分是借用别人的,再自己修改,达到自己所需要的效果 xml文件 update.xml [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro

Android应用增量更新

Original:https://github.com/cundong/SmartAppUpdates Backup:https://github.com/eltld/SmartAppUpdates

使用Redis SortedSet实现增量更新

导读:前段时间有个需求是提供一个接口供客户端增量更新数据,当有数据被删除了以后客户端也需要感知到,并且要支持一定并发: 关键词:高并发,增量更新 前言 何谓增量更新,顾名思义就是只更新变化的部分,这样即经济(尤其对流量敏感型用户)又高效,比如微信朋友圈,微博的消息,头条推荐等等.要实现增量更新,首先要解决三个问题,1.如何识别数据的变化,2.如何识别增量更新的起始位置,3.如何感知数据被删除. 初步分析 首先说说如何识别数据的变化,简单来说就是每条记录都需要有一个版本信息,可能是时间戳或者是一个

最全的增量更新入门 包含linux端和Android

简介 增量更新大量用于 Android各大应用市场.本文想做网络上从服务器到app客户端完整讲解.app用eclipse和android studio 最新版cmark开发ndk 如下图: 以前一直好奇怎么做的直到知道了bsdiff库. 地址附上: bsdiff源码地址和简介 大家可以从简介看到bsdiff是基于bzip2源码(bsdiff和bspatch一个用于生成差异文件补丁,另一个用于差异文件和旧文件合成新文件) 下载地址说明 应用市场原理说明 假设你用的是"XXX市场"点击更新

Android 增量更新实例(Smart App Updates)

目录[-] 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 demo 自从 Android 4.1 开始,Google引入了应用程序的增量更新. 官方说明 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

转Android开发之增量更新

一.使用场景 apk升级,节省服务器和用户的流量 二.原理 自从 Android 4.1 开始, Google Play 引入了应用程序的增量更新功能,App使用该升级方式,可节省约2/3的流量. 现在国内主流的应用市场也都支持应用的增量更新了,最常见的应用宝省流量更新. 增量更新的原理,就是将手机上已安装apk与服务器端最新apk进行二进制对比,得到差分包(即两个版本的差异文件),用户更新程序时,只需要下载差分包,并在本地使用差分包与已安装apk,合成新版apk. 例如,当前手机中已安装微博V