【第一节】android增量升级之生成so文件
来源:互联网 发布:域名注册网站排名 编辑:程序博客网 时间:2024/06/04 18:30
该篇文章从eoeAndroid搬迁过来的,原文地址:【第一节】android增量升级之生成so文件
前言
对于android项目,我们常常会遇到这样一种情况,比如某一版本的线上应用,突然发现了一个BUG,修改后发现不值当为这个BUG进行一次版本升级,那么怎么去解决在同一版本上修改线上应用的BUG呢,Google给了我们一种解决方案 Smart App update,也就是应用增量升级。
那么,何谓增量升级呢?简单的来说,也就是把同一版本的新旧两个apk进行差分,得到一个差异包,然后在旧的应用中下载该差异包和旧的apk进行合并成新的apk,然后去安装新的apk,该合成的apk和差分前新apk是一样的,这样就可以做到应用的增量升级。一般来说,获取到的差异包较之新的apk来说小了很多,这样就可以减少用户的下载流量。
增量升级需要用到jni开发,所以我们需要去生成合并差异包的so文件,这里我们需要准备的工具有:eclipse,NDK环境(这里用的是ndk9以上的版本),bsdiff文件,bzip2文件(这两个文件在下面附件中给出)。
第一步
创建一个android项目,比如SmartAppUpdateSo,设定好包名(此处为以后引用so文件的方法做准备),例如com.smartapp.update。右键点击项目 -> Android tools -> Add Native Support…,在弹出窗里填写你要生成的so文件名称,如SmartAppUpdate,这样我们就能在项目中看到jni和obj两个文件夹了,删除jni文件夹下的SmartAppUpdate.cpp文件。
第二步
新建BatchUtils工具类,在类中增加方法
private native static int patchApk(String oldApkPath, String newApkPath, String patchPath);
打开cmd界面,进入到项目的bin\classes路径下,执行javah com.smartapp.update.BatchUtils命令,我们就能在bin\classes路径下发现一个命名为com_smartapp_update_BatchUtils.h的文件,打开该文件,里面的内容为
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_smartapp_update_BatchUtils */#ifndef _Included_com_smartapp_update_BatchUtils#define _Included_com_smartapp_update_BatchUtils#ifdef __cplusplusextern "C" {#endif/* * Class: com_smartapp_update_BatchUtils * Method: patchApk * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_smartapp_update_BatchUtils_patchApk (JNIEnv *, jclass, jstring, jstring, jstring);#ifdef __cplusplus}#endif#endif
第三步
将com_smartapp_update_BatchUtils.h文件拷贝到项目的jni文件夹下,然后将bzip2文件中的相关文件也拷贝到项目的jni文件夹下,需要拷贝的文件有:
blocksort.cbzip2.cbzip2recover.cbzlib_private.hbzlib.cbzlib.hcompress.ccrctable.cdecompress.cdlltest.chuffman.cmk251.crandtable.cspewG.cunzcrash.c
第四步
将bsdiff中的bspatch.c文件拷贝到项目的jni文件夹中,并将其重命名为com_smartapp_update_BatchUtils.c,打开该文件,修改其中的内容:
1.将头文件替换掉,原内容为:
#if 0__FBSDID("$FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:06 cperciva Exp [ DISCUZ_CODE_3 ]quot;);#endif#include <bzlib.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <err.h>#include <unistd.h>#include <fcntl.h>
替换后的内容为:
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <err.h>#include <unistd.h>#include <fcntl.h>#include <android/log.h>#include <jni.h>#include "bzlib.c"#include "crctable.c"#include "compress.c"#include "decompress.c"#include "randtable.c"#include "blocksort.c"#include "huffman.c"#include "com_smartapp_update_BatchUtils.h"
2.将main方法名称替换成applypatch
3.在文件内添加方法
JNIEXPORT jint JNICALL Java_com_smartapp_update_BatchUtils_patchApk(JNIEnv *env, jobject obj, jstring old, jstring new, jstring patch) { char * ch[4]; ch[0] = "bspatch"; ch[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0)); ch[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0)); ch[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0)); __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "old = %s ", ch[1]); __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "new = %s ", ch[2]); __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "patch = %s ", ch[3]); int ret = applypatch(4, ch); __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "applypatch result = %d ", ret); (*env)->ReleaseStringUTFChars(env, old, ch[1]); (*env)->ReleaseStringUTFChars(env, new, ch[2]); (*env)->ReleaseStringUTFChars(env, patch, ch[3]); return ret;}
第五步
修改Android.mk文件内容
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := SmartAppUpdateLOCAL_SRC_FILES := com_smartapp_update_BatchUtils.cLOCAL_LDLIBS := -lz -lloginclude $(BUILD_SHARED_LIBRARY)
第六步
右键点击项目 -> properties,在弹出窗中点击Buiders,选择New…,在新弹出窗中选择Program,点击OK,此时弹出一个Edit Configuration弹窗。
1.Name中填写SmartAppUpdateBuilder
2.选择Main标签,在Location一栏中点击Browse File System,选择你NDK安装路径下的ndk-build.cmd文件,Working Directory一栏中点击Browse Workspace,选择该项目的jni文件夹
3.选择Refresh标签,勾选Refresh resources upon completion,选择The entire workspace,勾选上Recursively include sub-folders
4.选择BuildOptions,勾选Allocte Console,After a “Clean”,During manual builds,During auto builds,Specify working set of relevant resources ,点击Specify Resources,在弹出窗中勾选该项目jni文件夹,点击Apply,点击OK,这样我们就能在Buiders列表中看见新建的SmartAppUpdateBuilder,点击OK
第七步
等待片刻,我们会发现在obj文件夹下自动编译出一些文件,而其中obj\local\armeabi下的libSmartAppUpdate.so文件就是我们需要的so文件,那么生成增量升级的so文件的教程到此为止。
如何去使用该so文件进行增量升级,请看 【第二节】android增量升级之使用so文件进行增量升级
下载地址:项目文件及工具(bsdiff-4.3,bzip2-1.0.6,SmartAppUpdateSo)
- [Android实例] 【第一节】android增量升级之生成so文件
- 【第一节】android增量升级之生成so文件
- 【第二节】android增量升级之使用so文件进行增量升级
- 用android studio 生成增量更新的.so文件
- Android Studio 更新升级之增量升级
- android生成so文件
- android生成so文件
- android增量更新中增量文件的生成和合并
- android增量更新中增量文件的生成和合并
- Android NDK生成so文件
- 16、Android 生成.so文件
- android studio之jni(上)生成so文件
- android studio之jni(上)生成so文件
- Android增量升级功能
- Android应用增量升级
- android 增量升级
- Android增量升级
- android 增量升级
- LeetCode:198. House Robber
- android ListView 几个重要属性
- opencv初探(一)——图像遍历的三种操作
- linux的sdio驱动编程
- maven学习进程-使用篇
- 【第一节】android增量升级之生成so文件
- Linux下的platform总线驱动(一)
- C++,为什么str=new char[strlen(s)+1];中要加一
- Android 项目结构
- 过滤器Filter典型应用
- RCNN SPP_net
- C++中引用与指针的区别(详细介绍)
- 对handler机制的回答
- 用mysql实现类似于oracle dblink的功能