בקטע הזה מתוארים נושאים מתקדמים שיכולים להיות שימושיים כשרוצים להרחיב את הפלאגין של Android Gradle או לכתוב פלאגין משלכם.
פרסום יחסי תלות בין וריאנטים ללוגיקה מותאמת אישית
ספרייה יכולה לכלול פונקציות שפרויקטים או פרויקטים משניים אחרים עשויים להשתמש בהן. פרסום ספרייה הוא התהליך שבו הספרייה הופכת לזמינה לצרכנים שלה. בספריות אפשר לקבוע לאילו יחסי תלות יש גישה לצרכנים בזמן הידור ובזמן ריצה.
יש שתי הגדרות נפרדות שמכילות את יחסי התלות הטרנזיטיביים של כל classpath, והצרכנים צריכים להשתמש בהן כדי לצרוך את הספרייה כפי שמתואר בהמשך:
variant_nameApiElements
: ההגדרה הזו מכילה את יחסי התלות הטרנזיטיביים שזמינים לצרכנים בזמן הידור.variant_nameRuntimeElements
: ההגדרה הזו מכילה את יחסי התלות הטרנזיטיביים שזמינים לצרכנים בסביבת זמן הריצה.
למידע נוסף על הקשרים בין ההגדרות השונות, קראו את המאמר הגדרות הפלאגין של ספריית Java.
אסטרטגיות בהתאמה אישית לפתרון יחסי תלות
פרויקט עשוי לכלול תלות בשתי גרסאות שונות של אותה ספרייה, דבר שעלול להוביל לסכסוכים של יחסי תלות. לדוגמה, אם הפרויקט תלוי בגרסה 1 של מודול א' ובגרסה 2 של מודול ב', ומודול א' תלוי באופן עקיף בגרסה 3 של מודול ב', נוצר סכסוך בגרסאות של יחסי התלות.
כדי לפתור את העימות הזה, הפלאגין של Android Gradle משתמש באסטרטגיית פתרון התלות הבאה: כשהפלאגין מזהה שגרסאות שונות של אותו מודול נמצאות בתרשים התלות, כברירת מחדל הוא בוחר את הגרסה עם מספר הגרסה הגבוה ביותר.
עם זאת, יכול להיות שהשיטה הזו לא תמיד תפעל כמצופה. כדי להתאים אישית את האסטרטגיה לפתרון יחסי התלות, אפשר להשתמש בתצורות הבאות כדי לפתור יחסי תלות ספציפיים של וריאנט שנדרשים למשימה:
variant_nameCompileClasspath
: ההגדרה הזו מכילה את אסטרטגיית הפתרון של נתיב ה-classpath ל-compile של וריאנט נתון.variant_nameRuntimeClasspath
: ההגדרה הזו מכילה את אסטרטגיית הפתרון של classpath בסביבת זמן הריצה של וריאנט נתון.
הפלאגין של Android Gradle כולל פונקציות getter שאפשר להשתמש בהן כדי לגשת לאובייקטי ההגדרה של כל וריאנט. כך תוכלו להשתמש ב-Variant API כדי לשלוח שאילתה לגבי פתרון התלות, כפי שמתואר בדוגמה הבאה:
Kotlin
android { applicationVariants.all { // Return compile configuration objects of a variant. compileConfiguration.resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. runtimeConfiguration.resolutionStrategy { ... } // Return annotation processor configuration of a variant. annotationProcessorConfiguration.resolutionStrategy { ... } } }
Groovy
android { applicationVariants.all { variant -> // Return compile configuration objects of a variant. variant.getCompileConfiguration().resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. variant.getRuntimeConfiguration().resolutionStrategy { ... } // Return annotation processor configuration of a variant. variant.getAnnotationProcessorConfiguration().resolutionStrategy { ... } } }