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

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

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

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

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

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

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

דרישות מוקדמות

כדי להשתמש בפלאגין Fused Library, צריך להשתמש ב-AGP 9.0 ואילך. בגרסאות קודמות של הפלאגין Fused Library יש התנהגות שונה ובעיות שמתוקנות ב-AGP 9.0.

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

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

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

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

Kotlin

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

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

dependencies { }

Groovy

plugins {
    id 'com.android.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 Plugin על כל מודול שהוחל עליו Fused Library Plugin.
  • הפרסום חייב להיות נגזר מ-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 'com.android.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 'com.android.fused-library'
    id 'maven-publish'
}

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

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

כדי להפיץ את הספרייה המאוחדת, אפשר לעיין במאמר בנושא העלאת הספרייה.

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

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

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

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

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

Kotlin

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

בעיות מוכרות

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

  • אי אפשר ליצור קובצי JAR של מקור
  • הוספת יחסי תלות של קבצים בקובצי ‎ .aar אחרים
  • אין תמיכה במיזוג של RenderScript ופריטי מידע של Prefab

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

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

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