2012-01-06 66 views
7

Online Developer Guide page on XML layouts,我发现了以下声明:XML驱动的图形用户界面和性能

你的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和更快的加载时间?

在此先感谢。

回答

8

如果你有在类文档LayoutInflater甘德,你会发现他们说:

由于性能原因,查看通货膨胀在很大程度上依赖于被在编译的时候做的XML文件预处理。因此,目前不可能在运行时通过普通的XML文件使用LayoutInflaterXmlPullParser;它只适用于编译资源返回的XmlPullParserR.something file。)

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

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

+0

感谢您的链接。我可以确认有一个R $ layout.class,但在我的应用程序中,它只保存“int”ID。 – 2012-01-06 17:13:24

+0

好的,检查apk文件中的XML文件,事实证明它们不是XML,而是预处理文件。我想这些格式是由布局inflatter进行的运行时分析速度要快得多。 – 2012-01-06 17:20:09

+0

我看了一下自己的APK,布局文件在APK中,与源文件具有相同的路径,但编译为二进制格式。 (编辑:ninja'd!) – slyfox 2012-01-06 17:20:34