A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 武汉-就业部 于 2017-8-11 12:15 编辑

1、背景
随着安卓应用的不断升级,应用的体积越来越大,这对于用户升级来说成了一个问
题。


2、原理
然后,手机端还会将当前的版本号传递给服务器,服务器端会根据老版本的apk和
新版本的apk生成相应的差分更新包,并且将差分更新包传递给手机端,手机端将
拿到的差分更新包和老版本的apk进行组合生成新版本的apk。


3、步骤

3.1、服务器端生成差分更新包
            进入dos界面,使用bisdiff差分工具根据老版本apk和新版本apk生成差分更新包,如图1:
           

1:bsdiff:生成差分更新包的指令
2:老版本的apk包
3:新版本的apk包
4:生成的增量更新包名
           3.2、从GitHub上下载谷歌的SmartAppUpdate的开源库,链接如下:
https://github.com/cundong/SmartAppUpdates
3.3、使用androidstudio编写native方法,代码如下:
/**
* Created by qiuzhiwei on 2017/3/22.
*/
public class PatchUtil {
static{
    System.loadLibrary("Patch");// 加载生成的.so文件
}
/**
* native 方法 合并老版本APK和升级包的方法
* @param oldApkPath   老版本的apk文件路径
* @param newApkPath   新版本apk文件存放的路径
* @param patchPath    升级包路径
* @return
*/
public static native int patch(String oldApkPath,String newApkPath,String patchPath);
}

3.4、build生成PatchUtil.class文件,javah指令生com_qiuzhiwei_patch_PatchUtil.h文件



3.5、将com_qiuzhiwei_patch_PatchUtil.h文件拷贝到jni目录中,并且删除原有的h文件,整理后的文件目录如下:



3.6、Android.mk和com_qiuzhiwei_patch_PatchUtil.c中的内容需要修改
                3.6.1、Android.mk内容如下:



                1:native代码中写的libarary名字,这里是Patch
                2:com_qiuzhiwei_patch_PatchUtil.c

       3.6.2、com_qiuzhiwei_patch_PatchUtil.c需要做出修改的内容如下:



3.7、在jni目录下,使用ndk-build指令生成对应的so文件





        因为市面上的手机cpu大多是64位的,所以我们需要生成对应的x86_64位的so文件。需要在jni’目录下添加Application.mk文件,我的设置是支持x86_64和armeabi(如果不设置默认生成全平台的so文件),内容如下:



3.8、将生成的so文件拷贝到androidstudio工程中,并使用java代码调用就可以了。同时将合成的新版本apk和老版本的apk的sha1值进行匹配,相同就可以安装了。


class MyTask extends AsyncTask<Void,Void,Integer>{
    @Override
    protected Integer doInBackground(Void... params) {
        String oldApkPath= Environment.getExternalStorageDirectory()+ File.separator+"iReader1.6.2.0(v35).apk";
        Log.i(TAG, "doInBackground: "+oldApkPath);
        String newApkPath= Environment.getExternalStorageDirectory()+ File.separator+"iReader1.8.0.1(v40).apk";
        String patchPath= Environment.getExternalStorageDirectory()+ File.separator+"iReader.patch";
        return PatchUtil.patch(oldApkPath,newApkPath,patchPath);
    }
    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        if (integer.equals(0)) {
            Toast.makeText(getApplicationContext(), "成功", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getApplicationContext(), "失败", Toast.LENGTH_SHORT).show();
        }
    }
}



4、不足
因为市面上的手,需要根据不同的版本生成不同的查分更新包,增加了服务器的操作成本。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马