全网最简单的Android差异化更新实现

我们来完成一个简单的一B,没那么多学术问题的Android增量更新的实现。
对,你没看错,今天没有图!因为太简单了,什么?你不会NDK?看完了本篇你照样可以实现增量更新!

首先我们先说下原理:
用户安装的APK和新版本APK存在着diff差异,通过diff工具可以生成一个新版本与旧版本差异的文件,将新版本和旧版本的差异合并,就成了新版本的APK。(不到100字)

我先介绍下我们的小伙伴
1.bsdiff 开源工具 http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz
2.bzip2 开源工具 http://pan.baidu.com/s/1dE4Tr2p (已经整理好!)
3.以上都是c源码! 当然我已经准备了一个在windows下编译好的exe文件(你别问我为什么只给Windows的!因为我的是Windows系统!咋的?),到时候我们需要使用这个exe文件来生成差异包
http://pan.baidu.com/s/1nvyh8N3

实现步骤:
1.将你的老版本APK与新版本的APK放在同一个目录下。
2.使用我网盘里面提供的dif工具来生成差异包
命令行走起:bsdiff.exe oldfile newfile patchfile ;老版本文件名,新版本文件名,差异文件名。对,回车之后等一会,生成了一个差异文件。
3.上NDK走起!(OK如果你对NDK一点不懂那么请继续看,如果你是神,那么请走开啦!)创建一个AndroidStudio项目,一定要勾选支持C++。
4.我们在cpp目录下来创建一个c文件,叫 native-lib.c
5.将CMakeLists.txt中的native-lib.cpp修改为native-lib.c(没记错的话应该是在21行)
5.在Activity中创建一个native方法

public native void fkDiff(String oldFile,String newFile,String patchFile);

6.在上面的方法上面按下Alt+Enter 创建ndk的方法。
7.将bzip2的源代码复制到cpp目录下。
8.将bspatch.c中的所有代码复制到 native-lib.c中的 fkDiff方法的上面(注意是上面,上面)
9.复制下面的头文件列表覆盖你的 native-lib.c中的头文件列表(不要问为什么照做就是了)

#include "bzip2/bzlib.c"
#include "bzip2/crctable.c"
#include "bzip2/compress.c"
#include "bzip2/decompress.c"
#include "bzip2/randtable.c"
#include "bzip2/blocksort.c"
#include "bzip2/huffman.c"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <err.h>
#include <unistd.h>
#include <fcntl.h>
#include <jni.h>

10.在native-lib.c中搜索main函数,将main函数改个名字,比如我改成 fkDiffPatch
11.让我们来写几行NDK的代码在你的fkDiff函数里面

    char *oldFile =(char *) (*env)->GetStringUTFChars(env, oldFile_, 0);
    char *newFile = (char *)(*env)->GetStringUTFChars(env, newFile_, 0);
    char *patchFile = (char *)(*env)->GetStringUTFChars(env, patchFile_, 0);
    char *comm = "bspatch";
    int argc = 4;
    char *argv[argc];
    argv[0] = comm;
    argv[1] = oldFile;
    argv[2] = newFile;
    argv[3] = patchFile;

     /**
      调用我们修改过名字的函数
      如果这几行代码你看不懂那么我简单说下,我们将main函数的命令行参数
      传进去而已,而且我们把main函数的名字改了啊!
    **/
    fkDiffPatch(argc,argv);

    (*env)->ReleaseStringUTFChars(env, oldFile_, oldFile);
    (*env)->ReleaseStringUTFChars(env, newFile_, newFile);
    (*env)->ReleaseStringUTFChars(env, patchFile_, patchFile);

12.将我们生成的差异文件,push到sdcard中。在Activity中通过一个方法来获取我们Apk的安装路径

public static String getApkFilePath(Context context, String packageName) {
    
        try {
            ApplicationInfo appInfo = context.getPackageManager()
                    .getApplicationInfo(packageName, 0);
            return appInfo.sourceDir;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

13.在Activity中调用fkDiff的native方法

fkDiff(getApkFilePath(Context,包名),合并后存储新Apk的路径,差异文件的路径);

14.如果你能看到这里那么我还要告诉你一件事情,因为我们的diff合并是IO操作而且非常耗时,建议在线程中或者Service中去执行。

15.当合并执行完成后,调用安装Apk的代码即可(安装我们合并好的Apk啊!啥?一般人都存在了sdcard里面啊!别忘了添加sdcard的访问权限啊!)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,417评论 25 707
  • 注:首发地址 0. 前言 如果只学理论,不做实践,不踩踩坑,一般很难发现真正实践项目中的问题的,也比较难以加深对技...
    cfanr阅读 9,453评论 4 50
  • 增量更新在Android开发中是一种很常见的技术。 增量更新的原理 增量更新的原理非常简单,就是将本地apk与服务...
    re冷星阅读 1,559评论 3 3
  • 本人为初学者,文章写得不好,如有错误,请大力怼我 或者看这里 如何使用jni进行开发 本文主要针对Android环...
    AlbertHumbert阅读 4,638评论 2 12
  • 大家好 初次见面 就来个自我介绍吧 我叫 sanita 香港人 人目前在意大利 今天要回巴黎了 现在机场打发打发时...
    sanita阅读 212评论 3 1