Android Studio 2.2 NDK入門(二) 增量更新簡單應用

基礎回顧

Android Studio 2.2 NDK入門(一) 官方DEMO解析 http://www.reibang.com/p/021ab5c67d8f

增量更新原理

有太多的介紹了畜普,簡而言之就是生成差分表均践,合并差分包.本文主要講解app端實現(xiàn)合并差分包

相關c文件及工具

開始增量更新之旅

diff.png
  • 編寫客戶端的差分包合并代碼坟比,PatchUtils.java
public class PatchUtils {

    static PatchUtils instance;

    public static PatchUtils getInstance() {
        if (instance == null)
            instance = new PatchUtils();
        return instance;
    }

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

    /**
     * native方法 使用路徑為oldApkPath的apk與路徑為patchPath的補丁包,合成新的apk妻枕,并存儲于newApkPath
     *
     * 返回:0僻族,說明操作成功
     *
     * @param oldApkPath
     *            示例:/sdcard/old.apk
     * @param newApkPath
     *            示例:/sdcard/new.apk
     * @param patchPath
     *            示例:/sdcard/xx.patch
     * @return
     */
    public native int patch(String oldApkPath, String newApkPath, String patchPath);
}
  • 使用javah自動生成ndk轉(zhuǎn)換的c和頭文件.h
    參考第一篇中的javah方式
    javah -d jni class.package.ClassName
    生成的文件和函數(shù)應該類似這樣的:com_example_mobaolibo_jni_bsdiff_PatchUtils.c/h
JNIEXPORT jint JNICALL
Java_com_example_mobaolibo_jni_bsdiff_PatchUtils_patch(JNIEnv *, jclass, jstring, jstring, jstring);
JNIEXPORT jint JNICALL
Java_com_example_mobaolibo_jni_bsdiff_PatchUtils_patch(
        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));

    printf("old apk = %s \n", argv[1]);
    printf("patch = %s \n", argv[3]);
    printf("new apk = %s \n", argv[2]);

    int ret = applypatch(argc, argv);

    printf("patch result = %d ", ret);

    (*env)->ReleaseStringUTFChars(env, old, argv[1]);
    (*env)->ReleaseStringUTFChars(env, new, argv[2]);
    (*env)->ReleaseStringUTFChars(env, patch, argv[3]);
    return ret;
}
  • 新建一個任務用來合并差分包
public class PatchTask extends AsyncTask<String, Void, Integer> {
        @Override
        protected Integer doInBackground(String... params) {
            try {

                int result = PatchUtils.getInstance().patch(srcDir, newDir, patchDir);
                if (result == 0) {
                    handler.obtainMessage(1).sendToTarget();
                    return WHAT_SUCCESS;
                } else {
                    handler.obtainMessage(2).sendToTarget();
                    return WHAT_FAIL_PATCH;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return WHAT_FAIL_PATCH;
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            loading.setVisibility(View.GONE);
        }
    }
  • 調(diào)用合并,這里應該是現(xiàn)在完畢后自動合并屡谐。還應該判斷md5等等述么。這里僅作演示
public void patch(View view){
        loading.setVisibility(View.VISIBLE);
        new PatchTask().execute();
    }

實際應用需要注意

  • 編譯成.so文件供其它項目使用時,需要注意com_example_mobaolibo_jni_bsdiff_PatchUtils.c的類包名和路徑要匹配愕掏,不然會報錯No implementation found
  • 舉個例子:項目中是的patchUtils.java路徑為com.custom.package.utils.PatchUtils.java,則javah生成的文件中和名字均是com_custom_package_utils_PatchUtils碉输,Java_com_custom_package_utils_PatchUtils_func

結(jié)語

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敷钾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肄梨,更是在濱河造成了極大的恐慌阻荒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众羡,死亡現(xiàn)場離奇詭異侨赡,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門羊壹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖宦,“玉大人,你說我怎么就攤上這事油猫〕砻” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵情妖,是天一觀的道長睬关。 經(jīng)常有香客問我,道長毡证,這世上最難降的妖魔是什么电爹? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮料睛,結(jié)果婚禮上丐箩,老公的妹妹穿的比我還像新娘。我一直安慰自己恤煞,他們只是感情好屎勘,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阱州,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法梯。 梳的紋絲不亂的頭發(fā)上苔货,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音立哑,去河邊找鬼夜惭。 笑死,一個胖子當著我的面吹牛铛绰,可吹牛的內(nèi)容都是我干的诈茧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼捂掰,長吁一口氣:“原來是場噩夢啊……” “哼敢会!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这嚣,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鸥昏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姐帚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吏垮,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膳汪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唯蝶。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遗嗽,靈堂內(nèi)的尸體忽然破棺而出粘我,到底是詐尸還是另有隱情,我是刑警寧澤媳谁,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布涂滴,位于F島的核電站,受9級特大地震影響晴音,放射性物質(zhì)發(fā)生泄漏柔纵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一锤躁、第九天 我趴在偏房一處隱蔽的房頂上張望搁料。 院中可真熱鬧,春花似錦系羞、人聲如沸郭计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昭伸。三九已至,卻和暖如春澎迎,著一層夾襖步出監(jiān)牢的瞬間庐杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工夹供, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灵份,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓哮洽,卻偏偏與公主長得像填渠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸟辅,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 增量更新在Android開發(fā)中是一種很常見的技術(shù)匪凉。 增量更新的原理 增量更新的原理非常簡單屉更,就是將本地apk與服務...
    re冷星閱讀 1,561評論 3 3
  • @[增量更新,差分包,bsdiff/patch] 背景 隨著Android app的不斷迭代升級,功能越來越多洒缀,a...
    SunYo閱讀 14,439評論 2 7
  • 在前幾年瑰谜,整體移動網(wǎng)絡環(huán)境相比現(xiàn)在差很多欺冀,加之流量費用又相對較高,因此每當我們發(fā)布新版本的時候萨脑,一些用戶升級并不是...
    涅槃1992閱讀 5,470評論 2 39
  • 綠色建造著黃色預警信號隐轩, 人生的軌跡彎彎曲曲才值得贊美。 詩與遠方在一顆頭顱里打轉(zhuǎn)渤早, 名利場上职车,草芥紛飛,人群低沉...
    摩詰梵心閱讀 187評論 1 5
  • 文/竹青一陽 金蟬子的賭局鹊杖,還沒開始便已注定輸了悴灵。緊箍解了又如何?走骂蓖,往南积瞒,往北,還是往西天登下,往今已知曉的邊界茫孔? ...
    竹青一陽閱讀 694評論 0 1