您的位置:首页 > 移动开发 > Android开发

Android 增量更新指南

2017-04-26 22:12 197 查看
导论:

网络的资料太散乱,看的我都糊涂,这次我自己参考了各位大神的文章,在这里总结了一下android studio工具,基于windows平台下的Android增量更新开发,并附有详细的操作步骤,若有错误还请批评指正,对于大神们的文章我就不在这一一列举了,若有疑问,还请海涵

概念:

android开发中,软件需要不断的开发和升级新功能,但是该应用不是几兆的大小,现在网速够用但是流量还很贵,因此为了客户能享受最新的版本,那我们就可以通过增量更新来帮助他们升级并有更好的体验

原理:

1:在用户手机上提取当前应用安装信息,即old.apk信息(发生在android手机端),

2:通过bsdiff工具让old.apk和new.apk生成增量文件,比如名称叫PATCH.patch(这是远程服务器做的事情)

3:Android手机端从服务器下载增量文件PATCH.patch到本地并自动与old.apk合并后完成安装(发生在android手机端)

步骤:

1:配置NDK:

A: Android studio支持NDK builder和CMake,其中CMake是推荐的方法,现在我们开始搭建三个依赖,点击Tools-android-SDK Manager-Appearance & Behavior-system setting-android SDK–SDK Tools-选中CMake,LLDB,NDK之后单击OK,剩下的Gradle会帮助我们编译好

B:设置NDK环境变量:

在我的电脑-属性-高级系统设置-高级-环境变量-系统变量path后面接着添加NDK安装路径(;C:\Android\sdk\ndk-bundle)

2:新建Project(IncreaUpdate),过程中需要勾选(Include C++ Support),定义包名com.aile.activity,新建MainActivity,代码如下:

public class MainActivity extends AppCompatActivity {
private Button mBtnPatch;
//PATCH.patch和Newer.apk存放路径
final File newApk = new File(new File("/storage/emulated/0/aile"), "Newer.apk");
final File patch = new File(new File("/storage/emulated/0/aile"), "PATCH.patch");

//native方法
public static native int bspatch(String oldApk, String newApk, String patch);

//静态加载库
static {
System.loadLibrary("bsdiff");
}

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnPatch = (Button) findViewById(R.id.id_btn_patch);
mBtnPatch.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
patch();
}
});
}

//合并成功后并开始安装apk
private void patch() {
bspatch(extract(this),
newApk.getAbsolutePath(),
patch.getAbsolutePath());
if (newApk.exists())
install(this, newApk.getAbsolutePath());
}

//获取当前用户apk安装信息
public static String extract(Context context) {
context = context.getApplicationContext();
ApplicationInfo applicationInfo = context.getApplicationInfo();
String apkPath = applicationInfo.sourceDir;
return apkPath;
}

//安装指定apk
public static void install(Context context, String apkPath) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.fromFile(new File(apkPath)),
"application/vnd.android.package-archive");
context.startActivity(i);
android.os.Process.killProcess(android.os.Process.myPid());
}

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 2) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
patch();
}
}
}
}


3:修改app/module的build.gradle和local.properties

ndk {
moduleName = 'bsdiff'
}


ndk.dir=C\:\\Android\\sdk\\ndk-bundle
sdk.dir=C\:\\Android\\sdk


4:在app/src/main新建jni文件夹,下载bsdiff-bsdiff-4.3和bzip2-1.0.6.tar,分别将bspatch.c和bzip除了.h和.c结尾的文件之外都删除连着文件夹同级别放入jni目录,如图:

http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz

http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz



5:打开bspatch.c文件,开始修改代码,并且将一处main改为patchMethod即可,其他开头如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <err.h>
#include <unistd.h>
#include <fcntl.h>
#include <jni.h>
#include <err.h>
#include "bzip2/bzlib.h"
JNIEXPORT jint JNICALL Java_com_aile_activity_MainActivity_bspatch
(JNIEnv *env, jclass cls,
jstring old, jstring new, jstring patch){
int argc = 4;
char * argv[argc];
argv[0] = "bspatch";
argv[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));
argv[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));
argv[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));
int ret = patchMethod(argc, argv);
(*env)->ReleaseStringUTFChars(env, old, argv[1]);
(*env)->ReleaseStringUTFChars(env, new, argv[2]);
(*env)->ReleaseStringUTFChars(env, patch, argv[3]);
return ret;
}


6:这个时候我们就可以验证增量更新了,首先build-generate sign apk填写信息后生成APK,取名old.apk,然后我们为了区别old.apk,我们可以修改下代码,比如在布局文件activity_main再添加一个button,然后再build-generate sign apk生成另外一个新的APK,取名new.apk,因为没有服务器和我的手机又没有SDcard,所以只能放在本地内部存储卡上,也就是目录(/storage/emulated/0/aile)里

7:下载bsdiff4.3-win32工具,用来生成增量文件和合成新的apk,下载完解压后,可以看到有两个可执行文件bsdiff.exe和bspatch.exe

http://download.csdn.net/download/qwd108114/9704758

8:将old.apk和new.apk放入bsdiff4.3-win32中,打开window 终端

—通过bsdiff 生成PATCH.patch增量文件

cd C:\Users\Aile\Desktop\bsdiff4.3-win32
bsdiff old.apk new.apk PATCH.patch


—通过bspatch 合成新的apk

cd C:\Users\Aile\Desktop\bsdiff4.3-win32
bspatch old.apk new2.apk PATCH.patch


—通过certutil -hashfile可以查看MD5值,不出差错,是一样的

certutil -hashfile new.apk MD5
certutil -hashfile new2.apk MD5


9:最后一步就是验证,我们把old.apk和增量文件放入指定路径下,比如/storage/emulated/0/aile,先安装old.apk,也就是模拟用户已经安装的应用,PATCH.patch文件模拟从服务器端下载到本地的文件,我们单击安装好的apk的update按钮,就会自动调用PATCH.patch,弹出如图所示安装提示就说明成功了.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息