方式一:APP自身提示有更新,用户点击升级就在后面下载更新包
详细的请跳转:
以下是我的理解。
效果图:
第一步:存放资源的后台,存放一个包含最新版本信息的update.txt文件和一个.apk文件就够了!
第二步:获取到最新的版本号,然后与当前APP的版本号进行对比。如果低于最新版本,就开线程到下载地址中去下载。
从服务器中获得update.txt信息并解析出来变成一个对象的具体做法就不细说,这里假设已经获得了一个对象UpDateInfo的信息。
public class UpdateInfo { private String versionName; private int versionCode; private String description;//描述 private String url;//apk下载地址 }
文章头部的链接的作者通过判断两个版本的versionName是否相等来判断,不相等表示有新版本,一开始我觉得很不合理,到处查询也没有找到合理的,所以自己想了下面的办法,先去判断versionCode,再去把versionName去掉“.”,然后转换为int型比较,现在觉得好麻烦,同时也可能出现其他问题,细细想来,通过对比是否相等应该是可以实现的,因为你请求服务器的地址是唯一的,服务器上的升级一般都会让你上传升级后的安装包,然后覆盖掉版本低的那个apk,所以服务器上存在的要不就是和你正用的app的versionName相等的,不相等的就是版本更高的,我在360应用宝上上传过应用,如果升级就会覆盖掉之前的版本,不过,360里面也有一个降级处理,所以如果用相等去判断,也就顺发布者的意,想升级也可以,想降级也可以,
/** * 与当前版本好对比,是否需要升级 * @return */ private boolean isNeedUpdate(UpdateInfo info) { String versionName = info.getVersionName; // 最新版本的版本号 int versionCode=info.getVersionCode; int currentVersionCode=getCurrentVersion().getVersionCode;//获得 String currentVersionName=getCurrentVersion().getVersionName; if(versionCode>=currentVersionCode){//先判断VersionCode是否有更改,更改了一定版本变化 try{ int vName=Integer.getInteger(versionName.replace(".",""); int cVName=Integer.getInteger(currentVersionName.replace(".",""); if(vName>cVName){ return true; }else{ return false; } }catch (FormatException e){ return false; } }else{ return false; } } /** * 获取当前版本的软件信息 * @return */ private PackageInfo getCurrentVersion() { try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); return packageInfo; } catch (NameNotFoundException e) { e.printStackTrace(); return "版本号未知"; } }
方式二:Android APP增量升级的实现方式
详情跳转
自从 Android 4.1 开始,Google引入了应用程序的增量更新。
- 实现原理
增量更新的原理非常简单,就是将本地apk与服务器端最新版本比对,并得到差异包,用户更新App时只需要
下载
差异包。例如,当前安装新浪微博V3.5,12.8 MB,新浪微博最新版V4.0,15.4MB,经过对两个版本比较之后,发现差异只有7、8M,这时候用户更新的时候只需要下载一个7、8M的差异包便可,不需要整包下载15.4M的新版微博客户端。下载差异包后,在手机端使用旧版apk+差异包,合成得到微博最新版V4.0,提醒用户安装即可。
- 实现
以新浪微博客户端的升级为例,假设手机上安装的是V3.5,现在最新版是V4.0,用户需要从V3.5升级到V4.0。
弄清楚原理之后,我们就需要解决两个问题:
1.如何比对两个版本的apk生成差异包;
2.如何使用旧的apk+差异包,生成一个新apk;
(1)生成差异包
这一步需要在服务器端来实现,一般来说,apk有新版本之后,需要往后台管理端上传新apk,上传时就应该生成每一个旧版与最新版本的差异包。
假设,你的apk已经发布了3个版,1.0,2.0,3.0,这时候你要在后台发布4.0,在你上传时,就应该生成
1.0——>4.0的差异包;
2.0——>4.0的差异包;
3.0——>4.0的差异包;
(2)使用旧apk+差异包,在客户端合成新apk
差异包已经在服务器端生成,我们只需要在客户端提示用户有更新,然后让用户来下载差异包,下载成功之后,
使用本地apk与差异包,生成新版apk。
这一步需要在Android应用中开发。
1.首先NDK编译出一个*.so,APKPatch工程负责生成 libapkpatch so,生成的so文件位于APKPatch/libs/libapkpatch.so下,其他Android工程便可以使用该so文件来合成apk。
2.调用该so文件。
任意一个Android工程,使用该so文件,拷贝至libs\armeabi中,便可以调用patch()方法,来和成旧apk+差异包。
附件中,test工程,就是一个调用该so文件的例子 。
- 注意事项
1.新包和成之后,还需要对合成升级版本的apk包及最新版本apk包进行
MD5
或SHA1校验,如果校验码不一致,说明合成过程有问题,新合成的包将不能被安装。
2.增量升级成功的前提是,用户手机端必须有能够让你拷贝出来且与你服务器用于差分的版本一致的apk,这样就存在,例如,系统内置的apk无法获取到,无法进行增量升级;对于某些与你差分版本一致,但是内容有过修改的(比如 破解 版apk),这样也是无法进行增量升级的,为了防止合成补丁错误,最好在补丁合成前对旧版本的apk进行校验,保证基础包的一致性。