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

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

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

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

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

  • תלויות פשוטות יותר: במקום כמה תלויות בספרייה, יש עכשיו תלות אחת ב-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 > חדש > קובץ).
  7. מדביקים את הקוד הבא בקובץ myFusedLibrary/build.gradle.kts:

Kotlin

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

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

dependencies { }

מגניב

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")
}

מגניב

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"])
        }
    }
}

מגניב

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"))
    }
}

מגניב

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

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

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

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

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

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

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

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

סוג התנהגות
שיעורים ספריות עם אותו נתיב מחלקה יגרמו לכשל בבנייה כשממזגים את הספרייה.
משאבי 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 כדי לראות את מצב ההגדרות של הפלאגינים.