XML-интерфейс и производительность - PullRequest
8 голосов
/ 06 января 2012

Читая страницу Онлайн-руководства для разработчиков по макетам XML , я нашел следующее утверждение:

Ваши описания пользовательского интерфейса являются внешними по отношению к коду вашего приложения, что означает, что вы можете изменить или адаптировать его без необходимости изменять исходный код и перекомпилировать.

Я знаю о многих преимуществах XML-макетов и ресурсов, но, поскольку XML-файлы размещаются внутри APK, я думаю, что нет реального способа изменить графический интерфейс без переупаковки. Я имею в виду, что большинство из нас используют плагин eclipse ADT и ANT для упаковки приложений, поэтому нет никакой реальной выгоды в том, чтобы не компилировать файлы классов (поскольку после изменения файлов ресурсов разработчику придется перепаковать приложение и создать новый APK). файл). Из-за этого невозможно переустановить только графический интерфейс на устройствах без повторного развертывания всего APK.

Если это предположение верно, то XML-файлы будут одинаковыми в течение всего времени жизни APK-файла. Я предполагаю, что эти файлы (особенно файлы макета) должны быть проанализированы и обработаны во время выполнения (перед onCreate действия), что было бы менее эффективно, чем программная сборка GUI (как в Swing). Макет обычно не является узким местом, но если я прав, я вижу здесь небольшую трату времени, которую можно было бы лучше использовать (например, с анимацией).

Читая ту же страницу, она гласит:

При компиляции приложения каждый файл макета XML компилируется в ресурс View.

Проверяя один из моих APK, я искал предварительно скомпилированный файл внутри classes.dex, и нет ничего, кроме моих классов Java и файла R.class. XML-файлы макета находятся внутри /res/layout folder, и есть файл с именем resources.arsc, который, по-видимому, содержит информацию о других ресурсах (строки, имена значков), но, по-моему, ничего не относится к Views (поправьте меня, если я ошибаюсь) ).

Мои вопросы:

  • Предварительно ли скомпилированы файлы макета XML и в какой файл?
  • Если нет, есть ли опция компиляции для полной предварительной компиляции информации макета в файл для ускорения загрузки? (в идеале это будет файл класса)
  • Если нет, есть ли способ создать этот файл при первом выполнении и кэшировать его в папке установки приложения, чтобы последующие выполнения во время выполнения могли читать этот файл вместо анализа XML и иметь более быстрое время загрузки?

Заранее спасибо.

1 Ответ

9 голосов
/ 06 января 2012

Если у вас есть гандер в документации класса для LayoutInflater , вы заметите, что они говорят:

По соображениям производительности представление инфляции в значительной степени зависит от предварительной обработки файлов XML, которая выполняется во время сборки. Поэтому в настоящее время невозможно использовать LayoutInflater с XmlPullParser поверх простого XML-файла во время выполнения; он работает только с XmlPullParser, возвращенным из скомпилированного ресурса (R.something file.)

Так что да, файлы макетов действительно в некоторой степени предварительно скомпилированы, , и, судя по приведенной выше выдержке, они будут в выходном файле R$layout.class (но я не уверен на 100% в этом). Файл скомпилированного макета находится в вашем скомпилированном пакете APK, как /res/layout/<layout_id>.xml. Если вы извлечете его и откроете в текстовом редакторе, вы заметите, что большинство текстовых XML-элементов были сопоставлены с какой-либо двоичной формой.

Вероятно, это будет тот же тип сжатия, который вы можете увидеть в AndroidManifest.xml файлах, которые упакованы в APK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...