全網(wǎng)最簡單的Android差異化更新實現(xiàn)

我們來完成一個簡單的一B,沒那么多學術問題的Android增量更新的實現(xiàn)。
對,你沒看錯,今天沒有圖!因為太簡單了,什么?你不會NDK?看完了本篇你照樣可以實現(xiàn)增量更新!

首先我們先說下原理:
用戶安裝的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 (已經(jīng)整理好!)
3.以上都是c源碼! 當然我已經(jīng)準備了一個在windows下編譯好的exe文件(你別問我為什么只給Windows的!因為我的是Windows系統(tǒng)!咋的?),到時候我們需要使用這個exe文件來生成差異包
http://pan.baidu.com/s/1nvyh8N3

實現(xiàn)步驟:
1.將你的老版本APK與新版本的APK放在同一個目錄下。
2.使用我網(wǎng)盤里面提供的dif工具來生成差異包
命令行走起:bsdiff.exe oldfile newfile patchfile ;老版本文件名,新版本文件名,差異文件名。對,回車之后等一會,生成了一個差異文件。
3.上NDK走起?。∣K如果你對NDK一點不懂那么請繼續(xù)看,如果你是神,那么請走開啦!)創(chuàng)建一個AndroidStudio項目,一定要勾選支持C++。
4.我們在cpp目錄下來創(chuàng)建一個c文件,叫 native-lib.c
5.將CMakeLists.txt中的native-lib.cpp修改為native-lib.c(沒記錯的話應該是在21行)
5.在Activity中創(chuàng)建一個native方法

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

6.在上面的方法上面按下Alt+Enter 創(chuàng)建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函數(shù),將main函數(shù)改個名字,比如我改成 fkDiffPatch
11.讓我們來寫幾行NDK的代碼在你的fkDiff函數(shù)里面

    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;

     /**
      調用我們修改過名字的函數(shù)
      如果這幾行代碼你看不懂那么我簡單說下,我們將main函數(shù)的命令行參數(shù)
      傳進去而已,而且我們把main函數(shù)的名字改了啊!
    **/
    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中去執(zhí)行。

15.當合并執(zhí)行完成后,調用安裝Apk的代碼即可(安裝我們合并好的Apk啊!啥?一般人都存在了sdcard里面??!別忘了添加sdcard的訪問權限??!)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • 注:首發(fā)地址 0. 前言 如果只學理論,不做實踐,不踩踩坑,一般很難發(fā)現(xiàn)真正實踐項目中的問題的,也比較難以加深對技...
    cfanr閱讀 9,669評論 4 50
  • 增量更新在Android開發(fā)中是一種很常見的技術。 增量更新的原理 增量更新的原理非常簡單,就是將本地apk與服務...
    re冷星閱讀 1,664評論 3 3
  • 本人為初學者,文章寫得不好,如有錯誤,請大力懟我 或者看這里 如何使用jni進行開發(fā) 本文主要針對Android環(huán)...
    AlbertHumbert閱讀 4,834評論 2 12
  • 大家好 初次見面 就來個自我介紹吧 我叫 sanita 香港人 人目前在意大利 今天要回巴黎了 現(xiàn)在機場打發(fā)打發(fā)時...
    sanita閱讀 241評論 3 1

友情鏈接更多精彩內容