本帖最后由 武汉-就业部 于 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、不足
因为市面上的手,需要根据不同的版本生成不同的查分更新包,增加了服务器的操作成本。
|
|