一种Android 应用软件的分包实现方案
文/张凯
摘要:部分手机应用程序因包含了较多的音视频及图片资源导致安装包体过大,该类软件在较低运行内存的手机上存在安装失败的问题。本文通过研究Android 系统的特性及其资源加载方式,设计并实现了一种针对此类问题的分包解决方案。将该类软件分割为主程序和一个或多个资源安装包的形式,既解决了大包体软件的安装问题,又有利于软件的发布和更新。
【关键词】Android 应用软件 系统1
引言
随着用户数量的增长和手机硬件的升级,在Android 手机上可实现的功能越来越多,各大电子市场的手机应用数量也在持续爆发性增长。新的应用程序为了追求更高的品质、更酷炫的效果或更好的用户体验,需要在程序中添加大量的图片及音视频资源,应用安装包也在持续的变大。而用户的手机更新并不会太快太频繁,在1 年前发布的机型主流内存只有512M 甚至更少,这部分手机在用户中的留存率还比较高。部分应用程序根本无法安装。本文提出了一种有效的分包方案解决程序在低内存手机上的安装问题。
2 需求分析
笔者日前开发了一款可运行在Android 手机上的小学汉字学习软件,为了提高软件品质,内容包含了许多汉字及例句的真人读音,加上汉字的图片资源,其总包体大小已经超过100M。该软件运行时并不需要较多资源,可流畅运行于各种低内存手机上。本文设计并实现了一种可行的手机软件分包方案,该方案可以用来解决手机软件开发中遇到的此类问题。
3 软件分包方案的设计与实现
该方案的实现主要有以下几个步骤,首先将所有的音频资源按照课本进行分组,在开发环境中为每一册课本建立一个Android项目。然后将每份资源放入对应项目的assets目录中,每个项目都可以生成一个独立的可安装可运行的手机应用程序,最后将每个项目分别打包。这样就将一个约120M 的手机软件巧妙地分成了4 个安装包,每个约在10~30M,在低运行内存的手机上就不会再出现安装失败的问题。
那么主程序如何获取音频包的的资源呢? Android 系统的特性允许应用可以跨应用获取和访问资源。在本方案中, 通过createPackageContext() 方法可以获得指定音频包的上下文对象,这个上下文同音频包运行时的上下文是一样的,包含了同样的资源和类的加载。获取到音频包的上下文对象后,我们通过调用getAssets() 获取到音频包的资源管理器AssetManager 的一个实例对象。之后通过调用该对象的openFd() 方法获取到所需要音频资源的文件句柄。拿到所需音频文件的句柄之后,可以调用系统MediaPlayer 类对象进行音频文件的播放。因此,只要将上面的主程序及各音频包分别安装,用户在使用该程序时和使用一个完整安装120M 的大程序没有任何体验上的差别。
4 资源包与主包的相互检测与引导安装
该分包方案不仅解决了软件安装失败的问题,而且还有利于软件的推广和更新。在主程序和各个资源包中都增加了相互检测和引导下载安装的机制。主程序在使用过程中,如果用户学习到了某个新的课程,而此时该课程的音频资源包还未安装,主程序获取该课程音频失败,此时会弹出对话框提示用户去下载该课程的音频包,如图1 所示。
每一个音频资源包都有检测主程序是否存在的机制,当用户点击音频包的运行图标时,首先通过图3 代码来检测主程序是否存在:其中MAIN_PACKAGE_NAME 是主程序的包名,如果主程序存在,则在点击音频包运行图标后直接跳转打开主程序;如果主程序不存在,则程序可以捕获到该异常,并弹出提示框,如图2 所示,询问用户是否去下载并安装主程序。
5 总结
本文提出了一种针对较大包体手机应用程序的分包设计及实现方案,一方面很好地解决了在低内存手机上安装失败的问题,方便用户的安装使用;另一方面,将一个应用程序分为多个安装包放入电子市场,各个应用之间互相推广和引导,增加了软件的曝光率和下载量,并且有利于软件的推广及更新维护。
参考文献
[1] 李欧. 实战Android 应用开发[M]. 北京:清华大学出版社,2012.
[2] 李兴华. 名师讲坛-Android 开发实战经典[M ]. 清华大学出版社,2012.30-200.
[3] 陈星, 江兰帆. 基于 GoogleAndroid 平台的移动开发研究[J]. 福建电脑,2008.
作者单位
广东交通职业技术学院 广东省广州市510650