„Прикачане” в средата на разработчиците означава свързване, добавяне или интегриране на нова функционалност към съществуващ проект. Терминът се използва за описание на широк спектър от действия: от свързване на външна библиотека до добавяне на нов потребителски интерфейс. Според данните на Android Developers, повечето съвременни проекти използват мениджъри на зависимости, които правят процеса на „прикачане” на библиотеки стандартен и предвидим. Интегрирането на нов компонент изисква разбиране на архитектурата на проекта и съвместимостта на версиите.
Основни точки
Прикачане — метафора, означаваща свързване на нов функционален блок към съществуваща система. За разлика от думата „добавяне”, „прикачане” подсказва, че компонентът не е проектиран от нулата за текущата архитектура, а се интегрира като външно решение. Това може да бъде библиотека, рамка, API клиент или готов UI елемент.
Разработчиците „прикачат” компоненти по няколко причини: за да не изобретяват колелото, за да ускорят разработката или за да добавят функционалност, която екипът не може да реализира сам. Работата с управление на зависимости стана толкова стандартна, че „прикачане на библиотека” отнема минути, а не дни. Въпреки това, неправилното интегриране може да доведе до конфликти на версии, увеличаване на размера на приложението и проблеми със сигурността.
Терминът е универсален и се прилага за всяка платформа: iOS, Android, Web. На iOS, CocoaPods и SPM са мениджъри на зависимости, на Android — Gradle, на Web — npm. Процесът на прикачане включва няколко стъпки: избор на компонент, проверка на съвместимост, свързване чрез мениджър, конфигуриране и тестване.
Мениджъри на зависимости — инструменти, които автоматизират свързването на външни библиотеки към проект. Те решават три задачи: изтегляне на кода на библиотеката, разрешаване на транзитивни зависимости и управление на версии. Без мениджър, разработчикът би трябвало ръчно да изтегля файлове, да ги копира в проекта и да следи актуализациите.
Всяка платформа използва свой мениджър: iOS — Swift Package Manager (SPM) или CocoaPods, Android — Gradle с Maven Central, Flutter — pub.dev. Принципът на работа е един и същ: посочвате името на пакета и версията в конфигурационен файл, мениджърът изтегля зависимостите и конфигурира компилацията.
Нека добавим Retrofit — HTTP клиент за Android. Във файла build.gradle на ниво модул трябва да се добави зависимостта, да се синхронизира проектът и библиотеката е готова за използване. Gradle автоматично ще изтегли самия Retrofit и неговите транзитивни зависимости: OkHttp, конвертор Gson.
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.11.0'
}
В iOS проекти чрез Swift Package Manager, библиотеката се добавя чрез Xcode: File → Add Packages. Алтернативно — чрез Package.swift. За Alamofire, популярна библиотека за работа с мрежа, е достатъчно да посочите URL на хранилището и версия. SPM сам ще изтегли изходния код и ще го добави към компилацията.
// Package.swift
let package = Package(
name: "MyApp",
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git",
from: "5.9.0")
]
)
Интегриране на API — един от най-честите сценарии за „прикачане” в мобилното разработване. Почти всяко приложение взаимодейства със сървъра: изпраща данни, получава съдържание, удостоверява потребители. Прикачане на API означава да настроите мрежова комуникация между клиент и сървър, да обработите отговори и грешки.
Процесът включва три етапа: избор на HTTP клиент, конфигуриране на крайни точки и обработка на отговори. Съвременните клиенти като Retrofit (Android) и Alamofire (iOS) предоставят декларативен API за описване на заявки и автоматична сериализация на отговори. След прикачане на клиента, разработчикът работи с типизирани модели от данни, а не с необработени JSON низове.
// Дефинирайте API интерфейс с Retrofit
interface GithubApi {
@GET("users/{username}/repos")
suspend fun getRepos(
@Path("username") username: String
): List<Repo>
}
След описване на интерфейса, остава създаване на инстанция на Retrofit, предаване на базов URL и добавяне на прихващачи за логване, удостоверяване и обработка на грешки. След това инстанцията на клиента се инжектира в хранилище или ViewModel. Прикачането на API може да се счита за завършено, когато приложението успешно изпрати заявка и обработи правилно отговора.
UI компоненти от готови библиотеки — друг често срещан обект на „прикачане”. Вместо да рисува персонализиран елемент от нулата, разработчикът свързва библиотека с готови контроли: карти, бутони, полета за въвеждане, навигационни менюта. Това ускорява разработката и осигурява еднообразие на интерфейса.
На Android за това се използват Material Components — библиотека от Google, която имплементира Material Design. На iOS — стандартният UIKit или външни библиотеки като SnapKit за оформление. Във Flutter, целият UI се състои от Widget-и и прикачането на нов компонент често означава просто добавянето му в дървото на Widget-ите и конфигуриране на параметри.
SnapKit — библиотека за Auto Layout чрез DSL. След добавяне чрез SPM можете да описвате ограничения декларативно, без Interface Builder. Това ускорява оформлението и прави кода по-четим. Прикачането на SnapKit — задача за пет минути, след което целият проект използва единен стил на оформление.
import SnapKit
let button = UIButton()
view.addSubview(button)
button.snp.makeConstraints { make in
make.center.equalTo(superview)
make.width.equalTo(200)
make.height.equalTo(48)
}
Преди да прикачите какъвто и да е компонент, проверете три параметъра: целева версия на платформата, лиценз и динамика на поддръжка. Библиотека, която не е актуализирана от две години, може да съдържа некоригирани уязвимости. Остаряло API може да не се компилира с новата версия на SDK. Лицензът може да забранява търговска употреба.
Дори проста операция „прикачане на библиотека” може да се превърне в часове дебъгване. Нека разгледаме четири типични проблема, с които разработчиците се сблъскват при интегриране на зависимости, и начините за тяхното решаване.
Две библиотеки може да изискват различни версии на един и същ пакет. Gradle на Android хвърля ConflictException, а Swift Package Manager се опитва да разреши конфликта автоматично, но не винаги успешно. Решение — използване на force-version или изключване на транзитивната зависимост чрез exclude. Понякога е по-лесно да се намери алтернативна библиотека.
implementation('com.example:library-a:2.0.0') {
exclude group: 'com.example', module: 'conflicting-lib'
}
При добавяне на няколко големи библиотеки, броят на методите може да надхвърли лимита от 65K. Android изисква активиране на multidex в build.gradle и добавяне на MultidexApplication. Без това приложението ще се срине при стартиране с грешка „Cannot fit requested classes in a single dex file”.
Някои естествени библиотеки съдържат код, подписан само за физически устройства. На iOS това се проявява при свързване на библиотеки с архитектура arm64 за симулатор. Решение — изключване на архитектурата на симулатора от fat-framework или изчакване на версия с поддръжка на .xcframework.
Всяка прикачена библиотека увеличава времето за компилация. KAPT — процесор на анотации за Kotlin — особено забележимо забавя Gradle. Решение — използване на KSP вместо KAPT, минимизиране на броя динамични feature модули и кеширане на зависимости. След прикачане на първата библиотека, измерете времето за компилация като базова линия.
Често задавани въпроси
Прикачане — добавяне на нова функционалност, свързване на библиотека, API или UI компонент към съществуващ проект. Терминът е неформален, разпространен в рускоезичната среда на разработчици.
На iOS — SPM и CocoaPods. На Android — Gradle. На Flutter — pub.dev. На Web — npm, yarn. Принципът на работа на всички мениджъри е сходен: конфигурация → изтегляне → компилация.
Проверете лиценза, версията на SDK, активността на поддръжка, размера и транзитивните зависимости. Използвайте сайтове като deps.dev за анализ на зависимости и проверка на лицензионна съвместимост.
Използвайте force resolve или exclude в Gradle, актуализирайте и двете библиотеки до последните версии или намерете алтернатива. В SPM проверете коя транзитивна зависимост причинява конфликта.
Използвайте minification (ProGuard/R8 на Android, stripping на iOS), премахнете неизползваните ресурси на библиотеките, свързвайте само необходимите модули, ако библиотеката поддържа модулна архитектура.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също