בפרויקטים עם מודולים רבים, יכול להיות קשה להפיץ ספריות של Android למשתמשים תוך שמירה על מבנה פרויקט ברור. במקרים רבים, צריך לפרסם הרבה יותר ספריות ממה שרציתם.
הפלאגין Fused Library שכלול ב-Android Gradle Plugin עוזר לארוז כמה מודולים של Android Library בספריית Android אחת שאפשר לפרסם. כך תוכלו להפוך את קוד המקור והמשאבים של הספרייה למודולריים בתוך ה-build, לפי הצורך, וגם למנוע חשיפה של מבנה הפרויקט אחרי ההפצה.
להפצה כספרייה יחידה יש כמה יתרונות:
- תלויות פשוטות יותר: במקום כמה תלויות בספריות, יש עכשיו תלות אחת ב-AAR, וכך המשתמשים יכולים להגדיר את הפרויקט ולנהל את הגרסאות בצורה פשוטה יותר
- הפחתת גודל הספריות: יכולה לשפר את כיווץ הקוד, וכך להקטין את קובצי ה-AAR
- אבטחה משופרת: יכולה להציע שליטה טובה יותר בפרטי ההטמעה הפנימיים של ספריות שפורסמו
יצירת ספרייה משולבת
כדי ליצור ספרייה מאוחדת, צריך ליצור מודול Android חדש, להוסיף תלות ואז לפרסם את הספרייה המאוחדת.
הוספת מודול חדש של ספרייה מאוחדת
כדי להשתמש בתוסף, צריך להוסיף מודול Android חדש לפרויקט:
בדוגמה הזו, מודול הספרייה המאוחד ייקרא myFusedLibrary.
- כדי להפעיל תמיכה בספרייה מאוחדת, מוסיפים את המחרוזת
android.experimental.fusedLibrarySupport=trueלקובץgradle.properties. - מוסיפים את
include(":myFusedLibrary")לקובץsettings.gradle.kts. - מוסיפים את
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }בקטע[plugins]בקובץgradle/libs.versions.toml. - מוסיפים
alias(libs.plugins.android.fusedlibrary) apply falseבבלוק התוספים בקובץbuild.gradle.ktsברמה העליונה. - כדי ליצור את המודול
myFusedLibrary, יוצרים ספרייה חדשה בשםmyFusedLibrary(לוחצים לחיצה ימנית על My Application (האפליקציה שלי) > New (חדש) > Directory (ספרייה)). - יוצרים קובץ
build.gradle.ktsבמודולmyFusedLibrary(לוחצים לחיצה ימנית על המודולmyFusedLibrary> חדש > קובץ). - מדביקים את הטקסט הבא לקובץ
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 כדי לראות את מצב ההגדרות של התוספים.