Android资产太慢了

时间:2017-12-14 12:28:58

标签: android c++ android-ndk

我有带有资产的Android应用。它们包含20,000多个文件,其中大多数是分成不同文件夹和子文件夹的简单文本或png文件。 1个单个文件的最大大小为500kb,其中90%大约为2kb。

样本结构

Data
  ... subfolders with 20k+ files
StartData
  .... FolderA
  ........ 5 files *.txt
  .... FolderB 
  ........ 5 files *.txt
  .... a.xml
  .... b.xml

问题是app的加载时间。在应用加载期间,我需要从StartData目录打开大约20个文件并从中读取设置。它们是2 xml文件,基于xml中的信息,我从两个子文件夹FolderA / FoldeB中打开其他数据。

然而,速度非常差,应用程序启动时间至少比没有资产时长3-4倍。

在以前的版本中,我在原始目录中有zip,在首次运行到文档目录时被解压缩。第一轮比赛很慢,但其他比赛很快。这个解决方案的问题是安装速度很快,因为在旧手机上进行解扰需要花费5分钟,并且在此过程中不会死亡。如果是这样,应用程序已损坏且数据仅部分解压缩,因此我放弃了此解决方案。

使用我以前的方法,如果解压缩正确完成,冷应用程序启动大约是5秒。现在,有了资产,它需要20多秒。任何解决方案?

我在gradle中禁用了资源压缩(我只有* .txt,* .png和* .xml文件)

aaptOptions{
       ignoreAssetsPattern  ''
       noCompress 'txt', 'png', 'xml'
       cruncherEnabled = false
}

但改善很小。

另外,我使用NDK(JNI)和AssetManager在C ++中加载我的资产。用C ++打开资产的解决方案取自:http://www.50ply.com/blog/2013/01/19/loading-compressed-android-assets-with-file-pointer/

1 个答案:

答案 0 :(得分:1)

我发现资产文件夹中数千个文件的偏移速度很慢,并且文件系统更适合此类任务,我并不感到惊讶。我想说也许应该重写数据结构。例如,您可以将此信息放在数据库中。

我对 funopen()技巧持怀疑态度。我的意思是,它可靠地工作,但我担心开销。处理非压缩资产的更有效方法是AAsset_getBuffer()AAsset_openFileDescriptor()。检查使用文件描述符的example。请注意,最后,对于所有数千个“文件”,将有一个文件描述符。

顺便说一句,我不认为使用这些直接访问方法的Java性能比C差。您可以使用 zlib 从APK文件中读取您的资产(采用ZIP格式)本身),但我怀疑你会比AssetManager更快地完成它。