如何在Android .apk中存储正常的文件树,而不会出现Ressource或Asset概念的所有奇怪之处?看来我必须做一些事情,像任何非Android Java应用程序一样使用当前路径中的文件吗?
答案 0 :(得分:2)
“使用当前路径中的文件”和“存储...在Android .apk文件中”与彼此无关。
从统计学上讲,你可能对Windows很熟悉,让我们来看一些类比。
Windows上的“存储...在Android .apk文件中存储...”将“存储...在Windows .exe文件中”。这在Windows上相当罕见,至少在我检查的最后一次。 Windows上的“使用来自当前路径的文件”将引用可能存在于应用程序的Program Files
目录中的文件或等效文件。在Android上,这种方法相当普遍 - 使用getFilesDir()
和Java文件I / O.
Windows中存在的并且Android中不存在的是在安装时通过安装程序包(例如.msi
文件)打包文件的概念。
由于您拒绝告诉我们“正常的文件树”是什么以及为什么您认为它应该是“在Android .apk内”,因此无法向您提供有关如何避免您认为的任何“怪异”的建议存在于“资源[原文如此]或资产概念”中。我可以告诉你的是,将文件烘焙到可执行文件中的其他操作系统的等价物可能同样“怪异”。
答案 1 :(得分:0)
使用资源,您可以在APK中拥有文件树,可以使用AssetManager返回的getAssets()访问该文件树。
这种机制的重点是节省空间。安装应用程序时,文件不会解压缩到文件系统。当您阅读资产的内容时,它会从APK中动态解压缩(解压缩)。它确实有意义。在Android设备上节省空间非常重要。
但是,如果您需要,首先启动应用程序时,没有任何内容禁止您将资产树提取到文件系统中。
答案 2 :(得分:0)
可能适用于您的一种方法是使用ZipFile和ZipEntry打开APK,因为这使您可以访问非常类似于传统的只读目录结构。
或者,您可以使用getResourceAsStream来处理传统的文件结构 - 如果您采用这种方法,您可能会发现this bug report很有用 - 它显示了使用{{3}的一些风险在android上。
我应该补充一点,你不应该想到一个APK被提取出来 - APK中的文件不在文件系统上,它们就像是J2ME或J2SE环境中JAR文件中的资源(或者WAR / EAR for J2EE)。
希望这有帮助,
Phil Lello
答案 3 :(得分:0)
好的,我还没有对此进行测试,但解决方案可能是在签名之前将额外的文件添加到APK。您可以从命令行自动执行此操作:
$ ant release
$ zip -r bin/MyApp-unsigned.apk <custom_folder>
$ jarsigner -verbose -keystore <keystore> -storepass <password> bin/MyApp-unsigned.apk <alias>
$ zipalign -v 4 bin/MyApp-unsigned.apk bin/MyApp-signed.apk
然后,在您的活动中,使用ZipFile打开APK以访问您的自定义文件夹:
ZipFile apk = new ZipFile(getApplicationInfo().sourceDir);
我不确定Android Market如何对这种非标准的APK做出反应。