码迷,mamicode.com
首页 > 移动开发 > 详细

Android studio下增量升级功能的NDK开发

时间:2016-04-26 20:02:11      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

最近研究Android应用的增量升级功能,期间涉及到了NDK开发的内容,整理记录在此。
先说几个问题。
一、NDK开发就是JNI开发啊,卧槽我原来都不知道啊,一直以为是两个东西啊......
二、关于开发环境,老的Eclipse版本要安装的工具比较多,什么NDK啊,cygwin啊什么,AS(Android studio首字母,以下皆以AS代替)就简单多了,直接装一个NDK就可以了。貌似AS从1.3版本就可以不装cygwin了,而我装的是2.0版本的,更不需要装。而且神奇的是,我安装NDK的时候没有翻墙,难道是因为google回归了。安装NDK的过程很简单,点击AS工具栏的技术分享按钮,在打开的Project structure窗口中选择SDK Location选项,就可以看到NDK的安装选项,没有安装的时候是可以选择下载安装或指定本地的安装路径的,但是我没有截图,只有一张安装好之后的效果图。
技术分享
然后开始开发步骤。以我开发的增量升级功能为例,顺带把增量升级讲一下。增量升级的原理就不说了,百度一下就可以,直接说怎么把增量升级合成到APP里。
一、先新建一个增量升级的工具类PatchUtil,定义一个本地方法patch。
package com.winter.updatedemo.utils;

public class PatchUtil {
    static{
        System.loadLibrary("patch");
    }

    public static native int patch(String oldApkPath, String newApkPath, String patchPath);
}

二、AS菜单栏,依次选择Build->Make Project。执行完之后,把Project栏切换成project视角,依次打开app->build->intermediates->classes->debug->com->winter->updetedemo->utils,可以看到该文件夹下有一个PatchUtil.class文件。com->winter->updetedemo->utils这一路径其实就是PatchUtil所在的包名,这个实际开发的时候请根据自己的包名找相应的路径。
三、然后我们用上面找到的.class文件,生成一个C/C++的头文件。
首先打开AS的terminal界面
技术分享
然后依次输入以下两个命令 cd app\build\intermediates\classes\debug   javah -jni com.winter.updatedemo.utils.PatchUtil,如下图:
技术分享
然后我们再看debug文件夹下,会 发现多出来一个com_winter_updatedemo_utils_PatchUtil.h文件,这就是我们需要的头文件。
技术分享
文件的内容我们打开看一下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_winter_updatedemo_utils_PatchUtil */

#ifndef _Included_com_winter_updatedemo_utils_PatchUtil
#define _Included_com_winter_updatedemo_utils_PatchUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_winter_updatedemo_utils_PatchUtil
 * Method:    patch
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_winter_updatedemo_utils_PatchUtil_patch
  (JNIEnv *, jobject, jstring, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif
里面声明了一个函数JNIEXPORT jint JNICALL Java_com_winter_updatedemo_utils_PatchUtil_patch(JNIEnv *, jobject, jstring, jstring, jstring);这个函数就是PatchUtil类里面本地方法的C实现。当然头文件里只是一个函数声明,接下来我们就要实现这个函数。
四、建立jni文件夹,把生成的头文件拷贝进去。在app\src\main文件夹下右键,依次选择New->Folder->JNI Folder,然后main文件夹下会生成一个新的文件夹jni,先把我们的头文件拷进去。
技术分享
五、接下来我们就需要用到bsdiff这个工具,bsdiff是一个开源的二进制差分工具,用来生成增量升级所需的差分包;与其相对应的bspatch则用来通过差分包合成新的APK包。对于客户端而言,我们只需要完成bspatch的功能就可以了,bsdiff的功能一般由服务端实现。另外,bsdiff依赖bzip2,所以我们分别把两个工具下载下来。
bsdiff下载地址:bsdiff下载地址
bzip2下载地址:bzip2下载地址
bzip2解压后又很多文件,但是我们用到的并不多,所以在jni文件夹下新建一个文件夹,把一下文件拷贝进去:
技术分享
然后把bspatch.c文件考到jni文件夹下。然后做以下修改:
1.找到第31行#include <bzlib.h>,改成#include "bzip2/bzlib.h"
2.在37行下面添加一行,新行内添加我们之前生成的头文件 #include "com_winter_updatedemo_utils_PatchUtil.h"
3.把main()函数的名称修改掉,改成applypatch()或其他名称
4.在bspatch.c文件末尾添加以下函数:
JNIEXPORT jint JNICALL Java_com_winter_updatedemo_utils_PatchUtil_patch(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));

	int ret = applypatch(4, ch);

	(*env)->ReleaseStringUTFChars(env, old, ch[1]);
	(*env)->ReleaseStringUTFChars(env, new, ch[2]);
	(*env)->ReleaseStringUTFChars(env, patch, ch[3]);

	return ret;
}
函数的名称和参数与com_winter_updatedemo_utils_PatchUtil.h一致,其实就是PatchUtil里patch()方法的C实现。
以上步骤完成后,我们再在jni文件夹下新建一个Android.mk文件,文件中的内容为:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE     := patch
LOCAL_SRC_FILES  := bspatch.c

LOCAL_LDLIBS     := -lz -llog

include $(BUILD_SHARED_LIBRARY)
OK,jni文件夹下的工作做完了。
六、最后修改下app文件夹下的build.gradle文件,在defaultConfig代码块中添加以下内容:
        ndk{
            moduleName "patch"
            ldLibs "z","log"
        }
这里有一点需要注意,moduleName是最后编译生成库的名称,当然,最终的.so文件会加一个前缀“lib”,例如上面的代码,编译后生成的.so文件的全名会是libpatch.so。另外,回头看一下PatchUtil类中的static代码块,调用了加载库文件的系统方法,其中的库文件的名称,与我们的moduleName是一致的,不要加任何前后缀。
七、所有的工作都结束了,patch方法已经可以被调用了,在Activity里起一个线程,调用PatchUtil.patch(),就可以进行APK包的合成了。
八、bsdiff下载地址中,除了可以下载bsdiff的源码,还可以下载windows环境下的.exe可执行文件,下载下来,我们就可以在本地手动生成差分包,而不需要依赖服务器了。
九、Demo下载地址稍后奉上。
十、疑问。听说Android的源码中也包含bsdiff的源码,那么Android有没有原生的增量升级的接口呢?

Android studio下增量升级功能的NDK开发

标签:

原文地址:http://blog.csdn.net/winter12071634/article/details/51249781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!