Android扩展文件

时间:2013-01-03 13:09:18

标签: android zip apk unzip apk-expansion-files

我正在尝试使用包含~80mo的PNG的应用程序(这是一个离线应用程序,因此我必须将它们存储在手机上)。

该应用程序在本地完美运行,但我无法上传apk> 50mo。所以我试图实现一个包含所有PNG的扩展文件。所以我在Linux上使用这个简单的命令:{/ 1}}在我的/ res / drawable-mdpi上创建我的扩展文件,然后手动将其放到_zip_ -0 _main.1.com.ctai.irisst.zip_ *_.png_
然后,我使用this code解压缩手机存储上的所有数据,但是当我启动应用程序时,我只得到10秒的空白屏幕,然后Android告诉我应用程序没有响应。我可以在文件资源管理器中看到~10个PNG图像被解压缩,而/Android/data/com.ctai.irisst/每秒提取1个文件。 (如果我使用缓冲区,加载我的应用程序仍然需要> 20秒)

我已经实现了以下库:

Logcat

但我暂时没用过它。 (我应该?怎么样?)

我的问题很简单,如何在不干扰用户体验的情况下创建扩展文件并使用我的图片?我没有找到关于扩展文件的这么多教程,也没有示例项目,所以我有点迷失。

3 个答案:

答案 0 :(得分:3)

您无需解压缩您的包裹。您可以使用以下内容阅读扩展ZIP文件中的所有PNG:

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

<强> **编辑**

请注意,在上面的代码中, InputStream 将指向您的ZIP存档中的文件,而不是ZIP文件本身。例如,如果您将 flower.png 放在ZIP存档中名为 background 的目录下,则可以按如下方式为该文件创建一个InputStream:

InputStream fileStream = expansionFile.getInputStream("background/flower.png");

<强> **编辑**

我认为您放置ZIP文件的位置不正确。根据开发人员指南:

  

如果您的包名是com.example.android,则需要创建   目录Android / obb / com.example.android /在共享存储上   空间。

成功测试后,您可以通过开发人员控制台上传扩展ZIP和APK。

您是否阅读了APK Expansion Files?这很简单。

答案 1 :(得分:1)

这篇帖子中有些人提供了一些helfull信息,因为有些内容在apk扩展工作方式上有所改变,而且如果你使用Android Studio来使这些库发挥作用。

注1

您无法再使用草稿作为获取扩展文件的链接尚未激活。您必须先使用扩展文件将版本上传到Alpha或Beta。 (只能从您上传的第二个apk中添加扩展文件)因此,请确保在单击APK下的开发人员发布部分中的详细信息时看到列出的apk扩展文件。

注2

如果您正在使用android studio并希望使用下载程序库,请不要将程序包名称和java文件复制到您自己的应用程序src目录中。在eclipse中导入下载程序库并选择export =&gt; gradle构建文件。之后,您可以将该库导入为android studio中的模块。

注3

不确定这一点,但我认为至少需要通过Play商店下载应用程序一次,并且可以通过测试设备上的帐户访问该应用程序。因此,如果您正在使用alpha创建一个google +测试组并添加自己或其他测试设备。

<强>顺便说一句

使用这些库,可以很容易地实现apk扩展下载,只需确保:

  1. 您的活动(您要实施下载的活动) 没有完成下载时扩展包的 自动)实现IDownloaderClient。

  2. 您设置了服务&amp;接收器并将其设置在清单中。

  3. 服务类中的BASE64_PUBLIC_KEY是正确的。上传 第一个apk =&gt;查看开发人员控制台中的服务和API 在你的app =&gt;下此应用的许可证代码。

  4. 此代码用于查看是否可以在设备上找到扩展文件:

    boolean expansionFilesDelivered() {
        for (XAPKFile xf : xAPKS) {
            String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
            Log.i(TAG, "Expansion filename " +fileName);
            if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
                return false;
        }
        return true;
    }
    

    它使用类XAPKS,它代表一个扩展文件,无论是主文件还是补丁文件,具有特定的文件大小(字节)并与apk版本(首次添加的版本)相关联。

    private static class XAPKFile {
            public final boolean mIsMain; // true
            public final int mFileVersion; //example 4
            public final long mFileSize; //example 126515695L
            // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size
    
            XAPKFile(boolean isMain, int fileVersion, long fileSize) {
                mIsMain = isMain;
                mFileVersion = fileVersion;
                mFileSize = fileSize;
            }
        }
    

    使用谷歌提供的zip工具(com.android.vending.zipfile)直接从扩展文件中读取电影文件和其他内容也非常容易。

    首先使用库中提供的方法获取扩展文件,paremeters是整数,代表你的主要扩展apk版本(你需要扩展包的apk版本首次添加)和补丁apk版本。

    ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);
    

    视频

    直接从此zipresourcefile播放视频:

    AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);
    

    现在从这个assetFileDescriptor你可以得到一个FileDescriptor并在你的媒体播放器中使用它,正确的语法让你的媒体播放器播放视频也需要第二个和第三个参数..无论你是从起始设置得到的起始时间和长度AssetFileDescriptor。

    player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());
    

    其他

    对于所有其他内容(如图像),您只需获取zipresourcefile的输入流:

    expansionFile.getInputStream(pathToFileInsideZip);`
    

    另外请确保您不压缩拉链中的视频以使其正常工作! 例如,不压缩.mp4文件:

    zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
    

答案 2 :(得分:0)

即使是zip文件,它仍然需要存储在obb文件夹中。