android - XML 驱动的 GUI 和性能

标签 android xml performance android-layout

阅读Online Developer Guide page on XML layouts ,我发现了以下语句:

Your UI descriptions are external to your application code, which means that you can modify or adapt it without having to modify your source code and recompile.

我知道 XML 布局和资源的许多优点,但由于 XML 文件放在 APK 中,我认为没有真正的方法可以在不重新打包的情况下修改 GUI。我的意思是,我们大多数人都使用 eclipse ADT 插件和 ANT 来打包应用程序,因此不编译类文件并没有真正的好处(因为修改资源文件后,开发人员将不得不重新打包应用程序并生成新的 APK文件)。因此,无法在不重新部署整个 APK 的情况下仅在设备上重新部署 GUI。

如果这个假设成立,那么 XML 文件在 APK 文件的生命周期内将是相同的。我想这些文件(特别是布局文件)必须在运行时(在 Activity 的 onCreate 之前)进行解析和处理,这比以编程方式构建 GUI(如在 Swing 中)效率低。布局通常不是瓶颈,但如果我是正确的,我会发现这里浪费了一点时间,但可以更好地利用它(例如,使用动画)。

阅读同一页,它指出:

When you compile your application, each XML layout file is compiled into a View resource.

检查我的一个 APK,我一直在寻找 classes.dex 中的预编译文件,除了我的 java 类和 R.class 文件外什么也没有。布局 XML 文件位于 /res/layout 文件夹 中,并且有一个名为 resources.arsc 的文件似乎包含有关其他资源(字符串、图标名称)的信息,但我认为与 View 无关(如果我错了请纠正我)。

我的问题:

  • 是否预编译了 XML 布局文件,预编译到哪个文件?
  • 如果没有,是否有一个编译选项可以将布局信息完全预编译到一个文件中以加快加载时间? (理想情况下,这将是一个类文件)
  • 如果没有,有没有办法在第一次执行时创建该文件并将其缓存在应用程序安装文件夹中,以便后续运行时执行可以读取该文件而不是解析 XML 并具有更快的加载时间?<

提前致谢。

最佳答案

如果您对 LayoutInflater 的类文档有所了解,你会注意到他们说:

For performance reasons, view inflation relies heavily on pre-processing of XML files that is done at build time. Therefore, it is not currently possible to use LayoutInflater with an XmlPullParser over a plain XML file at runtime; it only works with an XmlPullParser returned from a compiled resource (R.something file.)

所以是的,布局文件确实在某种程度上被预编译了,而且,根据上面的摘录判断,它会在 R$layout.class 中。输出文件(但我不是 100% 确定)。 预编译的布局文件位于编译的 APK 包中,如 /res/layout/<layout_id>.xml .如果您提取它并在文本编辑器中打开它,您会注意到大多数纯文本 XML 元素已映射到某种二进制形式。

这可能与您在 AndroidManifest.xml 中看到的压缩类型相同打包到 APK 中的文件。

关于android - XML 驱动的 GUI 和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760841/

相关文章:

android - AVD 解析速度非常慢

Android 7 GraphicBuffer 替代方案,用于直接访问 OpenGL 纹理内存

android - 下载管理器 : notify when a download is finished

android - JobScheduler 每次满足条件最多运行一次作业

xml - 使用/包含来自另一个节点的值

xml - Marklogic xdmp :log() in Query Console

android - 使用 SeekBar 中的值更新 ListView 中的 EditText

安卓NDK : iostream file not found

java - 使用 jaxb 在 java 中持久保存独立程序的数据

java - 有没有办法找到匹配谓词的第一个元素?