APK扩展文件及使用

本文详细介绍了Android应用APK扩展文件(.obb)的使用,包括扩展文件的基本知识、命名格式、保存位置、下载流程、规则与限制。每个APK可以有1个main扩展文件和1个patch扩展文件,每个文件最大2GB。文章指出,扩展文件主要用于存储大型数据,以避免超过50MB的APK大小限制。当Market下载APK时,通常会同时下载扩展文件,程序启动时应检测并处理扩展文件的缺失或下载。
摘要由CSDN通过智能技术生成

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               

转自:http://yunfeng.sinaapp.com/?p=342#ixzz1oKcXtA2c 

一、APK扩展文件基本知识

       Android Market (Google Play Store)中每个APK文件的最大限制是50MB。如果您的程序中包含大量的数据文件,以前您只能把这些数据文件放到自己的服务器上,当用户启动程序的时候让用户去下载。现在这些数据文件可以直接上传到Android Market了。在新的Market控制台上传App的时候,可以添加扩展文件了。

      下面就来看看什么时候该使用扩展文件,该如何使用?

      每个APK可以有2个扩展文件,每个文件最大限制是2GB。为了减少用户的带宽消耗,最好使用压缩格式文件吧。 这两扩展文件具有不同的用途:
第一个被称为 main (主)扩展文件,该扩展文件保护您程序中需要用到的附加数据;
第二个被称为 patch 扩展(修补)文件,该文件是可选的,并且应该只包含一些不同版本的补丁数据。

       当然您可以按照您需要的方式来使用这两个扩展文件,不过Android官方还是推荐把这两个文件的功能分开。main扩展文件包含核心数据,并且尽量不随程序版本的升级去修改;而patch扩展文件可以随程序版本的升级做修改。为了帮助大家理解具体的含义,我们使用一个地图App来解释下:
       比如 Google 地图程序需要包含一个离线地图数据包,这样可以方便用户离线查看地图,在程序发布的时候,可以把现有的离线数据包作为main扩展文件上传到Market。 然后过了半年Google地图更新了,新添加了一些刚刚修好的高速公路、新建立的商场 等信息,可以把这些新增的信息作为patch扩展文件使用。 这样Google 地图 1.0版本对应一个main扩展文件;而Google地图1.1版本对应一个main扩展文件和一个1.1版本的patch扩展文件;Google地图1.2版本对应一个main扩展文件和一个1.2版本的patch扩展文件。 这里面的main扩展文件是同一个文件而patch扩文件是随版本变化的。
       这样的好处就是当程序升级的时候, 用户不用重新下载main扩展文件了,只需要下载少量的新增文件即可,节省用户流量。

二、扩展文件的命名格式

       扩展文件可以使用任何文件格式(ZIP, PDF, MP4, 等)。不管任何文件格式Android都认为他们是obb(opaque binary blobs)文件,并且会根据如下文件命名规则来重命名扩展文件:
[main|patch].<expansion-version>.<package-name>.obb

main or patch
      指定文件是main扩展文件还是patch扩展文件,每个APK只能有一个main扩展文件和一个patch扩展文件。

<expansion-version>
       和第一次上传该扩展文件的APK文件的android:versionCode一致。后续版本的APK可以重用前面上传的扩展文件。
您程序的Java包名

<package-name>
      例如程序的版本为5,程序的包名为org.goodev.expansion.downloader。则上传的main扩展文件会被重命名为:
main.5.org.goodev.expansion.downloader.obb

三、扩展文件的保存位置

       当Android Market下载程序的扩展文件的时候会保存到系统的共享存储区。为了确保程序正常运行,您不能删除、移动或者重命名扩展文件。在某些设备上Market无法自动下载该扩展文件,那么您应该在程序启动的时候去下载该文件并且保存到同样的位置。
扩展文件保存位置如下:
<shared-storage>/Android/obb/<package-name>/

<shared-storage> 代表共享文件的目录路径,通过函数getExternalStorageDirectory()获取;
<package-name> APK的Java包名。
       对于每个App而言,该目录下最多只能包含2个扩展文件。一个是main扩展文件另外一个是patch扩展文件。当更新程序的时候,如果有新的扩展文件则新文件会覆盖旧的扩展文件。

       如果您需要解压缩扩展文件来使用,请注意不要删除该.obb文件,并且也不要把文件解压缩到该目录。您应该把解压缩后的文件保存到getExternalFilesDir()返回的目录下面。如果有可能的话,最好使用程序能直接读取的文件格式而不用再次解压缩文件了。Android开发团队提供了一个项目( APK Expansion Zip Library)可以直接读取ZIP文件中的内容而不用解压缩该文件.
需要注意的是:保存在系统共享存储区的文件,用户和其他APP也可以访问。

四、下载扩展文件的流程

      在大多数情况下,Market会在下载APK的同时去下载扩展文件。然而,在某些情况下Market无法下载扩展文件或者用户删除了以前下载的扩展文件,您的程序需要处理这种异常情况。当您的程序启动的时候,可以检测文件是否存在并且可以从Market上下载。

     开发者检查清单:

      您可以通过下面的清单来检查是否需要使用扩展文件

  • 1. 您的程序是否真的需要超过50MB的大小限制。在移动设备上空间是非常宝贵的,您应该尽可能减少App的大小。如果您仅仅是为了提供支持多种显示设备的图片资源的话,可以考虑使用发布多个APK的方式来减少每个APK的大小。
  • 2.判断哪些数据需要打包为扩展文件发布。
  • 3.在程序中添加访问共享存储区中扩展文件的代码
  • 4.在程序的启动Activity中添加检测扩展文件是否存在,以及下载扩展文件的代码

五、扩展文件的规则和限制

  • 1.每个扩展文件最大为2GB
  • 2.用户必需要从Android Market获取您的程序才能自动从Market中下载扩展文件
  • 3.当在您的程序中下载扩展文件的时候,Market每次都会为每个文件生成一个唯一的下载URL,该URL会在短期内失效。
  • 4.当你上传一个新的APK的时候,可以选择使用以前上传的扩展文件
  • 5.如果您使用多个APK文件来适配不同的设备,并且也希望使用多个扩展文件。为了获取一个唯一的versionCode和不同的Market filter, 您需要分别为每个设备上传不同的APK文件。
  • 6. 不能通过更新扩展文件来发布一个新的版本。
  • 7. 不要在obb/文件夹中保存其他数据
  • 8.不要删除或者重命名.obb文件

 

六、APK扩展文件使用实例

      要在App中使用扩展文件,需要两个附加的Android库项目:
      1)Google Market Licensing package
      2)Google Market APK Expansion Library package


      可以通过Android SDK Manager来下载,也可以直接通过如下链接下载:
https://dl-ssl.google.com/android/repository/market_licensing-r02.zip
https://dl-ssl.google.com/android/repository/market_apk_expansion-r01.zip

     下载完成后使用market_licensing-r02.zip文件中的目录google_market_licensing\library来创建一个库项目;然后使用market_apk_expansion-r01.zip中的google_market_apk_expansion\downloader_library来创建另外一个库项目。同时为了简化对ZIP格式扩展文件的处理,在market_apk_expansion-r01.zip文件中还包含了一个对ZIP文件处理的库项目:google_market_apk_expansion\zip_file。 如果您使用的扩展文件格式是ZIP,那么也可以创建这个库项目。

1. 声明需要的权限

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
< manifest ...>
     <!-- Required to access Android Market Licensing -->
     < uses-permission android:name = "com.android.vending.CHECK_LICENSE" />
  
     <!-- Required to download files from Android Market -->
     < uses-permission android:name = "android.permission.INTERNET" />
  
     <!-- Required to keep CPU alive while downloading files (NOT to keep screen awake) -->
     < uses-permission android:name = "android.permission.WAKE_LOCK" />
  
     <!-- Required to poll the state of the network connection and respond to changes -->
     < uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
  
     <!-- Required to check whether Wi-Fi is enabled -->
     < uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
  
     <!-- Required to read and write the expansion files on shared storage -->
     < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
     ...
</ manifest >

       注意:默认情况下,下载库项目需要的API level为4 而APK扩展ZIP库项目需要API level为5.

     准备工作完成后,下面来具体看看如何使用扩展文件。

2. 实现下载服务(Implementing the downloader service)

      为了实现在后台下载文件,下载库项目提供了一个Service实现,名称为DownloaderService。您应该继承自这个文件来实现您的下载服务。为了简化下载服务的开发,该DownloaderService还实现了如下功能:

  • 注册一个BroadcastReceiver来监听设备的网络连接状态的改变。如果网络连接断开就暂停下载;如果网络连接恢复就继续下载。
  • 安排一个 RTC_WAKEUP 通知,当下载服务被终结的时候可以通过该通知来启动下载服务
  • 生成一个通知(Notification )来显示下载的进度以及下载错误等状态
  • 允许您的程序手工的暂停和恢复下载
  • 检测共享存储区挂载了并且可用,在下载文件之前检测 文件是否已经存在、存储空间是否足够。如果出现问题就通知用户。

      您仅仅需要创建一个继承自DownloaderService的类,并且实现如下三个函数即可:
getPublicKey():您Market账号的 Base64 编码 RSA 公共密钥,可以通过如下网址获取:
https://market.android.com/publish/Hom

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值