ویرگول
ورودثبت نام
Alien | آلیِن
Alien | آلیِن
Alien | آلیِن
Alien | آلیِن
خواندن ۳ دقیقه·۳ ماه پیش

حل مشکل دانلود کتابخونه‌های اندروید؛ ساخت مخزن لوکال قدم‌به‌قدم

اگر پروژه‌هاتون از Gradle استفاده می‌کنن، احتمالاً با این مشکل روبه‌رو شدین که به‌خاطر تحریم و فیلترینگ، دانلود کتاب‌خانه‌ها از مخزن‌ (repository) گوگل با خطا مواجه می‌شه. خیلی وقت‌ها هم VPN مناسب برای سینک پروژه در دسترس نیست. روش‌های جایگزین وجود دارن؛ برای مثال مخزن مایکت (maven.myket.ir) جایگزین خوبی هست. اما سؤال من این بود: آیا می‌شه به‌جای دانلود کتاب‌خانه‌ها از اینترنت، اون‌ها رو به‌صورت محلی در پروژه گذاشت تا Gradle از local استفاده کنه؟ جواب بله هست. در ادامه روشی که ازش استفاده کردم رو توضیح می‌دم.

گام اول — پیدا کردن لینک دانلود

Gradle وقتی در دانلود کتاب‌خانه ناموفق می‌شه، خودش مسیر دانلود (URL) فایل‌ مورد نیاز رو نمایش می‌ده. لینک دانلود یک کتاب‌خانه معمولاً از سه قسمت تشکیل شده:

  1. آدرس مخزن (repository).

  2. مسیر کتاب‌خانه (مشابه groupId با نقاط تبدیل‌شده به اسلش).

  3. نام و نسخه فایل (artifactId و version) و پسوند (.aar یا .pom).

مثال: اگر داخل Gradle نوشته باشیم:

implementation "androidx.exifinterface:exifinterface:1.3.6"

در این implementation سه قسمت وجود داره که با : جدا شدن:

  • بخش اول (androidx.exifinterface): groupId

  • بخش دوم (exifinterface): artifactId

  • بخش سوم (1.3.6): version

برای ساخت لینک دانلود از این اطلاعات استفاده می‌کنیم:

https://[repository]/[group id(with dots→slashes)]/[artifact id]/[version]/[artifact id]-[version].[aar|pom]

برای مثال، برای exifinterface در مخزن گوگل:

  • Repository: https://dl.google.com/dl/android/maven2/

  • Group id: androidx/exifinterface

  • Artifact id: exifinterface

  • Version: 1.3.6

لینک نهایی:

https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.3.6/exifinterface-1.3.6.aar

و برای متادیتا:

https://dl.google.com/dl/android/maven2/androidx/exifinterface/exifinterface/1.3.6/exifinterface-1.3.6.pom

نکته: برای درست ساخته‌شدن مسیر، تمام نقطه‌های groupId باید به / تبدیل بشن.

چرا باید .pom هم دانلود کنیم؟

فایل .pom در واقع متادیتای مربوط به یک artifact در مخزن‌های Maven هست؛ مانند یک manifest برای کتاب‌خانه. Gradle معمولاً دنبال این فایل هم می‌گرده تا وابستگی‌ها و اطلاعات لازم رو ببینه؛ بنابراین کنار فایل .aar باید .pom هم قرار بدیم.

گام دوم — ساختار‌دهی پوشه‌ها (Repository محلی)

در ریشه پروژه (یا هر محلی که بخواین)، یک پوشه به اسم دلخواه مثلاmaven-repo بسازین و ساختار درختیِ مشابه مخزن Maven رو درست کنین. مثلاً برای مثال بالا:

android/ └── maven-repo/ └── androidx/ └── exifinterface/ └── exifinterface/ └── 1.3.6/ ├── exifinterface-1.3.6.aar └── exifinterface-1.3.6.pom

نکته‌ها:

  • نام فایل‌ها باید دقیقاً به‌شکل artifactId-version.aar و artifactId-version.pom باشن.

  • می‌تونین این مخزن رو داخل پروژه اندروید (یا ماژول اندروید برای پروژه های cross platform) بذارین یا بیرون از پوشه‌ی پروژه. مهم اینه که مسیر رو به‌درستی به Gradle معرفی کنین.

گام سوم — معرفی مخزن محلی به Gradle

باید مخزن محلی‌تون رو داخل بلاک repositories تعریف کنین و حتماً بالاتر از google() یا سایر مخازن قرار بدین تا اولویت با مخزن محلی باشه.

اگر از Kotlin DSL (settings.gradle.kts) استفاده می‌کنین:

dependencyResolutionManagement { repositories { maven { url = uri("$rootDir/maven-repo") } google() mavenCentral() } }

اگر از Groovy (settings.gradle) استفاده می‌کنین:

allprojects { repositories { maven { url uri("$rootDir/maven-repo") } google() mavenCentral() } }

نکته: مقدار rootDir در Gradle معمولاً به پوشه‌ی ماژول ریشه (در پروژه های مولتی پلتفرم مثل فلاتر: android/) اشاره می‌کنه. اگر مخزن‌تون رو جای دیگری قرار دادین، از مسیر نسبی یا مطلق استفاده کنین. مثال برای مسیر بیرون از android:

maven { url = uri("$rootDir/../maven-repo") }

یا برای مسیر روی درایو دیگر:

maven { url = uri("F:/maven-repo") }

خیلی مهم: ترتیب قرار گرفتن مخازن مهمه؛ Gradle به ترتیب هر مخزن رو چک می‌کنه و از اولین مخزنی که artifact رو داشته باشه، دانلود می‌کنه.

نکات تکمیلی و راه‌های جایگزین

  • اگر نمی‌خواین ساختار Maven بسازین، سریع‌ترین روش ریختن فایل .aar داخل android/app/libs/ و افزودن:

implementation files('libs/exifinterface-1.3.6.aar')

که این روش برای یک یا چند AAR سریع و کاربردیه، اما مدیریت وابستگی‌ها رو به‌خوبی ساختار Maven انجام نمی‌ده.

  • اگه امکان دارین روی یک دستگاه دیگه (با دسترسی آزاد به اینترنت) یک‌بار gradlew build بزنین، Cache محلی Gradle (~/.gradle/caches/...) ساخته می‌شه؛ می‌تونین اون پوشه رو منتقل کنین.

  • حتماً همزمان با .aar فایل .pom رو بذارین؛ بعضی از ماژول‌ها وابستگی‌های فرعی دارن که صرفاً وجود .aar کافی نیست.



اگه این مقاله به کارتون اومد، یا تجربه مشابهی داشتین و یا راه‌حل بهتری می‌شناسین، خوشحال می‌شم اینجا با هم به اشتراک بذاریم.🌱

androidgradleflutter
۳
۰
Alien | آلیِن
Alien | آلیِن
شاید از این پست‌ها خوشتان بیاید