Slide 1

Slide 1 text

Модульность и оптимизация Иван Вавилов [email protected] Модульность и оптимизация проекта 20/09/2019

Slide 2

Slide 2 text

Redmadrobot Агенда • Мотивация • Варианты • С чего начать • Проблемы • Решения • Статистика 2

Slide 3

Slide 3 text

Redmadrobot Проекту ~5 лет, ~300K LOC 3

Slide 4

Slide 4 text

Redmadrobot Мотивация #1 The operation couldn't be completed. Argument list too long. http://www.openradar.me/35879960 4

Slide 5

Slide 5 text

Redmadrobot Мотивация #2 Build succeeded 213.7 seconds — Build succeeded 91.2 seconds — 5

Slide 6

Slide 6 text

Redmadrobot Мотивация #3 Наличие таргетов iMessage, Siri, Notification. 6

Slide 7

Slide 7 text

Redmadrobot Монолит Dependency Dependency Dependency Приложение Фича Фича Фича Общий UI Сервисы Pull to Refresh Логгер Стили Модели Утилиты Dependency Dependency Dependency 7

Slide 8

Slide 8 text

Redmadrobot С чего начать Сервисы Монолит Alamofire Модели 8

Slide 9

Slide 9 text

Redmadrobot С чего начать Сервисы Монолит Alamofire Модели 9

Slide 10

Slide 10 text

Redmadrobot С чего начать • Стили — шрифты, лейблы, цвета • Другие библиотеки — логгеры, аналитика, лоадеры, pull to refresh • Модели • Работа с БД • Service • Утилиты • Общий UI • Фичи Сейчас мы здесь 10

Slide 11

Slide 11 text

Redmadrobot Варианты •CocoaPods •Подпроект •Target 11

Slide 12

Slide 12 text

Redmadrobot CocoaPods ✓Можно переиспользовать в других проектах ✓Легко выносится в другой репозиторий x Оформлять podspec x Зависимости тоже придется выносить в CocoaPods 12

Slide 13

Slide 13 text

Redmadrobot Подпроект ✓Можно использовать отдельно ✓Файлы могут быть только внутри одного проекта ✓Проще merge файла проекта x Необходимо отключать подпись для подпроекта 13

Slide 14

Slide 14 text

Redmadrobot Target ✓Можно унаследовать build settings ✓Проще визуально ✓Подпись отключается автоматически ✓Разделение на модули быстрее x Легко накосячить с добавлением нового файла 14

Slide 15

Slide 15 text

Redmadrobot Варианты •CocoaPods •Подпроект •Target 15

Slide 16

Slide 16 text

Redmadrobot Проблемы • 2 человека занимаются модулями, остальные 8 что-то делают. • Static library, например, Google Maps. • Без публичности не обойтись. • Время запуска неизбежно пострадает (+10 модулей +50 мс ~800 мс). • Классы, цвета, шрифты в Interface Builder придется проверить. 16

Slide 17

Slide 17 text

Redmadrobot Решения Возможно, вы про них слышали…

Slide 18

Slide 18 text

Redmadrobot XcodeGen # Service Модуль Service: type: framework platform: iOS sources: - path: Modules/Service createIntermediateGroups: true dependencies: - target: Model - target: DTO - target: Parser - target: Logger settings: INFOPLIST_FILE: "$(SRCROOT)/Modules/Service/Info.plist" PRODUCT_BUNDLE_IDENTIFIER: "ru.xxxxxx.mobile.service" IPHONEOS_DEPLOYMENT_TARGET: "9.0" postBuildScripts: - script: "$SRCROOT/Pods/SwiftLint/swiftlint --path $SRCROOT/Modules/Service" name: SwiftLint ~ 500 LOC 18

Slide 19

Slide 19 text

Redmadrobot Build Settings • -Xfrontend -warn-long-function-bodies=300 • -Xfrontend -warn-long-expression-type-checking=300 • Build Active Architecture Only (ONLY_ACTIVE_ARCH = YES) • Optimization Level — No Optimization для Debug (SWIFT_OPTIMIZATION_LEVEL = “-Onone”) 19

Slide 20

Slide 20 text

Redmadrobot Граф зависимостей стал понятнее Приложение Сервисы Модели DTO Alamofire RxSwift GoogleMaps Siri Общий UI Input Mask Утилиты 20

Slide 21

Slide 21 text

Redmadrobot Статистика 3 минуты 33 секунды 5 минут 45 секунды + 62% 21

Slide 22

Slide 22 text

Redmadrobot Статистика 1 минута 31 секунда 23 секунды - 300% 22

Slide 23

Slide 23 text

Redmadrobot Итоги • USE_SWIFT_RESPONSE_FILE — теперь одной проблемой меньше. • Модули независимо подключаются к разным таргетам. • Рано или поздно придется использовать статические модули и/или динамически подгружать модули. • Для переиспользования в других проектах лучше подойдут Cocoapods. • Время холодной сборки увеличилось в полтора раза • Время горячей уменьшилось в 4 раза 23

Slide 24

Slide 24 text

Модульность и оптимизация Иван Вавилов [email protected]