首先增量更新应该了解个概念: 增量更新:在版本较近的apk升级的时候,根据两个apk之间的差别(生成差别包),合成新的安装包,在应用内部进行升级的一种操做(须要从新安装apk文件)。 热更新:在发布的版本有BUG的时候,动态加载dex文件,在不影响apk的状况下进行修复BUG(不须要从新安装apk文件)。java
因此从本质上增量更新和热更新是不一样的!这个概念要明确。。。android
所谓工欲善其事,必先利其器。因此工具是很重要的!这里先和你们介绍一下相应的工具!!!c++
鉴于你们的找着费劲,因此呢~因此呢~我也没准备!哈哈!!!开玩笑,这里是我百度网盘的地址(增量更新工具 提取码为r1ws),若是失效的话!及时联系我哦!git
其实每次配置jni的环境我都头疼,可是为了工做也是没办法。后来我发现一个事情,假如以前项目没有ndk那么怎么能快速集成呢?这里我每次都是新建一个ndk项目而后各类copy就行了!!!程序员
其实在当你导入这个文件的时候,你会发现。妈的一堆红。。。这是在逗我吗?别急,以后就行了!!!github
记得当初让大家下的bzip2吧?其实却得就是这个里面得一些东西!!!其实你把俩面的东西全都搞过来是能够的,可是做为一个有逼格的程序员,这怎么可能呢?那么须要导入那些文件呢?看看下面这段代码(在bzip中有一个Makefile文件中的代码):bash
OBJS= blocksort.o \
huffman.o \
crctable.o \
randtable.o \
compress.o \
decompress.o \
bzlib.o
复制代码
对须要的就是这些文件!我把我导入的文件的示意图放上了,按照名称直接导入就行了!服务器
这里面有一些坑须要踩:架构
//#include <bzlib.h>
//新版本只有这样能导入
#include "bzip/bzlib.h"
复制代码
这个我感受是最繁琐的,其实配置这些真的好烦,,,行了不发牢骚了!!!app
其实这个就是一个jni的方法,注意这别忘了加载lib哦!建立完的话native_lib应该是这样的!!!
#include <jni.h>
#include <string>
//这个主要是为了导入其中的方法
extern "C" {
extern int p_main(int argc, char *argv[]);
}
extern "C"
JNIEXPORT void JNICALL Java_com_angle_netupdatademo_MainActivity_bsPath(JNIEnv *env, jobject instance, jstring oldApk_, jstring patch_, jstring output_) {
//将java字符串转换成char指针
const char *oldApk = env->GetStringUTFChars(oldApk_, 0);
const char *patch = env->GetStringUTFChars(patch_, 0);
const char *output = env->GetStringUTFChars(output_, 0);
// 释放相应的指针gc
env->ReleaseStringUTFChars(oldApk_, oldApk);
env->ReleaseStringUTFChars(patch_, patch);
env->ReleaseStringUTFChars(output_, output);
}
复制代码
这里面的内容咱们一会在盘他!!!
其实关于这块我以为有必要系统的学习一下,因此这里咱们就不作太多介绍了,我注解写的很详细的!!!
cmake_minimum_required(VERSION 3.4.1)
# 查找文件系统中指定模式的路径,如/* 匹配根目录的文件(注意路径)
file(GLOB bzip_source ${CMAKE_SOURCE_DIR}/bzip/*.c)
# 设置本地动态库 编译生成动态库
add_library(
#模块名
native-lib
# 动态库/分享能够
SHARED
#源文件
native-lib.cpp
#配置相应的文件引用
bspatch.c
#这个至关与别名引用,上面设置了一个别名
${bzip_source}
)
#系统库,日志输出log
find_library(
log-lib
log)
#须要连接或者编译的库
target_link_libraries(
native-lib
${log-lib})
复制代码
基本上就是这些配置了!!!
这里其实就是在c++的demo中添加了相应的cpu架构的兼容
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.angle.netupdatademo"
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
//兼容cpi架构
abiFilters 'armeabi-v7a'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
}
复制代码
这里也没有什么太多好说的,关于这些建议看看jni配置的一些文章!
以上全部的配置就结束了!!! 是否是很烦,没事,立刻就看到日出了!!!
其实通常的增量更新都是在splash页面中动态从服务器下载patch文件,放在某个文件夹下,而后经过以前安装apk的路径进行生成新包,最后安装。基本上就是这个流程!
因此这里须要解决的一些内容:
分解处任务就很好作了!
解压bsdiff-v4.3-win以后会有两个文件,直接把两个android安装包放进去以后,经过命令 bsdiff old.apk new.apk patch就能够生成相应的patch文件了!
其实这个很简单,一行代码就能搞定
String oldApk = getApplicationInfo().sourceDir;
复制代码
这里就要用到咱们以前没有盘的那个jni方法了!
#include <jni.h>
#include <string>
//这个主要是为了导入其中的方法
extern "C" {
extern int p_main(int argc, char *argv[]);
}
extern "C"
JNIEXPORT void JNICALL Java_com_angle_netupdatademo_MainActivity_bsPath(JNIEnv *env, jobject instance, jstring oldApk_, jstring patch_, jstring output_) {
//将java字符串转换成char指针
const char *oldApk = env->GetStringUTFChars(oldApk_, 0);
const char *patch = env->GetStringUTFChars(patch_, 0);
const char *output = env->GetStringUTFChars(output_, 0);
//bspatch ,oldfile ,newfile ,patchfile
char *argv[] = {"", const_cast<char *>(oldApk), const_cast<char *>(output), const_cast<char *>(patch)};
p_main(4, argv);
// 释放相应的指针gc
env->ReleaseStringUTFChars(oldApk_, oldApk);
env->ReleaseStringUTFChars(patch_, patch);
env->ReleaseStringUTFChars(output_, output);
}
复制代码
看中间增长的那段代码,这个p_main就是以前让你改的那个main方法,须要四个参数,而后强转。这里面实际上是c的一些知识,我也不是很明白。可是代码很好理解!
那么接下来,就直接调用这个发方法生成一个相应的apk就能够了!!!
使用方法,生成一个apk(老的),而后增长内容,在生成一个apk(新的)。生成拆分包!而后把这两个都放在sd卡的根目录安装老的apk,而后点击更新!!!