当前位置:   article > 正文

Android .obb 详解_obb文件

obb文件

1.简介

在Android APP Bundle(aab)之前,上架Google Play 项目都是打包成APK上传,但是Google 对 APK大小是有限制的,刚开始是50M,后来扩展到100M,但是有些APK资源比较多,可能会大于100M, 基于这种情况,Google 允许上传一个额外的扩展文件,这个文件就是咱们今天要详解的.obb文件。每当您使用 Google Play 管理中心上传 APK 时,您都可以选择向 APK 添加一个或两个扩展文件。每个文件的大小上限为 2 GB,文件格式可以是您选择的任意格式。不过,为了节约下载时的带宽,我们建议您使用压缩格式的文件。从概念上讲,每个扩展文件扮演着不同的角色:

  • 扩展文件是应用必需的额外资源所在的主要扩展文件。
  • 补丁扩展文件是可选的,用于为主扩展文件提供小规模的更新。

尽管您可以按照您需要的方式使用这两个扩展文件,但我们建议您按如下方式使用:主扩展文件提供主要的资源,尽量不要更新;补丁扩展文件应该比较小,用作“补丁载体”,在每次发布重要版本时或根据需要进行更新。

不过,即使应用更新只需要新的补丁扩展文件,您仍然必须上传新的 APK 并在清单中更新 versionCode。(Play 管理中心不允许您将扩展文件上传到现有 APK 中。)

2.生成.obb

一般我们会把APP中一些大的资源,或者升级用的APK,先打包成一个zip, 比如名字为:MYOBB.zip   然后再对打包成的ZIP重命名成: main.versionCode.包名.obb   比如: main.22070479.cool.obb.android.obb

3.随着APK 一块把obb文件上传到Google Play Console:

打开Google Console后台,找到对应的项目:  https://play.google.com/console/u/0/developers

上传APK  

 

 上传完APK后  有个更多 点击更多,选择上传扩展文件(.obb)

 

 

 

 

 就这样把APK和obb文件一块上传到Google Play,内测用户就可以下载安装了,等测试的没问题就可以发布到正式线上环境了,当用户下载该APK时,我们上传的obb文件也会同步下载到手机中

4.下载APK的同时下载对应的obb文件

下载APK后 ,之前上传的obb文件也会同步下载下来,当 Google Play 将扩展文件下载到设备时,会将其保存到系统的共享存储位置。为确保应用的正常运行,请勿删除、移动或重命名扩展文件。如果您的应用必须自行从 Google Play 进行下载,那么您必须将文件保存到相同的位置。

下载下来后存放的位置:

根目录:getExternalStorageDirectory() + /Android/obb/<package-name>/XXX.obb

例如:

        String obb_filename = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/obb/" + getPackageName() + "/main.22070479.cool.obb.android.obb";

 这个时候打开APP后就开始解压使用obb文件了

5.解压并使用OBB中的文件:

首先APP要有读写权限才能对obb文件操作

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

拿到读写权限后开始解压obb:

  1. public void unZipObb(String srcFilePath, String dstFolderPath) {
  2. Log.d("MainActivity", "unZipObb : srcFilePath=" + srcFilePath + ", dstFolderPath=" + dstFolderPath);
  3. try {
  4. String obbFilePath = srcFilePath;
  5. if (obbFilePath == null) {
  6. Log.d("MainActivity", "unZipObb error : obbFilePath == null");
  7. return;
  8. } else {
  9. File obbFile = new File(obbFilePath);
  10. if (!obbFile.exists()) {
  11. //下载obb文件
  12. Log.d("MainActivity", "unZipObb error : !obbFile.exists()");
  13. } else {
  14. File outputFolder = new File(dstFolderPath);
  15. if (!outputFolder.exists()) {
  16. //目录未创建 没有解压过
  17. outputFolder.mkdirs();
  18. unZip(obbFile, outputFolder.getAbsolutePath());
  19. } else {
  20. //目录已创建 判断是否解压过
  21. if (outputFolder.listFiles() == null) {
  22. //解压过的文件被删除
  23. unZip(obbFile, outputFolder.getAbsolutePath());
  24. } else {
  25. //此处可添加文件对比逻辑
  26. Log.d("MainActivity", "unZipObb error : outputFolder.listFiles() != null");
  27. }
  28. }
  29. }
  30. }
  31. } catch (Exception e) {
  32. Log.d("MainActivity", "unZipObb error : Exception");
  33. e.printStackTrace();
  34. }
  35. }
  36. public void createDirectoryIfNeeded(String folderPath) {
  37. File folder = new File(folderPath);
  38. if (!folder.exists() || !folder.isDirectory()) {
  39. folder.mkdirs();
  40. }
  41. }
  42. public void unZip(File zipFile, String outPathString) {
  43. Log.d("MainActivity", "unZip " + zipFile.getName() + " to " + outPathString);
  44. try {
  45. createDirectoryIfNeeded(outPathString);
  46. ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFile));
  47. ZipEntry zipEntry;
  48. String szName;
  49. while ((zipEntry = inZip.getNextEntry()) != null) {
  50. szName = zipEntry.getName();
  51. if (zipEntry.isDirectory()) {
  52. szName = szName.substring(0, szName.length() - 1);
  53. File folder = new File(outPathString + File.separator + szName);
  54. folder.mkdirs();
  55. } else {
  56. File file = new File(outPathString + File.separator + szName);
  57. createDirectoryIfNeeded(file.getParent());
  58. file.createNewFile();
  59. FileOutputStream out = new FileOutputStream(file);
  60. int len;
  61. byte[] buffer = new byte[1024];
  62. while ((len = inZip.read(buffer)) != -1) {
  63. out.write(buffer, 0, len);
  64. out.flush();
  65. }
  66. out.close();
  67. }
  68. }
  69. inZip.close();
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. }
  73. }

6.拿到OBB中的文件,就可以使用解压出来的文件了:

  1. String srcPNG1 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/11.png";
  2. String srcPNG2 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/12.png";
  3. String srcPNG3 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/13.png";
  4. String srcPNG4 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/14.png";
  5. mChangeBTN.setOnClickListener(new View.OnClickListener() {
  6. @Override
  7. public void onClick(View view) {
  8. int position = mCount % 4;
  9. switch (position) {
  10. case 0:
  11. Glide.with(MainActivity.this).load(srcPNG1).into(mShowImageView);
  12. break;
  13. case 1:
  14. Glide.with(MainActivity.this).load(srcPNG2).into(mShowImageView);
  15. break;
  16. case 2:
  17. Glide.with(MainActivity.this).load(srcPNG3).into(mShowImageView);
  18. break;
  19. case 3:
  20. Glide.with(MainActivity.this).load(srcPNG4).into(mShowImageView);
  21. break;
  22. }
  23. mCount++;
  24. }
  25. });

总结:详细介绍了OBB的整个生命周期,从生成OBB----->上传Google Play ---->用户下载同步OBB ----->解压OBB ----->使用OBB中的文件

参考文档:https://developer.android.com/google/play/expansion-files#Overview

 OBB Demo  GitHub : https://github.com/JasonZhangHG/OBBDemo.git

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/463670
推荐阅读
相关标签
  

闽ICP备14008679号