בפרויקטים עם הרבה מודולים, יכול להיות שיהיה קשה לחלק את ספריות Android למשתמשים תוך שמירה על מבנה פרויקט ברור. במקרים רבים, צריך לפרסם הרבה יותר ספריות ממה שתוכנן.
הפלאגין Fused Library שכלול בחבילה של Android Gradle Plugin עוזר לארוז כמה מודולים של ספריות Android לספריית 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
(לוחצים לחיצה ימנית על 'האפליקציה שלי' > חדש > ספרייה). - יוצרים קובץ
build.gradle.kts
במודולmyFusedLibrary
(לוחצים לחיצה ימנית על המודולmyFusedLibrary
> New > File). - מדביקים את הטקסט הבא בקובץ
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 שמאפשרת לשנות את הערכים האלה. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
משאבי Java | אסור להשתמש בקבצי משאבים של Java בכמה ספריות עם נתיבים זהים, כי זה יוביל לכישלון ה-build. |
בעיות מוכרות
Fused Library הוא פלאגין חדש, ויש בו בעיות ידועות שאנחנו עובדים על תיקון שלהן כדי לעמוד בכל תרחישי השימוש.
- קבצים מסוג
lint.jar
לא נכללים ב-AAR הממוזג - הוספת יחסי תלות של קבצים לקובצי .aar אחרים
- אין תמיכה בשילוב של פריטים מ-RenderScript ו-Prefab
הסבר על יחסי התלות בספרייה משולבת
לספרייה הממוזגת אין מקורות, והיא משתמשת בספריות Android כמקור היחיד שלה. לכן חשוב להבין מה מגיע מאיפה. כדי לקבל רשימה של יחסי התלות שמשולבים באובייקט הארטיפקט שנוצר ושל יחסי התלות הנדרשים כדי ליצור את האובייקט הארטיפקט, מריצים את המשימה gradle :report
בספרייה המשולבת. המשימות יוצרות דוח JSON שנשמר בספרייה המשולבת בספרייה build/reports
.
למידע נוסף שקשור ליחסי התלות הפנימיים של הפלאגין, אפשר להריץ את המשימה gradle :dependencies
כדי להציג את המצב של הגדרות הפלאגין.