Connect with us

Разработка

FaultOrdering — открытый инструмент создания файлов компоновки для ускорения запуска iOS-приложений

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

Опубликовано

/

     
     

Что общего у приложений Snapchat, Airbnb и Spotify для iOS? Все они используют файлы упорядочивания (файлы порядка символов, порядка компоновки, order files) для ускорения запуска.

Order-файлы переупорядочивают ваш двоичный файл, чтобы улучшить загрузку символов в память. Изменения кода не требуются, но создание оптимизированного файла может быть обременительным, поэтому в основном это делают более крупные команды или команды, готовые платить за такую ​​услугу, как Launch Booster от Emerge Tools.

Так уж получилось, что Emerge Tools теперь является частью Sentry. В качестве первого совместного крупного релиза мы открываем исходный код основных функций Launch Booster в новом пакете Swift — FaultOrdering.

В репозитории вы можете проверить код (и, надеемся, внести свой вклад!), собрать его самостоятельно и адаптировать к рабочему процессу вашего приложения. Читайте дальше, чтобы узнать больше о том, как работают order-файлы и как интегрировать FaultOrdering с вашим проектом.

Как работают файлы компоновки

Order-файлы предписывают линкеру как группировать критические для запуска символы (функции) в двоичном файле, в конечном итоге сокращая количество загружаемых в память во время запуска страниц . Сам файл порядка символов — это просто текстовый файл, в котором на каждый символ в вашем приложении приходится одна строка. Например, файл приложения Emerge Tools для HackerNews содержит такие строки:

+[SentryAppStartTracker load]
+[SentryCrashDefaultMachineContextWrapper load]
_main
_$s10HackerNews0aB3AppVAC7SwiftUI0C0AAWl
_$s10HackerNews0aB3AppV7SwiftUI0C0AadEPxycfCTW
_$s10HackerNews0aB3AppVACycfCTf4d_n
```

В этом примере содержатся символы для кода Objective-C, C и Swift, используемого во время запуска приложения. Чем больше символов используется во время запуска приложения, которые вы можете отслеживать, тем больше файл упорядочивания может оптимизировать их для сокращения времени запуска приложения. Когда вы переходите к сборке своего приложения, компоновщик берет этот файл в качестве входной информации и размещает код в полученном двоичном файле точно так, как предписано.

Как это приводит к более быстрому времени запуска приложения? Когда пользователь запускает ваше приложение, ядро ​​iOS загружает его в память с помощью отображения памяти (memory mapping). По мере запуска приложения и выполнения кода необходимые страницы памяти загружаются операционной системой. Эта работа становится заметна, когда это происходит много раз одновременно. И помните, ОС должна загрузить всю страницу размером 16 КБ, даже если используется только ее крошечная часть! Группируя код в запуске приложения вместе, мы можем уменьшить количество страниц для загрузки вашего кода в память, что ускоряет процесс.

Если вы хотите более подробно рассмотреть файл компоновки, вы можете прочитать пост в блоге Emerge Tools.

Как мы генерируем файл компоновки

Существует много способов генерировать файл размещения функций. Распространенная стратегия заключается в использовании флагов компилятора, которые добавляют дополнительные хуки в код вашего приложения для отслеживания вызываемых функций — аналогично покрытию кода. Однако это требует изменений в процессе сборки вашего приложения, поскольку это может быть инвазивным и сложным в обслуживании.

Вместо этого FaultOrdering работает, добавляя точку останова к каждой функции в приложении, запуская приложение, а затем отслеживая, какие точки останова достигнуты. Это не требует дополнительной настройки сборки и может быть сделано с тем же приложением, которое вы отправляете в магазин приложений. Установка этих точек останова с помощью lldb будет очень медленной, поэтому мы создали наш собственный минимальный отладчик SimpleDebugger для записи и обработки срабатывания точек останова. Мы выбрали функции как хороший уровень детализации для символов, они, как известно, хорошо работают как с точками останова, так и с файлами компоновки.

Launch Booster упорядочивает символы, которые используются во время запуска приложения, а также символы, которые не используются. Это делается потому, что есть символы, которые невозможно упорядочить (обычно те, которые генерируются компоновщиком). Упорядочивая все в приложении, мы заставляем все неупорядочиваемые символы группироваться вместе, занимая как можно меньше памяти. Эта дополнительная оптимизация максимизирует эффект, который файлы размещения функций могут оказать на ваше приложение.

Использование пакета Fault Ordering

Новый пакет Swift берет весь этот процесс и запускает его в стандартном XCUITest. Тест создает файл компоновки как XCTAttachment.

let app = XCUIApplication()
let test = FaultOrderingTest { app in
  // Perform setup such as logging in
}
test.testApp(testCase: self, app: app)
```

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

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

Заключительные мысли

Итак, насколько файлы компоновки могут улучшить время запуска вашего приложения? Как обычно — «зависит от обстоятельств». Чем больше страниц ваше приложение использует во время запуска приложения, тем больше потенциальная выгода (вы можете использовать трассировку Sentry для измерения улучшения). На практике мы видели, как приложения получили 20% улучшение времени запуска.

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

Что касается интеграции Emerge<>Sentry, у нас есть еще несколько интересных обновлений с открытым исходным кодом. Оставайтесь с нами, чтобы узнать больше!

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: