在 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 应用程序之间共享不可变文件的主要内容,如果未能解决你的问题,请参考以下文章