Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Прости, Rosetta, мы должны расстаться

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

Прости, Rosetta, мы должны расстаться

Слайды к online-выступленю на Mobius 2022 Autumn (09.11.2022)

Avatar for Anton Grachev

Anton Grachev

November 09, 2022

More Decks by Anton Grachev

Other Decks in Programming

Transcript

  1. О чем поговорим? • Что такое Rosetta? • Как понять,

    что используется Rosetta? • Что мы делали в Циан, чтобы избавиться от Rosetta? • К чему пришли в итоге? 3
  2. Что такое Rosetta? • Транслятор процессорных команд • Приложение собираем

    под одну архитектуру, запускаем на нескольких 5
  3. Что такое Rosetta? • Транслятор процессорных команд • Приложение собираем

    под одну архитектуру, запускаем на нескольких • 1994 год: переход от процессоров Motorola 68K к RISC-архитектуре PowerPC 6
  4. Что такое Rosetta? • Транслятор процессорных команд • Приложение собираем

    под одну архитектуру, запускаем на нескольких • 1994 год: переход от процессоров Motorola 68K к RISC-архитектуре PowerPC • 2006 год: переход от PowerPC к x86-архитектуре на процессорах Intel - Выпуск Rosetta v1 7
  5. Что такое Rosetta? • Транслятор процессорных команд • Приложение собираем

    под одну архитектуру, запускаем на нескольких • 1994 год: переход от процессоров Motorola 68K к RISC-архитектуре PowerPC • 2006 год: переход от PowerPC к x86-архитектуре на процессорах Intel - Выпуск Rosetta v1 • 2020 год: переход от Intel x86 к ARM-архитектуре на процессорах Apple silicon - Выпуск Rosetta v2 8
  6. Как понять, что используется Rosetta? Вариант 1 Воспользоваться Activity Monitor

    1. Перейти на вкладку CPU 2. Посмотреть на значения в колонке Kind (или Architecture в более ранних версиях macOS) a) Apple: Rosetta не используется b) Intel: Rosetta используется 10
  7. Как понять, что используется Rosetta? Вариант 2 Воспользоваться Terminal 1.

    Ввести команду: ps -p `fuser /usr/libexec/rosetta/runtime | sed -e 's/.*: //' | sed -e 's/ /,/g'` 2. Вывод: usr/libexec/rosetta/runtime: PID TTY TIME CMD 7240 ?? 4:49.47 /Applications/Xcode.app/Contents/MacOS/Xcode 67270 ?? 12:34.11 /Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/PlugIns/ XCBBuildService.bundle/Contents/MacOS/XCBBuildService 79040 ?? 0:39.53 ~/Library/Developer/CoreSimulator/Devices/2D65A252-A594-448C-97CD- 17673BB244FE/data/Containers/Bundle/Application/D7FFC5CA-7C0B-4A9C-BB82- E984EE8CFD0A/Cian.app/Cian 11
  8. Циан – высокотехнологичный сервис по покупке, продаже и аренде коммерческой

    и жилой недвижимости с набором качественных сопутствующих услуг, таких как Циан.Ипотека и Циан.Сделка. 18,2млн уникальных пользователей ежемесячно PropTech 900+ сотрудников ТОП 10 крупнейших сайтов по недвижимости в мире* 12 продуктовых направлений *По количеству пользователей в рейтинге SimilarGroup на 1 сентября 2021 г.
  9. Приложение для iOS 20 680 тыс. разработчиков строчек кода 500

    тыс. — Swift 180 тыс. — Objective-C 55 сторонних зависимостей 13
  10. 14

  11. 15

  12. Что делали? Пример c YandexMapsMobile: #if TARGET_IPHONE_SIMULATOR && TARGET_CPU_ARM64 let

    mapView = YMKMapView(frame: .zero, vulkanPreferred: true) #else let mapView = YMKMapView() #endif 19
  13. Что делали? • Обновили зависимости • Адаптировали кодовую базу •

    Выключили опцию Open using Rosetta • Добавили настройку в проект: EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 21
  14. Что делали? • Обновили зависимости • Адаптировали кодовую базу •

    Выключили опцию Open using Rosetta • Добавили настройку в проект: EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 22
  15. arm64-to-sim • Консольная open source утилита https://github.com/bogo/arm64-to-sim • Конвертирует бинарный

    файл для arm64 в бинарный файл для iOS-симулятора на Apple Silicon 28
  16. arm64-to-sim • Консольная open source утилита https://github.com/bogo/arm64-to-sim • Конвертирует бинарный

    файл для arm64 в бинарный файл для iOS-симулятора на Apple Silicon 2 9
  17. arm64-to-sim • Парсит бинарный файл для arm64 • Находит команду

    LC_BUILD_VERSION • Заменяет ее на команду LC_VERSION_MIN_IPHONE_OS https://bogo.wtf/arm64-to-sim.html https://bogo.wtf/arm64-to-sim-dylibs.html 34
  18. arm64-to-sim • Консольная open source утилита https://github.com/bogo/arm64-to-sim • Конвертирует бинарный

    файл для arm64 в бинарный файл для iOS-симулятора на Apple Silicon 35
  19. arm64-to-sim • Консольная open source утилита https://github.com/bogo/arm64-to-sim • Конвертирует бинарный

    файл для arm64 в бинарный файл для iOS-симулятора на Apple Silicon • Нужно переподписать получившийся файл: $ xcrun codesign --sign - Example.xcframework/ios-arm64- x86_64-simulator/Example.framework/Example 36
  20. Что делали? Пример c YandexMapsMobile (iOS Simulator, без Rosetta): #if

    TARGET_IPHONE_SIMULATOR && TARGET_CPU_ARM64 let mapView = YMKMapView(frame: .zero, vulkanPreferred: true) #else let mapView = YMKMapView() #endif 38
  21. Что делали? • Макрос TARGET_IPHONE_SIMULATOR deprecated c 2015 года •

    Заменили на targetEnvironment(simulator) #if targetEnvironment(simulator) && arch(arm64) let mapView = YMKMapView(frame: .zero, vulkanPreferred: true) #else let mapView = YMKMapView() #endif 41
  22. Что делали? • Запустили на Xcode 14 • Приложение начало

    падать с ошибкой: *** -[CaptureMTLCaptureScope release]: message sent to deallocated instance 0x280aafb40 43
  23. Что делали? • Запустили на Xcode 14 • Приложение начало

    падать с ошибкой: *** -[CaptureMTLCaptureScope release]: message sent to deallocated instance 0x280aafb40 • Класс MTLCaptureScope — это часть Metal API, с помощью которого можно получать информацию о фреймах с GPU 44
  24. Что делали? • Запустили на Xcode 14 • Приложение начало

    падать с ошибкой: *** -[CaptureMTLCaptureScope release]: message sent to deallocated instance 0x280aafb40 • Класс MTLCaptureScope — это часть Metal API, с помощью которого можно получать информацию о фреймах с GPU • YandexMobileAds использует Vulkan API при помощи библиотеки MoltenVK 45
  25. Что делали? • Запустили на Xcode 14 • Приложение начало

    падать с ошибкой: *** -[CaptureMTLCaptureScope release]: message sent to deallocated instance 0x280aafb40 • Класс MTLCaptureScope — это часть Metal API, с помощью которого можно получать информацию о фреймах с GPU • YandexMobileAds использует Vulkan API при помощи библиотеки MoltenVK • MoltenVK взаимодействует с Metal API 46
  26. Что делали? • Запустили на Xcode 14 • Приложение начало

    падать с ошибкой: *** -[CaptureMTLCaptureScope release]: message sent to deallocated instance 0x280aafb40 • Класс MTLCaptureScope — это часть Metal API, с помощью которого можно получать информацию о фреймах с GPU • YandexMobileAds использует Vulkan API при помощи библиотеки MoltenVK • MoltenVK взаимодействует с Metal API 47
  27. Что делали? • Почитали changelog для Xcode 14 • Нашли

    known issue: Profiling Metal captures containing mesh pipelines is disabled. (93255574) 49
  28. Что делали? • Почитали changelog для Xcode 14 • Нашли

    known issue: Profiling Metal captures containing mesh pipelines is disabled. (93255574) • Выключили опцию GPU Frame Capture 51
  29. К чему пришли? • Избавились от Rosetta • Ускорили сборку

    проекта для устройства на 30% • Ускорили сборку проекта для симулятора на 35% 54