Android Assets 太慢

标签 android c++ android-ndk

我有带 Assets 的 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

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

但是,速度非常差,应用启动时间至少比没有 Assets 时长 3-4 倍。

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

使用我以前的方法,如果解压缩正确完成,应用程序冷启动大约需要 5 秒。现在,有了 Assets ,最多需要 20 秒。有什么解决办法吗?

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

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

但改进很小。

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

最佳答案

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

我对 funopen() 技巧持怀疑态度。我的意思是,它工作可靠,但我担心开销。处理非压缩 Assets 的更有效方法是通过 AAsset_getBuffer()AAsset_openFileDescriptor() .检查 example使用文件描述符。请注意,最后,所有数千个"file"都会有一个文件描述符。

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

关于Android Assets 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47813427/

相关文章:

c++ - dll中定义的全局变量和主机软件的全局变量

android - 错误 : '__NDK_FPABI__' does not name a type

c++ - 将 MacOSPath 转换为 POSIX 时如何设置卷名

c++ - 翻转 map 键值对

java - java中如何访问对象数组中的对象中的变量

java - 遍历一周中的几天时循环增量值

Android studio - AndEngine ndk编译错误

Android NDK C++ 相机2 API : ACameraManager_getCameraIdList return 0 cameras

Android Room 无法弄清楚如何将此字段保存到数据库中

android - 如何在 ArrayAdapter 中使用 HashMap 中的键和值?