AXV

Tranzitiv Bog'liqliklar va Ziddiyatlarni Hal Qilish

Transitive dependencies, Dependency Tree, exclude qoidalari va BOM platformasi

10-sinfAdvanced Android2-hafta · 4-dars

Bugun nimani o'rganamiz?

Tranzitiv bog'liqlik

Kutubxonalarning yashirin zanjiri va ilovaga avtomatik qo'shiluvchi yordamchi modullar

Dependency Conflicts

Versiya to'qnashuvlari sababi va ./gradlew app:dependencies daraxti tahlili

exclude va BOM

Ortiqcha modullarni chiqarib tashlash va yagona mos versiyalar xaritasini boshqarish

01

Tranzitiv Bog'liqliklar Mohiyati

Bitta kutubxona ortidan kirib keladigan yashirin modullar zanjiri

Kutubxonalar zanjiri

«Siz bitta kutubxona qo'shdim deb o'ylaysiz, ammo uning ortidan o'nlab boshqa kutubxonalar kirib keladi.»

Yordamchilar armiyasi

Retrofit o'z ishini bajarish uchun OkHttp'ga, OkHttp esa Okio kutubxonasiga tayanadi. Bu zanjir avtomatik yuklanadi.

Katta loyihadagi xatarlar

Bir nechta kutubxona bitta yordamchi modulning turli versiyalarini talab qilsa, ziddiyat (conflict) paydo bo'ladi.

Tranzitiv bog'liqliklar zanjiri

Dasturchi kodi implementation Retrofit 2.9.0 1-daraja Tranzitiv Avtomatik yuklanadi OkHttp 4.12.0 HTTP transport qatlami 2-daraja Tranzitiv Yashirin quyi modul Okio 3.8.0 I/O bayt bufferlari
02

Versiya Ziddiyatlari (Conflicts)

To'qnashuv sabablari va Gradle tanlov strategiyasi

To'qnashuv qanday yuzaga keladi?

Ziddiyat sababi

Loyiha tarkibidagi Kutubxona A OkHttp 3.14.9 versiyasini talab qilsa, Kutubxona B esa OkHttp 4.12.0 ni talab qiladi.

Gradle strategiyasi

Gradle sukut bo'yicha eng yuqori versiyani (4.12.0) tanlaydi. Ammo bu eski kutubxona bilan kutilmagan crash berishi mumkin.

Gradle Dependency Resolution mexanizmi

Kutubxona A talab qiladi: okhttp: 3.14.9 (Eski) Kutubxona B talab qiladi: okhttp: 4.12.0 (Yangi) RESOLUTION Gradle Conflict Solver Qoida: Newest Wins 3.14.9 -> 4.12.0 Tanlangan: OkHttp 4.12.0 Loyiha bo'ylab
03

Dependency Tree Tahlili

Terminal yordamida loyihaning barcha yashirin qatlamlarini ko'rish

./gradlew app:dependencies buyrug'i

Buyruq formati

./gradlew app:dependencies \
  --configuration releaseRuntimeClasspath

Loyiha modulidagi barcha kutubxonalar va ularning tranzitiv shoxlarini to'liq daraxt ko'rinishida chiqaradi.

Belgilar siri

-> 4.12.0 — Gradle eski versiyani yangisiga avtomatik ko'targanini bildiradi.

(*) belgisi — Ushbu kutubxonaning shoxlari yuqorida allaqachon ko'rsatilgani va takrorlanmasligini bildiradi.

Terminaldagi bog'liqliklar daraxti

Terminal: ./gradlew app:dependencies +--- com.squareup.retrofit2:retrofit:2.9.0 | \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.12.0 (*) \--- com.squareup.okhttp3:logging-interceptor:4.12.0 \--- com.squareup.okhttp3:okhttp:4.12.0 (*) \--- com.squareup.okio:okio:3.8.0 (*) Tahlil: okhttp 3.14.9 eskirgan versiyasi avtomatik ravishda 4.12.0 ga almashtirildi. Yulduzcha (*) takroriy ko'rsatishni cheklash uchun qo'yilgan.
04

Ziddiyatlarni Hal Qilish

exclude qoidalari, force strategiyasi va BOM platformasi

exclude va force mexanizmlari

exclude qoidasi

Kutubxona tarkibidagi aniq bitta keraksiz yoki ziddiyatli modulni to'xtatish:

implementation('com.lib:tool:1.0') {
    exclude group: 'org.old', module: 'unused'
}

resolutionStrategy.force

Loyiha bo'ylab bitta qat'iy versiyani majburiy qilib o'rnatish:

configurations.all {
    resolutionStrategy.force 'com.squareup.okhttp3:okhttp:4.12.0'
}

BOM (Bill of Materials) ishlash prinsipi

FIREBASE BOM platform("...:firebase-bom:32.8.0") 100% Sinovdan o'tgan moslik xaritasi firebase-auth-ktx Versiya yozilmaydi! BOM avtomatik beradi firebase-firestore-ktx Versiya yozilmaydi! Moslik kafolatlangan firebase-storage-ktx Versiya yozilmaydi! Hech qanday ziddiyatsiz

Versiya ziddiyatini hal qilish bosqichlari

1

Xatoni aniqlash

Logcat yoki build jarayonida NoSuchMethodError yoki moslik xatolarini payqash.

2

Daraxtni ochish

Terminalda ./gradlew app:dependencies buyrug'i orqali to'qnashuv manbasini topish.

3

exclude qo'llash

Eski modullarni exclude qilish yoki yagona versiyani force bilan majburlash.

4

Sinxronlash & Test

Loyihani "Sync Now" qilish va barcha funksiyalar to'g'ri ishlashini sinovdan o'tkazish.

Nazoratsiz bog'liqlik vs Boshqariladigan arxitektura

Nazoratsiz loyiha

Har bir kutubxona ixtiyoriy versiyalarni tortib keladi.

Ilova hajmi keraksiz dublikat modullar bilan shishib ketadi.

Telefonda ilova kutilmaganda "crash" bo'ladi.

Boshqariladigan tizim

Bog'liqliklar daraxti doimiy tekshiriladi.

Ortiqcha modullar exclude orqali tozalanadi.

BOM va markazlashgan Version Catalog orqali to'liq barqarorlik.

Tezkor bilim sinovi

Kutubxona ichidagi ma'lum bir keraksiz tranzitiv modulni ilovadan chiqarib tashlash uchun nima ishlatiladi?
remove(module = "...") buyrug'i
exclude group: '...', module: '...' parametri
Faqat kutubxonani butunlay o'chirib tashlash mumkin
settings.gradle faylidan o'chirish

Amaliy laboratoriya mashg'uloti

1. Daraxtni tahlil qilish

Terminalda ./gradlew app:dependencies buyrug'ini ishga tushiring va Retrofit qaysi OkHttp versiyasini tortganini aniqlang.

2. exclude sinovi

Biror kutubxona uchun exclude qoidasini yozing, "Sync Now" qiling va daraxtda ushbu modul yo'qolganini tasdiqlang.

Darsning asosiy xulosalari

Yashirin zanjirlar

Tranzitiv kutubxonalar qulay, biroq ularning versiyalari ziddiyat bermasligini nazorat qilish shart.

Kuchli vositalar

exclude, resolutionStrategy va BOM har qanday murakkab versiya to'qnashuvini professional hal qiladi.

Keyingi dars: ProGuard va R8 yordamida kodni optimallashtirish (1-qism)