一、概念
手机应用安装的方式有非常多,在移动端测试中,我们比较关注应用是全新安装,还是覆盖升级安装,因为这两不同的安装方式可能会带来一些隐藏比较深的问题。而对于一个在市场已经有大量用户的APP来说,升级安装应该是绝大多数用户选择的方式,在上个季度复盘覆盖安装导致的bug时,统计发现影响用户数量在80%以上,也就是说至少80%的用户是通过应用市场更新的。
覆盖安装,是指用户在不清除用户数据或本地缓存设置的情况下,对应用进行功能性的升级,在升级过程中,老版本所产生的用户数据需要正确迁移,才能保障用户升级后的功能可用性。
那么,移动应用的覆盖安装测试中我们需要关注哪些点?应用中功能很多,覆盖时不可能全部遍历,在每次的项目测试中,我们也不可能把项目用例都过一遍。因此,我们需要理清在应用覆盖安装过程中究竟做了什么操作以及会影响到哪些功能,那剩余不受影响的部分就是我们能够“减少工作量”的地方。
二、覆盖安装关注点
2.1应用安装过程
首先了解一下应用安装的四大步骤:
(1)拷贝apk到指定的目录:默认情况下,用户安装的apk首先会拷贝到/data/data/app下,用户有访问/data/data/app目录的权限,但系统出厂的apk文件会被放到/system分区下,包括/system/app,/system/vendor/app,以及/system/priv-app等,该分区需要root权限的用户才能访问。
(2)加载apk、拷贝文件、创建应用的数据目录:为了加快APP的启动速度,apk在安装的时候,会首先将APP的可执行文件(dex)拷贝到/data/dalvik-cache目录下,缓存起来。再在/data/data/包名目录下创建应用程序的数据目录(以应用包名命令),用来存放应用的数据库、xml文件、cache、二进制的so动态库等。
(3)解析apk的AndroidManifest.xml文件:在安装apk的过程中,会解析apk的AndroidManifest.xml文件,将apk的权限、应用包名、apk的安装位置、版本、userID等重要信息保存在/data/system/packages.xml文件中。
(4)显示icon图标:应用程序经过PMS中的逻辑处理后,相当于已经注册好了,如果想要在Android桌面上看到icon图标,则需要Launcher将系统中已经安装的程序展现在桌面上。
在应用安装过程中,主要涉及以下几个目录:
/data/app/包名: 代码程序安装目录,安装时会把apk文件复制到此目录下
/data/data/包名:存放用户数据的目录
不管是全新安装还是覆盖安装,程序代码目录/data/app/包名肯定是完全更新了的,但用户数据目录/data/data/包名则需要视业务而定,如果新旧版本对数据格式或内容要求一样,则用户数据目录不需要更新,但若新版本的数据格式不兼容旧版本,则需要将旧版本数据按新版本的格式进行迁移,这些数据变化所影响到的功能模块便是测试关注的重点。
2.2 主要的数据
对于一个应用来说,可能会用到的本地缓存有:
- sqlite本地数据库文件
- share preference配置的xml文件
- 其他文本或二进制文件
从数据库来看,其变更可以分为:
- 已有数据库表结构的增加、删除、修改
- 数据内容的更新
- 新增/删除数据库或表
对于其他文本或二进制文件,则需要根据业务使用情况而定了
三、小程序框架
3.1 所用数据库
对于小程序框架业务而言,用到了哪些本地缓存相关的呢?我们可以直接用adb shell命令查看,如果手机没有root,是无法查看/data/目录的,但如果安装的应用开启了debug模式,可以用run-as命令进入该数据目录,如下图所示
用户数据目录存放的文件非常多,具体业务用到哪些可以咨询下开发。但通常来讲,databases目录是存放sqlite数据库文件的,files存放普通文本文件,shared_prefs是一些xml文件。
从上图得知,小程序框架的数据库主要有ai_apps.db和ai_apps_pms.db两个数据库,但未root的手机,adb shell里无法直接执行sqlite3命令,如果想查看数据库内容,可以先用tar命令将databases目录打包,然后mv到/sdcard/目录,最后用adb pull到PC端,用sqlite3查看便可。如果有android studio可以用view → tools window → device file explorer,找到目录然后右键save as到PC机也行
拿到数据库.db文件后,就可以在pc端用sqlite3命令查看了,也可以安装一个sqlite studio软件。小程序框架用到的ai_apps库中有4个表,ai_apps_aps_data是百度的统计信息,由于我们有自己的pingback,所以无需关注,ai_apps_favorites,ai_apps_cloud_config是百度那边下发的一些云配置相关,看代码应该是已经弃用 ,剩下的favorites收藏表和history访问历史表,收藏即是更多菜单栏内 “添加到我的小程序”功能,访问历史是记录用户打开过的小程序列表,这两块功能在爱奇艺端已经单独实现,不依赖此本地数据库,所以也不需要关注
在ai_apps_pms数据库中,有extension表保存的是当前extension私有扩展js库的版本号信息,framework表保存的是swan core基础库版本信息,在安装或日常启动小程序时,会检测小程序js基础库最新版与当前本地缓存版本对比,若有更新,则更新本地的基础库。pkg_main和pkg_sub保存的访问过的小程序代码包的信息,在小程序再次启动时会优先用本地缓存包,同时会调接口检查是否有新版,若有新版,则下载新版小程序包并保存到本地,下次启动时便是新版代码了。swan_app是保存访问过的小程序的基础信息,主要是联合其他表使用。
这个数据库的操作代码全部位于swan-android,即百度开源的项目,对于宿主来说,基本不会去动,除了需要升级小程序框架外(同步百度最新的框架代码),如下是涉及到数据库更新表结构相关的代码。
因此综上所述,涉及到数据库相关的,我们可能要关注的功能有:
添加到我的小程序小程序访问记录- 基础库swan-core版本的更新
- 私有扩展库extension版本的更新
- 小程序代码包的下载和更新
- 小程序sub分包的下载和更新
3.2 所用缓存文件
小程序框架所用到的缓存文件集中在files/aiapps_folder和files/zeus/内,zeus目录是用来存放百度webview内核(支持同层渲染,针对小程序定制的webview,系统webview不支持),aiapps_folder内主要是访问过的小程序代码包、swan-core(基础库)、extension(私有api扩展库)、cloud_config(小程序配置信息,主要是配置的可访问域名信息),如下图所示
因此综上所述,涉及到缓存文件相关的功能有:
- 基础库swan-core js
- 私有扩展库extension js
- 小程序代码包的加载
- 配置的可访问域名信息
- 百度同层渲染webview内核的更新
四、总结
经过对小程序框架内所用数据库和缓存文件的分析,我们已经总结出可能需要验证覆盖安装case的功能。再以日常项目为维度出发,我们需重点关注覆盖安装的项目有:
- 框架升级
爱奇艺内一般不会紧随百度版本,所以框架升级一次一般会跨越百度多个版本,涉及功能变更较大,其数据库或使用的缓存文件格式可能会有所改变,因此必须验证覆盖安装 - 增加或更新私有API逻辑
增加或更新私有API,都会涉及extension.js的更改,该js文件有版本控制,全新安装时会使用新包内的js,而覆盖安装时会对比老版本,若检测到版本不变则不会更新,可能会导致新增或修改过的API不可用 - 百度同层渲染webview内核
目前百度webview内核存在云端,首次启动小程序会下载该so库放于本地,因此若涉及到更新webview内核时,需验证覆盖安装时,内核是否成功更新 - 百度发布新版本基础库
小程序在启动时,会检查基础库版本,若百度发布了新版本,则会下载更新本地库,也就是说基础库是保持和百度发版一致的