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.mzph.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…