linux android sdk gengxinman,Android 實現增量更新

一、概述

增量更新相較于全量更新的好處不言而喻,利用差分算法獲得1.0版本到2.0版本的差分包,這樣在安裝了1.0的設備上只要下載這個差分包就能夠完成由1.0-2.0的更新。比如:

存在一個1.0版本的apk

abcc45fdbd33

apk1.png

然后需要升級到2.0版本,而2.0版本的apk為

abcc45fdbd33

apk2.png

這樣如果進行全量更新則需要下載完整的76.6M大小的apk文件,進行安裝。而如果使用增量更新則只需要下載如下 50.7M的差分包。

abcc45fdbd33

patch.png

下載數據減少了26M。這樣做的好處不僅僅在于對于流量的節省。對于用戶來說現在流量可能并不值錢,或者使用wifi再進行更新,但是從下載時間能夠得到一個良好的優化,同時也減小了服務器的壓力。

二、實現

需要實現增量更新,現在有各種開源的制作與合并差分包的開源庫,比如:bsdiff、hdiff等等。因此我們只需要獲得源碼來使用即可。

下載完成后解壓:

abcc45fdbd33

bsdiff源碼.png

bsdiff: 比較兩個文件的二進制數據,生成差分包

bspatch: 合并舊的文件與差分包,生成新文件

執行make

很顯然,bspatch我們需要在Android環境下來執行,而bsdiff 一般會在你的存儲服務器當中執行即電腦環境下執行(win或linux)

切到解壓后的目錄,然后執行make:

abcc45fdbd33

Makefile:13: *** missing separator. Stop.

這時會報錯,需要修改Makefile文件,將install:下面的if,endif添加一個縮進:

install:

${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin

.ifndef WITHOUT_MAN

${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1

.endif

#上面這段makefile片段顯然有問題

#因此需要修改為:

install:

${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin

.ifndef WITHOUT_MAN

${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1

.endif

#也就是在 `.if` 和 `.endif` 前加一個 tab

unknown type name 'u_char'; did you mean 'char'static off_t offtin(u_char *buf)

然后,重新執行make:

abcc45fdbd33

錯誤很明顯,找不到u_char等,因為缺少了頭文件

在bspatch.c文件中加入

#include

再次make就好了

no file found bzlib.h之類的錯誤

如果出現找不到bzip2 no file found bzlib.h之類的錯誤,則需要先安裝bzip2:

Ubuntu:

apt install libbz2-dev

Centos:

yum -y install bzip2-devel.x86_64

Mac:

brew install bzip2

最后執行make后沒有問題了,就會生成兩個bsdiff和bspatch的可執行文件

bsdiff和bspatch的工具的使用

首先我們準備兩個apk,old.apk和new.apk,你可以自己隨便寫個項目,先運行一次拿到生成的apk作為old.apk;然后修改些代碼,或者加一些功能,再運行一次生成new.apk;

生成增量文件

./bsdiff old.apk new.apk patch

這樣就生成了一個增量文件patch

增量文件和old.apk合并成新的apk

./bspatch old.apk new2.apk patch

這樣就生成一個new2.apk

我們可以使用md5來查看new.apk和new2.apk兩個文件的md5值,

abcc45fdbd33

md5值的比較

三、android代碼中實現bspatch合并

將bspatch.c文件考入到項目的cpp目錄下,因為其還需要bzip2依賴,所以將下載好的bzip2的一些源碼也考入到項目中,

從下載的bzip2里的Makefile中的OBJS可以看出需要7個源文件文件,因此將這對應的源文件考入到抗美中,然后在將依賴的.h文件也考入項目中

abcc45fdbd33

最終要考入的文件如下:

abcc45fdbd33

在項目的CMakeLists.txt文件中把bspatch.c和bzip項目源文件加入其中

file(GLOB bzip_source src/main/cpp/bzip/*.c)

add_library(

native-lib

SHARED

src/main/cpp/native-lib.cpp

src/main/cpp/bspatch.c

${bzip_source})

此時執行AS的Build下的Make project,發現會報錯

abcc45fdbd33

明明考入的有bzlib.h這個文件,為哈還是報錯呢?,其實這個是因為bspatch.c里是以#include 這種形式引入bzlib.h的,我們可以將其引入方式改為#include "bzip/bzlib.h"就可以了,但在這里我們用一種不修改源碼的方式解決,就是在CMakeLists.txt中加入一句include_directories(src/main/cpp/bzip)就可以了。

下面是具體實現

MainActivity.java

public class MainActivity extends AppCompatActivity {

static {

System.loadLibrary("native-lib");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView version = (TextView) findViewById(R.id.tv_version);

version.setText(BuildConfig.VERSION_NAME);

}

/**

* native方法 使用路徑為oldapk的apk與路徑為patch的補丁包,合成新的apk,并存儲于output

* @param oldapk 當前運行的apk

* @param patch 差分包

* @param output 合成后的新的apk

*/

native void bspatch(String oldapk,String patch,String output);

public void onUpdate(View view) {

new MyAsyncTask().execute();

}

private class MyAsyncTask extends AsyncTask{

@Override

protected File doInBackground(Void... voids) {

//1、合成apk

String old = getApplication().getApplicationInfo().sourceDir;

bspatch(old,"/sdcard/patch","/sdcard/new.apk");

return new File("/sdcard/new.apk");

}

@Override

protected void onPostExecute(File file) {

super.onPostExecute(file);

//2、安裝

Intent i = new Intent(Intent.ACTION_VIEW);

if(Build.VERSION.SDK_INT

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

i.setDataAndType(Uri.fromFile(file),

"application/vnd.android.package-archive");

}else {

i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

String packageName = getApplication().getPackageName();

Uri contentUri = FileProvider.getUriForFile(MainActivity.this, packageName+ ".fileProvider", file);

i.setDataAndType(contentUri,"application/vnd.android.package-archive");

}

startActivity(i);

}

}

}

記得開啟讀寫SDCard權限。

native-lib.cpp

#include

#include

extern "C"{

//引入bspatch.c里的main方法

extern int main(int argc,char * argv[]);

}

extern "C"

JNIEXPORT void JNICALL

Java_com_example_zuo_bsdiff_MainActivity_bspatch(JNIEnv *env, jobject instance, jstring oldapk_,

jstring patch_, jstring output_) {

const char *oldapk = env->GetStringUTFChars(oldapk_, 0);

const char *patch = env->GetStringUTFChars(patch_, 0);

const char *output = env->GetStringUTFChars(output_, 0);

int argc = 4;

char *argv[4] ={"", const_cast(oldapk),const_cast(output),const_cast(patch)};

main(argc,argv);

env->ReleaseStringUTFChars(oldapk_, oldapk);

env->ReleaseStringUTFChars(patch_, patch);

env->ReleaseStringUTFChars(output_, output);

}

因為在android7.0以上調用安裝界面需要特殊處理:

在AndroidManifest.xml文件中添加provider,這里的provider介紹可以參考博客:android 7.0 因為file://引起的FileUriExposedException異常

android:authorities="com.example.zuo.bsdiff.fileProvider"

android:name="android.support.v4.content.FileProvider"

android:exported="false"

android:grantUriPermissions="true">

android:resource="@xml/file_paths"/>

新建一個file_paths.xml

四、打包

分別打一個1.0版本的apk包,在打一個2.0版本的apk包,然后使用./bsdiff app-1.apk app-2.apk patch生成個差分包,將這個差分包考到/sdcard下,安裝舊版本的apk后,更新就可以升級到2.0版本的apk

大致的效果圖如下:

abcc45fdbd33

增量更新效果圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(轉)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別

linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別 原文:https://www.cnblogs.com/yi-meng/p/3214471.html這3個命令的用途都是啟動網絡接口,不過,ifup與ifdown僅就 /etc/sysconfig/network- scripts內的ifcfg-ethx(x為數…

Pycharm上Django的使用 Day8

2019獨角獸企業重金招聘Python工程師標準>>> 1.添加新條目 1>編寫用于添加新條目的表單 在forms.py中創建一個與模型Entry相關聯的表單 1處給字段text指定一個空標簽 2處定義小部件widgets,widgets是一個HTML表單元素 2>定義new_entry的URL模式 在用于添加新條…

物聯網創新領域的三大驅動性趨勢

從設備對接到區塊鏈,今天我們將介紹幾項物聯網開發者必須了解的最新技術趨勢。 物聯網正在快速改變著我們的工作與生活方式。過去十年以來,利用惟一IP地址實現聯網早已不是難事,但傳感器、處理器以及其它多種新興技術的涌現真正讓物聯網走向了…

TensorFlow.NET 實戰 -- 為.NET開發者開啟機器學習之旅

在IT技術飛速發展的今天,云計算、人工智能、大數據和云原生應用等新興技術的發展為我們帶來一波又一波的浪潮,也對軟件開發者提出了更高的要求,特別是人工智能開發領域,應運而生的新概念讓人目不暇接。作為一個.NET開發者的你&…

Arduino I/O Expansion Shield V7.1

介紹: 傳感器擴展板,目的是為初學者省去繁瑣的面包板接線和故障排除,專注實現自己的創意想法。 擴展板V7.1不僅保留老版本的所有優點,改善了它的易用性,更重要的是它兼容Arduino新一代主控器DUE。現在V7.1以其強大的擴…

展訊康一:2020年推出5G芯片 第一桶金含金量最高

工信部部長苗圩在全球5G大會上表示,5G網絡將2020年規模商用。對此,終端、芯片、網絡方面準備如何?國產自主芯片廠商展訊通信全球副總裁康一博士在接受搜狐科技專訪時透露,在5G方面,展訊投入較大,力爭在2018…

簡單的單臂路由的配置實驗 (思科)

實驗名稱:簡單的單臂路由的 配置實驗 (思科)實驗拓撲: 實驗需要:1、按圖中所示配置設網絡備vlan,IP地址2、能夠使各pc互相ping通。 實驗步驟: 1、配置終端設備:pc1-pc5按照拓撲圖中所…

C#實現生成Markdown文檔目錄樹

1前言(昨天那篇排版有點問題,不能忍,今天重發!)之前我寫了一篇關于C#處理Markdown文檔的文章:C#解析Markdown文檔,實現替換圖片鏈接操作算是第一次嘗試使用C#處理Markdown文檔,然后最…

漢諾塔c語言源程序步驟,漢諾塔問題的算法分析及C語言演示程序的實現

摘要:該文對經典的“漢諾塔”問題進行了詳細的分析,并用C語言實現。通過問題的具體實現,使學習者了解問題的全過程,推廣到一般。關鍵詞:漢諾塔;遞歸;C語言中圖分類號:TP301.6文獻標識碼:A文章編號:1009-3044(2010)09-2130-02Algorithm Analysis and C Realization of Hanio Iss…

spring security xml配置詳解

security 3.x <?xml version"1.0" encoding"UTF-8"?> <beans:beans xmlns"http://www.springframework.org/schema/security" xmlns:beans"http://www.springframework.org/schema/beans" xmlns:xsi"http://www…

【Redis源碼分析】Redis命令處理生命周期

運營研發團隊 李樂 前言 本文主要講解服務器處理客戶端命令請求的整個流程&#xff0c;包括服務器啟動監聽&#xff0c;接收命令請求并解析&#xff0c;執行命令請求&#xff0c;返回命令回復等&#xff0c;這也是本文的主題“命令處理的生命周期”。 Redis服務器作為典型的事件…

博鰲直擊 | 區塊鏈在互聯網金融中扮演怎樣的角色?

雷鋒網3月24日報道&#xff0c;今日&#xff08;3月24日&#xff09;&#xff0c;第16屆博鰲亞洲論壇2017年年會在海南繼續進行中。據雷鋒網了解&#xff0c;在今日下午的數字貨幣與區塊鏈分論壇上&#xff0c;中國銀行前行長、中國互聯網金融協會區塊鏈工作組組長李禮輝講述了…

GDB調試qemu-kvm

GDB調試qemu-kvm 前面幾篇博文都是記錄一些kvm相關包編譯安裝及使用&#xff0c;但都沒深入去代碼看看。看源碼在配合上相關原理才能更好的理解kvm。但qemu-kvm的代碼量很多&#xff0c;對我來講直接看源碼收獲甚少&#xff0c;所以找了個調試工具——GDB來配合閱讀代碼。接下來…

c語言編譯錯誤 原文,C語言常見錯誤與警告

C語言常見錯誤與警告C語言常見錯誤與警告C語言常見錯誤&#xff1a;1 invalid type argument of ‘->’ (have ‘struct qstr_xid_element’)這種錯誤一般是沒有理解C中“->”與“.”用法的不同&#xff0c;“->”是指向結構體指針獲取結構體的成員變量時所用&#xf…

力爭營收渠道多樣化,Line 向自拍應用 Snow 投資 4500 萬美元

今年&#xff0c;在科技公司 IPO 市場不景氣的情況下&#xff0c;日本通信應用 Line順利進行了 IPO &#xff0c;目前正在尋求多樣化發展。今天, Line 宣布向自拍應用 Snow 投資 4500 萬美元(500 億韓元)。本次交易之后&#xff0c;Line 將獲得 Snow 25% 的股權。 Snow 常被稱為…

用.NET設計一個假裝黑客的屏幕保護程序

本文主要介紹屏幕保護程序的一些相關知識&#xff0c;以及其在安全方面的用途&#xff0c;同時介紹了如何使用 .NET 開發一款屏幕保護程序&#xff0c;并對核心功能做了介紹&#xff0c;案例代碼開源&#xff1a;https://github.com/sangyuxiaowu/HackerScreenSaver背景前幾天在…

【IntelliJ】IntelliJ IDEA常用設置及快捷鍵以及自定義Live templates

IntelliJ IDEA是一款非常優秀的JAVA編輯器&#xff0c;初學都可會對其中的一些做法感到很別扭&#xff0c;剛開始用的時候我也感到很不習慣&#xff0c;在參考了網上一些文章后在這里把我的一些經驗寫出來&#xff0c;希望初學者能快速適應它&#xff0c;不久你就會感覺到編程是…

復習Javascript專題(一):基本概念部分

一、數據類型 基本類型&#xff1a;Null Boolean String Undefined Number(NB SUN)引用類型&#xff1a;Array Function Object類型判斷&#xff1a;typeof 返回結果"undefined"&#xff08;未定義&#xff09; "boolean"(布爾值) "st…

c語言時鐘報告,C語言圖形時鐘課程設計實驗報告

C語言圖形時鐘課程設計實驗報告 目錄1.系統功能要求。2. 數據結構設計及說明。3.程序結構(畫流程圖) 。4.各模塊的功能。5.試驗結果(包括輸入數據和輸出結果) 。6.體會。7.參考文獻。8.附錄&#xff1a;程序清單及源程序。? 系統功能要求&#xff1a;在屏幕上顯示一個圖形時鐘…

微軟發布 2023 財年第一季度財報:營收達 501 億美元,同比增長 11%

北京時間 2022 年 10 月 26 日——微軟發布 2023 財年第一季度財報。財報顯示&#xff0c;截止到 2022 年 9 月 30 日&#xff1a;營收達到 501 億美元&#xff0c;增長 11%&#xff08;按固定匯率計算增長 16%&#xff09;運營收入為 215 億美元&#xff0c;增長 6%&#xff0…