Android 增量更新指南

导论:
网络的资料太散乱,看的我都糊涂,这次我自己参考了各位大神的文章,在这里总结了一下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,弹出如图所示安装提示就说明成功了.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ware00/article/details/70833192