פרסום כמה ספריות Android כספרייה אחת באמצעות Fused Library

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

הפלאגין Fused Library שכלול בחבילה של Android Gradle Plugin עוזר לארוז כמה מודולים של ספריות Android לספריית Android אחת שאפשר לפרסם. כך תוכלו ליצור מודולים של קוד המקור והמשאבים של הספרייה בתוך ה-build לפי הצורך, בלי לחשוף את המבנה של הפרויקט אחרי הפצתו.

להפצה כספרייה אחת יש כמה יתרונות:

  • יחסי תלות פשוטים יותר: החלפת מספר יחסי תלות בספריות ב-AAR יחיד, שמפשט את הגדרת הפרויקט ואת ניהול הגרסאות של המשתמשים
  • גודל ספרייה מופחת: יכול לשפר את כיווץ הקוד, וכתוצאה מכך להקטין את AAR
  • אבטחה משופרת: אפשר לשלוט טוב יותר בפרטי ההטמעה הפנימיים של ספריות שפורסמו

יצירת ספרייה משולבת

כדי ליצור ספרייה משולבת, צריך ליצור מודול חדש ל-Android, להוסיף יחסי תלות ולאחר מכן לפרסם את הספרייה המשולבת.

הוספת מודול חדש של ספרייה משולבת

כדי להשתמש בפלאגין, צריך להוסיף לפרויקט מודול חדש ל-Android:

בדוגמה הזו, מודול הספרייה המשולבת ייקרא myFusedLibrary.

  1. כדי להפעיל תמיכה בספרייה מיזוגת, מוסיפים את הערך android.experimental.fusedLibrarySupport=true לקובץ gradle.properties.
  2. מוסיפים את הקובץ include(":myFusedLibrary") לקובץ settings.gradle.kts.
  3. מוסיפים את android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } בקטע [plugins] בקובץ gradle/libs.versions.toml.
  4. מוסיפים את alias(libs.plugins.android.fusedlibrary) apply false בבלוק התוספים בקובץ build.gradle.kts ברמה העליונה.
  5. כדי ליצור את המודול myFusedLibrary, יוצרים ספרייה חדשה בשם myFusedLibrary (לוחצים לחיצה ימנית על 'האפליקציה שלי' > חדש > ספרייה).
  6. יוצרים קובץ build.gradle.kts במודול myFusedLibrary (לוחצים לחיצה ימנית על המודול myFusedLibrary > New > File).
  7. מדביקים את הטקסט הבא בקובץ myFusedLibrary/build.gradle.kts:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {
    namespace = "com.example.myFusedLibrary"
    minSdk = 21
}

dependencies { }

Groovy

plugins {
    id 'fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

הוספת יחסי תלות

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

לדוגמה:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}

פרסום הספרייה המשולבת

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

  • צריך להחיל את הפלאגין Maven Publish גם על כל מודול שבו הוחל הפלאגין Fused Library.
  • ספריית הפרסום חייבת לרשת את fusedLibraryComponent כי היא מספקת את יחסי התלות הנדרשים כדי לקמפל את פריט המידע שנוצר בתהליך הפיתוח (Artifact) של הספרייה המשולבת.

דוגמה להגדרת פרסום:

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        register<MavenPublication>("release") {
             groupId = "my-company"
             artifactId = "my-fused-library"
             version = "1.0"
             from(components["fusedLibraryComponent"])
        }
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

androidFusedLibrary {  }

dependencies {  }

publishing {
    publications {
        release(MavenPublication) {
            groupId = "my-company"
            artifactId = "my-fused-library"
            version = "1.0"
            afterEvaluate {
            from components.fusedLibraryComponent
        }
    }
}

פרסום הספרייה המשולבת לצורך בדיקה

צריך לבדוק את התלות בספרייה מיזוגית שפורסמה מאפליקציית Android או מספריית Android. השיטה המומלצת היא לפרסם את הספרייה הממוזגת ואת יחסי התלות של הפרויקט שלה במאגר Maven מקומי.

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

Kotlin

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

repositories {
    maven {
        name = "myLocalRepo"
        url = uri(layout.buildDirectory.dir("myLocalRepo"))
    }
}

Groovy

plugins {
    id 'fused-library'
    id 'maven-publish'
}

repositories {
    maven {
        name 'myLocalRepo'
        url layout.buildDirectory.dir('myLocalRepo')
    }
}

העלאת הספרייה המשולבת

במאמר העלאת הספרייה מוסבר איך להפיץ את הספרייה המשולבת.

התנהגות ואמצעי הגנה

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

  • אפשר לפרסם ספריות מחוברות רק כ-AAR של ארטיפקט ספרייה של Android, כדי להוסיף אותן כיחסי תלות.
  • אין תמיכה בשילוב ספריות שמשתמשות בקישור נתונים.
  • אי אפשר למזג כמה סוגים של גרסאות build וסוגים של מוצרים בספרייה אחת. יוצרים ספריות מיזוג נפרדות לוריאנטים שונים.

כדי לאזן בין כמות ההגדרות הנדרשות לבין קלות השימוש, הפלאגין יגרום לכשל ב-build במקרה של התנגשויות לא ברורות, או ישתמש בהיגוריית חיבור (heuristics) כשישלב את הארטיפקטים. בטבלה הבאה מפורט איך הארטיפקטים מתמזגים:

סוג התנהגות
שיעורים ספריות עם אותו classpath יגרמו לכשל build במהלך מיזוג הספרייה.
משאבי Android במיזוג המשאבים, המערכת תתייחס לסדר של יחסי התלות שצוינו בבחירת משאב בעל שם זהה במקור אחר.
מטא-נתונים של AAR הגרסאות של המטא-נתונים של AAR מוזגו על ידי מתן עדיפות לערך הגבוה ביותר מכל ספריית תלות. יש שפת DSL שמאפשרת לשנות את הערכים האלה.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
משאבי Java אסור להשתמש בקבצי משאבים של Java בכמה ספריות עם נתיבים זהים, כי זה יוביל לכישלון ה-build.

בעיות מוכרות

Fused Library הוא פלאגין חדש, ויש בו בעיות ידועות שאנחנו עובדים על תיקון שלהן כדי לעמוד בכל תרחישי השימוש.

  • קבצים מסוג lint.jar לא נכללים ב-AAR הממוזג
  • הוספת יחסי תלות של קבצים לקובצי ‎ .aar אחרים
  • אין תמיכה בשילוב של פריטים מ-RenderScript ו-Prefab

הסבר על יחסי התלות בספרייה משולבת

לספרייה הממוזגת אין מקורות, והיא משתמשת בספריות Android כמקור היחיד שלה. לכן חשוב להבין מה מגיע מאיפה. כדי לקבל רשימה של יחסי התלות שמשולבים באובייקט הארטיפקט שנוצר ושל יחסי התלות הנדרשים כדי ליצור את האובייקט הארטיפקט, מריצים את המשימה gradle :report בספרייה המשולבת. המשימות יוצרות דוח JSON שנשמר בספרייה המשולבת בספרייה build/reports.

למידע נוסף שקשור ליחסי התלות הפנימיים של הפלאגין, אפשר להריץ את המשימה gradle :dependencies כדי להציג את המצב של הגדרות הפלאגין.