我是靠谱客的博主 重要蜜粉,最近开发中收集的这篇文章主要介绍Android .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文件操作:

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

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

   public void unZipObb(String srcFilePath, String dstFolderPath) {
        Log.d("MainActivity", "unZipObb : srcFilePath=" + srcFilePath + ", dstFolderPath=" + dstFolderPath);
        try {
            String obbFilePath = srcFilePath;
            if (obbFilePath == null) {
                Log.d("MainActivity", "unZipObb error : obbFilePath == null");
                return;
            } else {
                File obbFile = new File(obbFilePath);
                if (!obbFile.exists()) {
                    //下载obb文件
                    Log.d("MainActivity", "unZipObb error : !obbFile.exists()");
                } else {
                    File outputFolder = new File(dstFolderPath);
                    if (!outputFolder.exists()) {
                        //目录未创建 没有解压过
                        outputFolder.mkdirs();
                        unZip(obbFile, outputFolder.getAbsolutePath());
                    } else {
                        //目录已创建 判断是否解压过
                        if (outputFolder.listFiles() == null) {
                            //解压过的文件被删除
                            unZip(obbFile, outputFolder.getAbsolutePath());
                        } else {
                            //此处可添加文件对比逻辑
                            Log.d("MainActivity", "unZipObb error : outputFolder.listFiles() != null");
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.d("MainActivity", "unZipObb error : Exception");
            e.printStackTrace();
        }
    }

    public void createDirectoryIfNeeded(String folderPath) {
        File folder = new File(folderPath);
        if (!folder.exists() || !folder.isDirectory()) {
            folder.mkdirs();
        }
    }

    public void unZip(File zipFile, String outPathString) {
        Log.d("MainActivity", "unZip " + zipFile.getName() + " to " + outPathString);
        try {
            createDirectoryIfNeeded(outPathString);
            ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFile));
            ZipEntry zipEntry;
            String szName;
            while ((zipEntry = inZip.getNextEntry()) != null) {
                szName = zipEntry.getName();
                if (zipEntry.isDirectory()) {
                    szName = szName.substring(0, szName.length() - 1);
                    File folder = new File(outPathString + File.separator + szName);
                    folder.mkdirs();
                } else {
                    File file = new File(outPathString + File.separator + szName);
                    createDirectoryIfNeeded(file.getParent());
                    file.createNewFile();
                    FileOutputStream out = new FileOutputStream(file);
                    int len;
                    byte[] buffer = new byte[1024];
                    while ((len = inZip.read(buffer)) != -1) {
                        out.write(buffer, 0, len);
                        out.flush();
                    }
                    out.close();
                }
            }
            inZip.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    String srcPNG1 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/11.png";
        String srcPNG2 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/12.png";
        String srcPNG3 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/13.png";
        String srcPNG4 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhOOB/MYOBB/14.png";

        mChangeBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int position = mCount % 4;
                switch (position) {
                    case 0:
                        Glide.with(MainActivity.this).load(srcPNG1).into(mShowImageView);
                        break;
                    case 1:
                        Glide.with(MainActivity.this).load(srcPNG2).into(mShowImageView);
                        break;
                    case 2:
                        Glide.with(MainActivity.this).load(srcPNG3).into(mShowImageView);
                        break;
                    case 3:
                        Glide.with(MainActivity.this).load(srcPNG4).into(mShowImageView);
                        break;
                }
                mCount++;

            }
        });

总结:详细介绍了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

最后

以上就是重要蜜粉为你收集整理的Android .obb 详解的全部内容,希望文章能够帮你解决Android .obb 详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部