TGTGInsighttelegram intelligenceLIVE / telegram public index
← Android Broadcast
Android Broadcast avatar

TGINSIGHT POST

Post #9542

@android_broadcast

Android Broadcast

Vues6,960Nombre de vues
Publié4 oct.04/10/2025 12:25
Contenu

Contenu du post

⚠️ Работа с зависимостями в Gradle таит множество подводных камней: - Откуда берётся зависимость? - Какие транзитивные зависимости подтянутся вместе с ней? - Как убедиться, что скачался именно тот артефакт, который вы ожидали? Чтобы сборка была стабильной, безопасной и быстрой, стоит придерживаться ряда практик 👇 1️⃣Используйте единый источник зависимостей В больших компаниях принято разворачивать свой Nexus / Artifactory. Он проксирует остальные репозитории (MavenCentral, Google и др.), и для проекта остаётся один источник правды. Это ускоряет сборку (репозиторий ближе и быстрее), а также защищает от случайного скачивания библиотек «из непонятного интернета». 2️⃣Ограничивайте содержимое репозиториев При подключении нескольких репозиториев стоит явно ограничить группы пакетов, которые могут из них подтягиваться. Например, для Google Maven: // settings.gradle.kts dependencyResolutionManagement { repositories { google { mavenContent { includeGroupAndSubgroups("androidx") includeGroupAndSubgroups("com.android") includeGroupAndSubgroups("com.google") includeGroupAndSubgroups("org.chromium.net") includeGroupAndSubgroups("com.crashlytics.sdk") } } mavenCentral() } } Так вы избежите ненужных запросов в «левые» репозитории. 3️⃣Проверяйте скачанные артефакты Gradle поддерживает dependency verification. Это позволяет проверить контрольные суммы загружаемых артефактов и защититься от подмены. 📖 Документация: Dependency Verification Пример gradle/verification-metadata.xml: <verification-metadata> <configuration> <verify-metadata>true</verify-metadata> <verify-signatures>false</verify-signatures> </configuration> <components> <component group="org.apache.pdfbox" name="pdfbox" version="2.0.17"> <artifact name="pdfbox-2.0.17.jar"> <sha512 value="..." /> </artifact> </component> </components> </verification-metadata> 4️⃣Ограничивайте транзитивные зависимости Любая библиотека подтягивает за собой десятки других. Чтобы не получить неожиданное поведение или небезопасные версии — используйте constraints: dependencies { implementation("org.apache.httpcomponents:httpclient") constraints { implementation("org.apache.httpcomponents:httpclient:4.5.3") { because("previous versions have a critical bug") } implementation("commons-codec:commons-codec:1.11") { because("version 1.9 pulled from httpclient has issues") } } } А если нужно зафиксировать версии жёстко: configurations.all { resolutionStrategy { force("org.example:lib:1.2.3") // Есть много других возможностей } } 5️⃣Анализируйте дерево зависимостей Чтобы понять, кто и что тянет, используйте: ./gradlew dependencies ./gradlew dependencyInsight --dependency okhttp --configuration releaseRuntimeClasspath Это поможет отловить дубликаты и неожиданные версии. 6️⃣Автоматизируйте обновления Поддерживайте проект в актуальном состоянии: 🔄 используйте Gradle Versions Plugin, чтобы проверять обновления библиотек. 📝 заведите политику обновлений (например, обновлять минорные версии раз в месяц, а мажорные — отдельно и осознанно). 🔥 В итоге, хорошая стратегия работы с зависимостями — это баланс между удобством разработки и контролем. Чем больше проект и команда, тем жёстче стоит соблюдать правила. #gradle#лучшиепрактики