在 Android 应用程序之间共享不可变文件

Posted

技术标签:

【中文标题】在 Android 应用程序之间共享不可变文件【英文标题】:sharing immutable files between android apps 【发布时间】:2016-11-28 22:46:22 【问题描述】:

我写了2个app,数据是从网上下载的。

由于这些数据(大约 40Mb,在几个 zip 文件中)是相同的,我想在 2 个应用程序之间共享它,以便它消耗更少的带宽和更少的用户存储空间。

目前,我还没有找到好的解决方案:

原来,我把数据保存在公共下载目录中。 这是一个简单的解决方案,但它需要读取权限,我想避免这种情况。 然后我认为我可以使用内容提供程序(以及 inputStreams 和 mmaped ByteBuffers),但核心是,我的应用程序放置了许多 zip 文件 在一个大的 ZipResourceFile 中: 一些压缩文件被读取和复制 一些未压缩的文件被映射并用作 lucene 数据库

所以,我可以忘记一个简单的 FileProvider,因为我需要一个 File 来获取一个 ZipFile 以便解压缩我的数据

另外,可以构建一个 ZipFileProvider,我的文件将被放入一个大的 ZipResourceFile 中,其部分将通过内容提供者提供,就像这个库一样:https://github.com/jarondl/android-zipfileprovider/blob/master/src/net/jarondl/zipfileprovider/ZipFileProvider.java

但是,如果我通过这样一个 ZipFileContentProvider 得到一些 mmaped ByteBuffer,它是否能够拥有长久而安全的生命呢? (我应该使用服务吗?) 如果为它服务的 ZipFileContentProvider 进程死了怎么办? 内存消耗怎么办?有什么注意事项? ContentProvider 不应该以短暂的方式使用吗?

有没有更好的解决方案?

更新:

android 不能为来自同一个开发者(和其他人)的几个应用程序共享一个目录,这真的很糟糕。或者有可能吗?

更新2:

我考虑将文件存储在 getExternalFilesDir() 上,但是下面的官方警告让我非常紧张(写什么?):

注意虽然 getExternalFilesDir() 提供的目录和 MediaStore 内容无法访问 getExternalFilesDirs() 提供者,其他具有 READ_EXTERNAL_STORAGE 权限的应用程序可以 访问外部存储上的所有文件,包括这些文件。如果你需要 要完全限制对文件的访问,您应该改为编写 您的文件到内部存储。

【问题讨论】:

不能用ZipInputStream包装从ContentResolver打开的InputStream吗? 没想到。与 ZipFileProvider 相比,性能应该很糟糕,但当您必须遍历整个文件才能读取最后一个 zipEntry... 【参考方案1】:

android 不能为来自同一个开发者的几个应用程序共享一个目录,这真的很糟糕。或者有可能吗?

您在此之前声明这是可能的,但您试图避免它

最初,我将数据保存在公共下载目录中。这是一个简单的解决方案,但它需要读取权限,我想避免这种情况。

使用读取权限并没有错。或为此写许可。您有什么特别的原因要避免它吗?

在适合您的两个应用程序的地方添加读/写权限,并访问您自己重复使用的文件夹结构。它不必是公共下载目录。例如<com.MyCompanyNamespace>/Data

那么你可以:

    检查您的文件夹 否则检查公用文件夹并移至您的文件夹。 否则直接到下载站点。

使用读/写权限并没有错。您可以在应用商店或应用内说明为什么需要权限,让他们放心。

我知道您还有很多问题,但希望这个简单的答案可以消除需求。

【讨论】:

1) 金钱:一些用户避免使用请求权限的应用程序 2) 安全性:如果具有读/写权限的恶意应用程序访问我在外部存储上的文件(比如 getExternalFilesDir())并巧妙地篡改它们怎么办(所以应用程序有时会崩溃)? @Lakedaemon 虽然我同意第 1 点,但这是一个很小的百分比,大多数(如果不是全部)可以通过在安装之前指定权限的用途来重新保证。又名存储应用程序之间的共享文件。不从设备读取任何其他数据。 (上面指定) 2. 然后你打到了其他根本没有读取权限的观众。这是可以接受的,超出您的控制范围。但是应该考虑,如果发生这种情况,它必须针对每个文件(不太可能是具体的)。所有应用程序/设备都会受到影响。您的应用不太可能受到指责。 如果每个应用程序都在 getExternalFileDirs() 中写入数据并请求读取权限以访问其他应用程序的数据,它确实提供了一流的性能,但需要单个读取权限作为权衡。如果没有更好的解决方案,我会接受你的回答。

以上是关于在 Android 应用程序之间共享不可变文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个不同的 Android 应用程序之间共享 SharedPreferences 文件?

Android - 服务是不是在进程之间共享?

Android 应用程序之间数据共享

Android 应用程序之间数据共享

在云端共享 iOS 和 Android 之间的本地化

可以在firebase中的ios和android项目之间共享用户进行身份验证