【问题标题】:XML-driven GUIs and performanceXML 驱动的 GUI 和性能
【发布时间】:2012-02-04 08:38:17
【问题描述】:

阅读Online Developer Guide page on XML layouts,发现如下说法:

您的 UI 描述在您的应用程序代码之外,这意味着您可以修改或调整它,而无需修改您的源代码并重新编译。

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

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

阅读同一页,它指出:

当你编译你的应用程序时,每个 XML 布局文件都会被编译成一个 View 资源。

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

我的问题:

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

提前致谢。

【问题讨论】:

    标签: android xml performance android-layout


    【解决方案1】:

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

    出于性能原因,视图膨胀很大程度上依赖于在构建时对 XML 文件进行的预处理。因此,目前无法在运行时在纯 XML 文件上使用 LayoutInflaterXmlPullParser;它仅适用于从已编译资源 (R.something file) 返回的 XmlPullParser

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

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

    【讨论】:

    • 感谢您的链接。我可以确认有一个 R$layout.class,但在我的应用程序中,它只包含 int ID。
    • 好的,检查apk里面的XML文件,发现不是XML,而是预处理文件。我猜这些格式使得layout inflatter的运行时解析要快得多。
    • 我查看了我自己的一个 APK,布局文件在 APK 中,与源文件的路径相同,但它被编译为二进制格式。 (编辑:忍者!)
    • 如果你真的想知道性能影响是什么,你可以做的是获取一个 LayoutInflater 的实例,并分析在运行时为项目中的给定布局资源充气所需的时间,然后将该时间与在代码中手动构建等效布局所花费的时间进行比较。鉴于基于 XML 的布局是几乎所有 Android 项目的首选方式,我认为它的差异几乎可以忽略不计。
    • 我认为这就是答案。谢谢!
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多