Android app智能升级(增量更新)
2015-10-08 14:32
337 查看
原理:
服务器发布新版本v1.1,客服端当前版本为v1.0,使用bsdiff生成差分包patch_v1.0_v1.1,然后客户端下载patch包到本地然后与本地的v1.0.apk合并生成v1.1.apk,然后执行安装,升级完成增量升级可以优化升级速度,修复紧急BUG之类的,比如源APK大小10M,增量升级patch包可能就1-2M或者几百K,可以实现快速升级
实现:
使用工具为bsdiff、bspatch来完成差分增量包和合并增量包,下载地址为:http://www.daemonology.net/bsdiff/win32版本使用命令如:
bsdiff.exe oldfile newfile patchfile bspatch.exe oldfile newfile patchfile
android中的实现则需要使用JNI调用c文件来完成
1.首先新建一个Utils类:
package com.yxy.lib.smartupdate; public class Utils { static{ System.loadLibrary("bspatch"); } public static native int patchApk(String oldPath,String newPath,String patchPath); }
[b]2.使用java编译生成.h文件的方法[/b]
//编译java文件
F:\JniLib\src\com\yxy\lib\smartupdate>javac Utils.java
//生成后的.h文件名格式为 包名_类名.h >> com_yxy_lib_smartupdate_Utils.h
F:\JniLib\src>javah com.yxy.lib.smartupdate.Utils
[b]3.使用c++实现底层方法[/b]
>在项目根目录下建立jni文件夹,放入bspatch.c相关的c文件实现,可以直接拷贝底部demo中的jni文件夹内的文件,替换掉方法即可
生成后的.h文件中native方法名称格式为java_包名_类名_方法名
com_yxy_lib_smartupdate_Utils.h文件可以在bspatch.c文件中使用#include "com_yxy_lib_smartupdate_Utils.h"实现,
也可以直接复制方法到bspatch.c中实现,本demo中复制该方法到bspatch.c完成实现:
JNIEXPORT jint JNICALL Java_com_yxy_lib_smartupdate_Utils_patchApk(JNIEnv *env, jobject obj, jstring old, jstring new , jstring patch){ //构建4个长度的数组 int argc=4; char * argv[argc]; argv[0]="fail."; argv[1]=(*env)->GetStringUTFChars(env,old, 0); argv[2]=(*env)->GetStringUTFChars(env,new, 0); argv[3]=(*env)->GetStringUTFChars(env,patch, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "oldFilePath = %s",argv[1]); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "newFilePath = %s",argv[2]); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "patchFilePath = %s",argv[3]); int ret=applypatch(argc, argv); (*env)->ReleaseStringUTFChars(env,old,argv[1]); (*env)->ReleaseStringUTFChars(env,new,argv[2]); (*env)->ReleaseStringUTFChars(env,patch,argv[3]); return ret; } __android_log_print 需要导入 #include <android/log.h>如果构建的时候报JNIEXPORT找不到,则需要在bspatch.c中#include <jni.h>
[b][b]4.配置android.mk[/b][/b]
# Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # LOCAL_PATH := $(call my-dir) #构建一个静态库,bspatch中需要调用libbz.a和bzlib.h中的函数或参数,需要先构建 #building static library include $(CLEAR_VARS) LOCAL_MODULE:= libbz LOCAL_SRC_FILES:= libbz.a LOCAL_EXPORT_C_INCLUDES := bzlib.h include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) # #构建so文件 # build so lib #so文件名,构建完成会自动将libbspatch.so放在libs\armeabi文件夹之下 LOCAL_MODULE:= libbspatch # All of the source files that we will compile. #编译文件夹 LOCAL_SRC_FILES:= \ bspatch.c \ bsdiff.c # Also need the JNI headers. #导入bzlib文件 LOCAL_EXPORT_C_INCLUDES := bzlib.h # No static libraries. #导入上面构建静态库 LOCAL_STATIC_LIBRARIES := \ libbz LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog # No special compiler flags. LOCAL_CFLAGS += #构建共享库 #build so file include $(BUILD_SHARED_LIBRARY)
[b]5.生成SO文件[/b]
命令行进入项目的根目录,使用ndk-build命令生成so文件,如果未安装ndk请先到官网下载ndk
demo地址>>https://github.com/yang7206/Jni_SmartUpdate
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法