
اگر پروژههاتون از Gradle استفاده میکنن، احتمالاً با این مشکل روبهرو شدین که بهخاطر تحریم و فیلترینگ، دانلود کتابخانهها از مخزن (repository) گوگل با خطا مواجه میشه. خیلی وقتها هم VPN مناسب برای سینک پروژه در دسترس نیست. روشهای جایگزین وجود دارن؛ برای مثال مخزن مایکت (maven.myket.ir) جایگزین خوبی هست. اما سؤال من این بود: آیا میشه بهجای دانلود کتابخانهها از اینترنت، اونها رو بهصورت محلی در پروژه گذاشت تا Gradle از local استفاده کنه؟ جواب بله هست. در ادامه روشی که ازش استفاده کردم رو توضیح میدم.
Gradle وقتی در دانلود کتابخانه ناموفق میشه، خودش مسیر دانلود (URL) فایل مورد نیاز رو نمایش میده. لینک دانلود یک کتابخانه معمولاً از سه قسمت تشکیل شده:
آدرس مخزن (repository).
مسیر کتابخانه (مشابه groupId با نقاط تبدیلشده به اسلش).
نام و نسخه فایل (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 هم قرار بدیم.
در ریشه پروژه (یا هر محلی که بخواین)، یک پوشه به اسم دلخواه مثلا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 معرفی کنین.
باید مخزن محلیتون رو داخل بلاک repositories تعریف کنین و حتماً بالاتر از google() یا سایر مخازن قرار بدین تا اولویت با مخزن محلی باشه.
settings.gradle.kts) استفاده میکنین:dependencyResolutionManagement { repositories { maven { url = uri("$rootDir/maven-repo") } google() mavenCentral() } }
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 کافی نیست.
اگه این مقاله به کارتون اومد، یا تجربه مشابهی داشتین و یا راهحل بهتری میشناسین، خوشحال میشم اینجا با هم به اشتراک بذاریم.🌱