【第二节】android增量升级之使用so文件进行增量升级_通过app升级 android 系统中的so文件-程序员宅基地

技术标签: android  Android 增量升级  

该篇文章从eoeAndroid搬迁过来的,原文地址:【第二节】android增量升级之使用so文件进行增量升级

前言

在第一节中,我讲了如何生成增量升级的so文件,没看的童鞋点【第一节】android增量升级之生成so文件 ,在这一节中,我讲一下如何去使用so文件进行增量升级。

第一步

建立一个新项目,如SmartAppUpdate,包名命名为com.smartapp.update,为什么要这么命名包名,是因为在第一节中,我们的BatchUtils文件是建立在com.smartapp.update包下的,而里面native方法生成的com_smartapp_update_BatchUtils.h文件也是以此包名命名的,所以为了调用so文件中的该native方法,所以我们需要在新项目中增加com.smartapp.update包,并将第一个项目中的BatchUtils.java文件拷贝到该包下

第二步

因为BatchUtils.java中的native方法是私有方法,所以我们需要在该类中增加下面的方法去调用该方法

        public static int applyPatchToOwn(Context context, String newApkPath,
                        String patchPath) throws IOException {
                String old = context.getApplicationInfo().sourceDir;
                return patchApk(old, newApkPath, patchPath);
        }

第三步

在新项目中的libs文件夹下新建文件夹armeabi,并将libSmartAppUpdate.so文件拷贝到该文件夹下,并在MainActivity.java类中增加以下代码,去加载该so文件

 static {
                System.loadLibrary("SmartAppUpdate");
        }

第四步

添加逻辑代码,在项目中,我做了两个布局,分别是升级前的和升级后的展示界面,升级前的界面为activity_main.xml,升级后的界面为activity_main_new.xml,在onCreate方法中注释不同的代码实现不同的界面效果。

@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                beforeUpdate();
afterUpdate();
        }

新增Utils类添加相应的一些方法。
新增UpdateApkTask类进行旧apk和差异包合成操作。(备注:该差异包需要手动拷贝到手机指定路径下)

不要忘记添加权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第五步

用工具去生成差异包,并拷贝到手机指定路径下,在此提供一个window电脑使用的差分差异包工具bsdiff4.3-win32,请在附件中下载。该工具何以进行差分差异包,也可以进行合并就apk和差异包生成新apk。具体使用方法如下:

先获取两个不同的apk,如该项目中先在oncreate方法中注释掉afterUpdate()方法,生成一个apk,然后再注释掉beforeUpdate()方法,生成另一个apk,将两个apk拷贝到电脑指定路径下。

然后打开cmd,进入到bsdiff4.3-win32工具所在位置

拆分差异包命令如下:

bsdiff  旧apk地址  新apk地址 生成差异包地址
如:bsdiff C:\Users\krubo\Desktop\aaa\SmartAppUpdate.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate_new.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate.patch

我们就能看见在指定位置下生成了差异包SmartAppUpdate.patch

合成新APK命令如下:

bspatch 旧apk地址 新apk地址 差异包地址
如:bspatch C:\Users\krubo\Desktop\aaa\SmartAppUpdate.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate_new_patch.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate.patch

我们就能看见在指定位置下生成了新apk SmartAppUpdate_new_patch.apk

比较SmartAppUpdate_new.apk和SmartAppUpdate_new_patch.apk,就会发现,这两个apk是一模一样的。

第六步

将第五步中生成的差异包SmartAppUpdate.patch拷贝到手机的指定路径下,然后安装旧的apk,也就是注释掉afterUpdate()方法生成的apk,然后点击升级按钮,等待片刻,我们就能看见新apk安装界面,安装完成后,点击进入,发现里面的界面已改变,至此,使用so文件进行增量升级教程已结束。

下一节内容:【第三节】android增量升级之提供服务端代码,整理项目

下载地址:项目文件及工具(bsdiff-4.3-win32,apk,SmartAppUpdate)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/krubo1/article/details/50463146

智能推荐

node、 node-sass 和sass-loader的版本对应问题_node-sass 版本-程序员宅基地

文章浏览阅读2.1k次。错误产生原因:node、 node-sass 和sass-loader的版本对应问题。_node-sass 版本

Java中的静态和非静态(有代码实例,超详细!)_java 静态-程序员宅基地

文章浏览阅读1.8k次,点赞10次,收藏39次。静态变量和方法是属于类的,而不属于类的实例或对象。它们可以通过类名直接访问,不需要创建对象。因此,静态成员常常用于描述与类本身有关的信息,比如常量、工具方法等。例如,Math类中的PI常量和abs()方法都是静态的。非静态变量和方法则是属于类的实例或对象的。它们必须依赖于对象的状态,才能进行相应的操作。因此,非静态成员常常用于描述类的实例状态,比如具有不同属性的学生或员工对象。例如,一个Person类中的name和age变量就是非静态的。_java 静态

关于tecplot动画的制作_tecplot动图-程序员宅基地

文章浏览阅读1.2w次。原文地址:关于tecplot动画的制作作者:Cherry参考文献一:http://hi.baidu.com/zhaoyj_111/blog/item/7939c318bb71e37cdab4bdbe.htmltecplot——画等高线和做动画的流程2008-10-10 11:22 Tecplot构筑结构网格有两种方式:point format和blockformat。_tecplot动图

在Ubuntu16.04中安装nvidia驱动_nvlink ubuntu-程序员宅基地

文章浏览阅读918次。对于双显卡(intel集显 + nvidia独显)的电脑,安装windows10和ubuntu 双系统时,往往会因为ubuntu中缺少 nvidia 驱动而出现各种启动问题。本文讲述的就是在ubuntu16.04上安装nvidia驱动,来解决前面提到的问题。第一步:从英伟达(nvidia)官网上下载相应的驱动文件,文件后缀名为.run。我的电脑是联想小新的,快捷键要在同时按下 键盘上的 Fn 键..._nvlink ubuntu

ubuntu使用docker_ubuntu进入docker-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏4次。docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现。_ubuntu进入docker

线程安全和可重入函数的区别与联系-程序员宅基地

文章浏览阅读75次。一、线程安全线程安全:如果一个函数在同一时刻可以被多个线程安全的调用,就称该函数是线程安全的。不需要共享时,请为每个线程提供一个专用的数据副本。如果共享非常重要,则提供显式同步,以确保程序以确定的方式操作。通过将过程包含在语句中来锁定和解除锁定互斥,可以使不安全过程变成线程安全过程,而且可以进行串行化。很多函数并不是线程安全的,因为他们返回的数据是存放在静态的内存缓冲区中的。..._可重入函数与线程安全的区别与联系

随便推点

用户画像步骤_如何通过20个步骤破坏良好的用户体验-程序员宅基地

文章浏览阅读1.5k次。每天我们都会访问几个新的或熟悉的站点,并遇到一些不同的体验。 有时候,您可能会感到愉快而普通,但是如果不幸的话,您会获得彻头彻尾的糟糕经历。 是什么使一种体验比另一种体验更好? 网站不一定是出色设计的巅峰之作。 它的信息不必比维基百科更多; 良好的用户体验是它所需要的(并且不要低估这有多困难) 。 现在要开发一个简单明了的用户体验,需要花费大量的工作-如果没有,那么像Apple这样..._优雅地失败 web

【前端基础小案例】HTML+CSS实现酷狗音乐热榜效果_酷狗音乐html和css代码-程序员宅基地

文章浏览阅读3k次,点赞11次,收藏67次。超级简单的案例_酷狗音乐html和css代码

【水声通信】OFDM-QPSK水声通信仿真(含误码率检测)【含Matlab源码 3954期】_水声相控阵仿真-程序员宅基地

文章浏览阅读786次,点赞20次,收藏21次。OFDM-QPSK水声通信仿真(含误码率检测)完整的代码,方可运行;可提供运行操作视频!适合小白!_水声相控阵仿真

Android中Editext响应回车键事件_android edittext 回车事件-程序员宅基地

文章浏览阅读182次。Editext 按键响应回车事件事件。_android edittext 回车事件

iSCSI存储系统知识详解_iscsi目前发展状况-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏25次。原文:https://community.emc.com/docs/DOC-33815SCSI 即 小型计算机系统接口 。小型计算机系统接口(英语:Small Computer System Interface; 简写:SCSI),一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。SCSI是一种智能的通用接口标准。它是各种计算机与外部_iscsi目前发展状况

C# 不能引用命名空间_hybridclr 引用不了c#的命名空间-程序员宅基地

文章浏览阅读701次。C# 不能引用命名空间_hybridclr 引用不了c#的命名空间

推荐文章

热门文章

相关标签