android 官方增量更新,Android 增量更新

title: Android NDK之增量更新

1.增量更新使用到的库bsdiff和bzip2

bsdiff库是一个开源的二进制差分工具,通过对比Apk的二进制,从而进行差分包的生成。

bsdiff库可以参考官网:bsdiff

下载地址:已经将用到的bsdiff和bzip上传到百度云 。

2.AS创建项目,并导入头文件

本项目使用Android Studio,通过cmake进行编译。

新建一个工具类,进行差分包的生成及合并

Diffutils

public class Diffutils {

static {

System.loadLibrary("native-lib");

}

/**

* @param oldPath 旧的安装包路径

* @param newPath 新的安装包路径

* @param patchPath 差分包路径

* @return 生成的结果

*/

public static native int generateDiffApk(String oldPath, String newPath, String patchPath);

/**

* @param oldPath 旧的安装包路径

* @param newPath 新的安装包路径

* @param patchPath 差分包路径

* @return 生成的结果

*/

public static native int mergeDiffApk(String oldPath, String newPath, String patchPath);

}

导入bsdiff和bzip2的头文件以及.c文件

6d354a1951ab1439592e5b1b0408e321.png

)

将生成的.cpp文件改成.c文件。为什么要修改成.c文件?主要是因为c和c++对void * malloc这个函数编译不同,c中不用将结果强制转换成类型* ,而c++则不同,它必须要将结果强制转换成类型*。我们使用到的bsdiff库和bzip2库好多地方都使用了malloc函数,如果使用c++编译会报大量的错误,因此我们采用c编译。

修改了cpp文件我们不要忘记在CMakeList中进行更新以及导入新的文件

CMakeList.txt

# Sets the minimum version of CMake required to build the native

# library. You should either keep the default value or only pass a

# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC

# or SHARED, and provides the relative paths to its source code.

# You can define multiple libraries, and CMake builds it for you.

# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

# Associated headers in the same location as their source

# file are automatically included.

src/main/cpp/native-lib.c )

#include src/main/cpp/include目录下的所有文件

include_directories(src/main/cpp/include)

# Searches for a specified prebuilt library and stores the path as a

# variable. Because system libraries are included in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

find_library( # Sets the name of the path variable.

log-lib

# Specifies the name of the NDK library that

# you want CMake to locate.

log )

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in the

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

native-lib

# Links the target library to the log library

# included in the NDK.

${log-lib} )

3. 差分方法以及合并方法的实现

差分的方法在bsdiff.c的main函数已经实现,但是我们为了区分差分方法和合并方法我将main函数修改成generateDiffApk。同理合并方法在bspatch中已经实现,我将其main函数修改成mergeDiffApk

native-lib.c

#include

#include "include/bsdiff.c"

#include "include/bspatch.c"

JNIEXPORT jint JNICALL

Java_com_nick_bsdiff_Diffutils_generateDiffApk(JNIEnv *env, jclass type, jstring oldPath_,

jstring newPath_, jstring patchPath_) {

int argc = 4;

char *argv[argc];

argv[0] = (char *) "bspatch";

argv[1] = (char *) (*env)->GetStringUTFChars(env, oldPath_, 0);

argv[2] = (char *) (*env)->GetStringUTFChars(env, newPath_, 0);

argv[3] = (char *) (*env)->GetStringUTFChars(env, patchPath_, 0);

jint result = generateDiffApk(argc, argv);

(*env)->ReleaseStringUTFChars(env, oldPath_, argv[1]);

(*env)->ReleaseStringUTFChars(env, newPath_, argv[2]);

(*env)->ReleaseStringUTFChars(env, patchPath_, argv[3]);

return result;

}

JNIEXPORT jint JNICALL

Java_com_nick_bsdiff_Diffutils_mergeDiffApk(JNIEnv *env, jclass type, jstring oldPath_,

jstring newPath_, jstring patchPath_) {

int argc = 4;

char *argv[argc];

argv[0] = (char *) "bspatch";

argv[1] = (char *) (*env)->GetStringUTFChars(env, oldPath_, 0);

argv[2] = (char *) (*env)->GetStringUTFChars(env, newPath_, 0);

argv[3] = (char *) (*env)->GetStringUTFChars(env, patchPath_, 0);

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

printf("patch = %s \n", argv[3]);

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

jint result = mergeDiffApk(argc, argv);

(*env)->ReleaseStringUTFChars(env, oldPath_, argv[1]);

(*env)->ReleaseStringUTFChars(env, newPath_, argv[2]);

(*env)->ReleaseStringUTFChars(env, patchPath_, argv[3]);

return result;

}

4.效果展示

旧版本:

04fda8261e0f3a711f5fbe0f3bbb21e9.png

生成的差分包(app3.patch):

54c3a4f4084eff8aac59e302bc9676c4.png

合并后的新的安装包(app1):

0790c330393ce99608d71e2c13e144fe.png

安装后:

7601d7f3dd28c4e56b2f980b4844bf16.png

5.项目地址

我将完整项目上传到了GitHub上,有兴趣的可以点击这里进入。

Android 增量更新(BSDiff / bspatch)

Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...

Android 增量更新研究

Android 增量更新实例(Smart App Updates) http://blog.csdn.net/duguang77/article/details/17676797 Android AP ...

一句话的Android增量更新框架(增量更新)

转自:http://www.jianshu.com/p/a9ec8fa780e2 Android应用更新要使用完整的新版本Apk安装,增量更新则是提供一个新旧版本偏差数据的patch包供应用下载,然后 ...

Android 增量更新实例(Smart App Updates)

原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...

Android 增量更新完全解析 是增量不是热修复(转)

转自:http://blog.csdn.net/lmj623565791/article/details/52761658 本文在我的微信公众号:鸿洋(hongyangAndroid)首发. 转载请标 ...

Android 增量更新和升级

在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...

android 增量更新原理

原理如下:服务器端设计增量表,记录数据操作顺序id,和增删改查信息.在进行数据库表操作的时候同时进行将信息保存在增量表. android客户端在请求的时候上传最后保存的id.服务端判断最后的id,返回 ...

Android增量更新

http://blog.csdn.net/tu_bingbing/article/details/8538592 (转)

android studio增量更新

一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...

随机推荐

CentOS 6.5 安装Oracle 11G R2问题列表

1. 文章中写vi/etc/profile #这个很重要 if [ $USER ="oracle" ]; then     if [ $SHELL="/bin/ksh&q ...

简便的自动布局,对UIStackView的个人理解!

序言: 更新了很久的Linux,我怕朋友们都视觉疲劳了,今天就更新在学ios开发时候,对一些知识点的理解.希望各位会喜欢! 正文: UIStackView 类提供了一个高效的接口用于平铺一行或一列的视 ...

如何防止ListView控件闪烁

如何防止ListView控件闪烁 beginupdate()和endupdate()之间写代码   ListView1.Items.BeginUpdate;ListView1.Items.Add('A ...

Chef 自动化运维:开始“烹饪”

在 Chef Workstation 上创建了一个 cookbook 之后,我们执行以下命令来进行测试: chef-client --local-mode --override-runlist fir ...

PHP 依赖注入和控制反转再谈(二)

今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我 ...

HTTP Headers 信息

点开一个条目,可以查看请求的详细信息: General —— 通用信息 Request URL:请求的URL     Request Method:请求的方法     Status Code:响应状态 ...

【HDU5187】contest

真的没有什么会写的东西了QAQ 原题: As one of the most powerful brushes, zhx is required to give his juniors n probl ...

Windows 增加远程连接数

转载自 https://blog.csdn.net/scholar_man/article/details/60570827 1.设置终端设置,需要打开[控制面板]---[系统和安全] 2.进入系统和 ...

spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found

spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...

容器学习笔记之CentOS7安装Docker(安装指定版本的Docker,加速,卸载)

0x00 概述 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值