移动互联网实战--资源类APP的数据存储处理和优化

前言:
  对于资源类的APP, 其音频/图形占据了APP本身很大的比例. 如何存储和管理这些资源文件, 成了一个颇具挑战性的难点. 移动端的碎片化, 高中低端手机的并存, 需要开发者不光是具备基础的存储知识, 更需要基本优化的能力. 本文首先介绍手机硬件的基础, 后续会分别介绍存储方式, 资源打包, 最后以一个具体例子作结. 内容还是浅显, 望能抛砖引玉.

*) 硬件基础
  作为手机开发者人员, 你是否知道RAM/ROM/存储卡的区别? 而产商所宣传的运行内存, 机身内存又是什么?
1). RAM/ROM/存储卡
  RAM (Random Access Memory): 随机存取存储器, 相当于PC电脑的内存, 掉电数据会失去.
  ROM (Read Only Memory): 手机端的ROM不在限定于只读了, 事实上它包含三部分, 操作系统/系统软件/用户自由空间, 相当于PC电脑的硬盘
  存储卡: 是对RAM/ROM之外的存储扩展, 可以理解为PC电脑的移动硬盘/U盘
2). 产商所宣传的运行内存, 机身内存的概念详解
  运行内存: 运行内存就是RAM
  机身内存: ROM + 内置存储卡, 一般市面上移动端的16G/32G内存, 都是ROM+内置存储卡的组合
以小编拥有的联想VIBE Z K910手机为例

其具体的参数如下:

机身内存	16GB ROM
运行内存	2GB RAM

评注:
  产商一般使用1G=1000M, 而检测软件使用1G=1024M的单位, 因此实际用户能看到的数值小于产商所宣传的.
  该机型不能扩展外置SDCard, 但APP却能使用ExternalStorage来存放资源数据, 也从另一个侧面佐证了机身内存(ROM + 内置存储卡)的事实.

*) 存储方式

  在Android系统中, 数据的存储方式有如下四种: SharedPreference, SQLite, ContentProvider, File. 它们对应的目录以及存储介质各有不同, 现在小编一一道来.
  
  注: 此父路径为data/data, 此以豌豆荚的app的包名com.wandoujia.phoenix2目录为例, 其下包含shared_prefs/databases/files/caches,其属于ROM(用户空间)中.
1). SharedPreference
  SharedPreference是一种轻型的数据存储方式, 它的本质是基于XML文件存储Key/Value的键值对数据.通常用来存储一些简单的配置信息.其配置位置在/data/data/<包名>/shared_prefs目录下.
2). SQLite
  SQLite是一种轻量级的嵌入式数据库,以SQL形式组织和访问数据的方式总是给开发者更多的便利性.其数据的存储在data/data/<包名>/databases目录下.
3). ContentProvider
  ContentProvider是Android平台中,在不同应用程序之间实现数据共享的一种机制. 一个应用程序如果需要让别的程序可以操作自己的数据, 即可采用这种机制. 该种方式忽略了底层的数据存储实现.
4). File

  File是最简单的方式, 不过需要开发者自己去维护, 不同的存储介质/文件类型, 读取的方式不同.
  #) 资源文件

RAW类型:
Context.getResource().openRawResource(R.raw.<id>);
Asset类型:
Context.getResource().getAssets().open(<filename>);

  注: 该目录的文件大小不能超过1M.
  #) 数据区(/data/data/<包名>/files)
  其对文件的存取有特定的限制, 必须通过特定的api来访问

Context.openFileInput()
Context.openFileOutput()

  #) SDCard文件
  需要指定sdcard路径以及访问权限

Environment.getExternalStorageDirectory()
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

*) Apk的目录划分/安裝过程
  Android应用有两个目录: assets目录和res目录(以资源id的方式访问). 对于res/drawable, res/string, res/layout大家耳熟能详. 这边具体讲讲assets和res/raw的作用和区别. 当然res/xml也特殊目录, 其用于存储相关的xml文件.
  assets Vs res/raw

  二进制 支持目录 访问方式 文件格式限制
assets 不编译成二进制 任意深度的目录 以文件方式访问 除音频/图像文件外, 其他格式的文件需要压缩
res/raw 不编译成二进制 不支持子目录 以资源id的方式访问 没有这个限制

  Apk安装流程可以描述如下:
  1). Apk本身会复制到/data/app下
  2). Apk解压后的classes.dex复制到/data/dalvik-cache
  3). 在/data/data/<包名>/下, 创建cache/databases/files用于存储程序的应用数据
  注: 安装过程中, 资源文件(来自于res, assets)依旧存在apk包中, 当访问时是从apk包里读取出数据来.

*) 应用实例
  以一个资源类App语音电子书为例, 该App包含了大量的语音/图像资源. 当前所面临的难点在于:
  1). 如何存储这些资源?
  2). 如何去整理和组织这些资源?
  语音电子书应用, 有多本书构成, 为了有效管理, 需要按电子书来划分. 因此选用apk的assets来存储电子书资源, 另一方面, 每本电子书包含了大量的音频/图像文件, 因此按书对资源文件进行压缩打成zip包.

assets/book1.zip
assets/book2.zip
assets/book3.zip
...

  而具体每本电子书的资源组织如下:

book.zip
  |-----------> images      // 图像文件
  |-----------> musics      // 声音文件
  |-----------> desc.xml	// 用于描述图像和声音文件之间的关系

  Apk安装之后, 应用就从asset把zip包解压到sdcard中, 这样就能借用sdcard的大存储空间了.
  这边还有个问题, 就是电子书的元信息以及书架信息, 怎么维护呢?
  我们可以编辑一个xml文件去描述所以书籍的元信息, 同时维护书架信息, 然后把它搁置于apk的res/xml(华丽登场)中.

<books>
  <book>
    <name>致我们终将逝去的青春</name>
    <author>辛夷坞</author>
    <file>book1.zip</file>
  </book>
  ...
<books>

  这样整个资源类App,就这样合理的组织起来了.

总结:
  要编写好好的资源类app, 就需要对Android手机的硬件和存储方式有所了解, 这样才能合理的设计和优化.

移动互联网实战--资源类APP的数据存储处理和优化

时间: 2024-10-14 23:29:28

移动互联网实战--资源类APP的数据存储处理和优化的相关文章

心情日记app总结 数据存储+服务+广播+listview+布局+fragment+intent+imagebutton+tabactivity+美工

---恢复内容开始--- 结果截图如下: 第一张图是程序主界面,主要是显示记事列表的一些个事件.旁边的侧拉框是自己登陆用的.可以设置密码.可以查看反馈与关于等信息. 点击第一张图片下方的图标,会显示不同的内容,分别如下: 这四张图分别是添加心情,统计心情记录,设置闹铃,开启音乐.分别对应  添加心情模块.统计心情记录模块.铃声提醒模块.音乐播放器模块 按我的想法,此款app主要用来记录心情,而且可以边播放音乐边写日志.而且,还可以通过闹铃提醒我们写日志.而且,还可以统计我们最近的心情状态,为及时

wp8.1 Study10:APP数据存储

一.理论 1.App的各种数据在WP哪里的? 下图很好介绍了这个问题.有InstalltionFolder, knownFolder, SD Card... 2.一个App的数据存储概览 主要分两大部分,InstallationFolder和App Data Folder 3.Windows.Storage.ApplicationData  和  Windows.Security.Credentials简述 其中利用Windows.Storage.ApplicationData,我们可以获得3种

区块链Yottachain到底是如何改变数据存储模式?

互联网技术的发展日新月异,给我们生活带来了无限精彩和便捷.同时,随着5G网络.容器云.高性能存储硬件水平的不断提高,数据增长进入了空前的发展阶段.随处可用到的AR.VR.物联网.边缘计算机等等设备所产生的数据源源不断,就像开着的水管,数据源一直在流出.产生的数据将会以几何倍增加,这个时候区块链的存储技术就得以展现出来,在前几年开始区块链存储技术中有一个比较出色IPFS的项目. IPFS提供了一个非常出色的去中心化存储机制,将无数个不可信任的节点连接起来,却形成了非常可靠的存储系统,这就像比特币将

环境搭建 Hadoop+Hive(orcfile格式)+Presto实现大数据存储查询一

一.前言 以下简介摘自官方 Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰富,包括ZooKeeper,Pig,Chukwa,Hive,Hbase,Mahout,flume等.接下来我们使用的是Hive Hive简介 Hive 是一个基于 Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.    它把海量数据存储于 hadoop 文件

移动互联网实战--移动端音频和图形优化处理

前言: 移动端应用, 需要省电省流量(带宽), 大资源包对用户体验是有伤害的. 因此移动端开发需要精简资源(音频/图片), 但又要保证音频/图片质量. 本文着重讲述如何优化处理资源(音频/图片), 如何在高压缩比和高质量(音质/画质)之间进行折中和权衡. 本文涉及两大块, 一块为语音处理, 另一块为图像处理. 注: 本文主要面向移动端开发者, 利用编程去优化处理. 掺杂了小编(mumuxinfei)的不成熟观点和看法, 希望能抛砖引玉. *) 样例阐释:1. 构造应用场景把常规Wav格式的音频文

移动互联网实战--社交游戏的排行榜设计和实现(2)

前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重讲解Nosql在游戏排名榜中的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉. 秉承: 上一篇文章, 详见: 社交游戏的排行榜设计和实现(1) 进阶篇: 随着数据量/并发量的上涨, Mysql集群也呈现了一些疲态. (1). 数据库分库分表后

高仿新闻类APP频道管理功能,ItemTouchHelper的实践

转载请标明出处: http://blog.csdn.net/iamzgx/article/details/52843653 在上篇博客 简单仿TabLayout实现个性化Tab,让Tab展现多样化,通过HorizontalScrollView实现了类似TabLayout的功能,并且进行了红点提醒,数字提醒的拓展功能.这种功能在新闻类APP是很常见的,还有一种很常见的功能在上一篇博客结尾也提到过,也就是频道管理的功能.以常用的今日头条为例,频道管理功能效果图如下 仔细玩下这里的功能,这里最难的点应

移动互联网实战--社交游戏的排行榜设计和实现(1)

前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重于传统关系型Mysql的方案实现, 后续会讲解Nosql的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉. 需求分析 曾几何时, 微信版飞机大战红极一时. 各路英雄刷排名, 晒成绩. 不过该排名限制在自己的好友圈中, 而每个用户的好友圈各不一

工具类app存亡观察

每一个族群有每一个族群最爱的app,工具型的那种. 文/张书乐 对于模特张美荧来说,"等"字,曾经是她每天最常见的关键词.过去每次为了在网上分享自己的独家美照,她总是要等,等摄影师有空,等天公作美或摄影棚方便:拍完之后,继续等摄影师得空修片--往往这么一轮等待下来,一组新片,往往要一个月的周期才能折腾好. 现在,不用等了.和其他朋友没事吃个饭就拿美颜相机秀进朋友圈不一样,张美荧则是典型的美图手机和美拍双料粉,每天从衣柜里选择几件衣服混搭一下,就拿美图手机架好,调个定时,就能从容的自拍一