החלת לוגיקה מותאמת אישית של build

בקטע הזה מתוארים נושאים מתקדמים שימושיים כשרוצים להרחיב את הפלאגין Android Gradle או לכתוב פלאגין משלך.

פרסום יחסי תלות של וריאנטים בלוגיקה מותאמת אישית

לספרייה יכולה להיות פונקציות שיש לפרויקטים אחרים או לפרויקטי משנה אחרים שבהם רוצים להשתמש. פרסום ספרייה הוא התהליך שבו נוצרת הספרייה זמינים לצרכנים שלה. ספריות יכולות לקבוע באילו יחסי תלות שאליהם יש לצרכנים גישה בזמן הידור ובזמן הריצה.

יש שתי הגדרות נפרדות ששומרות את יחסי התלות המעבריים כל נתיב כיתה שהצרכנים צריכים להשתמש בו כדי לצרוך את הספרייה בהמשך:

  • variant_nameApiElements: ההגדרה הזו כוללת את של יחסי התלות טרנזיטיביים שזמינים לצרכנים בזמן המורכבות.
  • variant_nameRuntimeElements: ההגדרה הזו כוללת הם יחסי התלות המעבריים שזמינים לצרכנים בזמן הריצה.

כדי לקבל מידע נוסף על הקשרים בין ההגדרות האישיות השונות, נכנסים אל The Java Library הגדרות של יישומי פלאגין.

אסטרטגיות מותאמות אישית לפתרון יחסי תלות

פרויקט עשוי לכלול תלות בשתי גרסאות שונות של אותה ספרייה מה שעלול להוביל להתנגשויות תלות. לדוגמה, אם הפרויקט תלוי בגרסה 1 של מודול A ובגרסה 2 של מודול ב' ומודול א' תלויים באופן זמני בגרסה 3 של מודול B, נוצר התנגשות בין גרסאות של תלות.

כדי לפתור את ההתנגשות, הפלאגין Android Gradle משתמש באפשרויות הבאות אסטרטגיה לרזולוציית תלות: כאשר הפלאגין מזהה שגרסאות שונות של אותו מודול נמצאים בתרשים התלות, כברירת מחדל הוא בוחר עם מספר הגרסה הגבוה ביותר.

עם זאת, יכול להיות שהשיטה הזו לא תמיד תפעל בהתאם לציפיות שלכם. כדי להתאים אישית את את האסטרטגיה לרזולוציית התלות, השתמשו בתצורות הבאות כדי פותרים יחסי תלות ספציפיים של וריאציה שדרושים למשימה:

  • variant_nameCompileClasspath: ההגדרות האישיות האלה מכיל את אסטרטגיית הפתרון לנתיב הידור של וריאנט מסוים.
  • variant_nameRuntimeClasspath: ההגדרות האישיות האלה מכיל את אסטרטגיית הפתרון לנתיב ה-classpath של סביבת זמן הריצה של וריאנט.

הפלאגין של Android Gradle כולל כלים שמאפשרים לגשת אל של כל וריאנט. לכן אפשר להשתמש בווריאנט 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 {
            ...
        }
    }
}

מגניב

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 {
            ...
        }
    }
}