עדכונים לממשק ה-API של הפלאגין של Android Gradle

בדף הזה מתועדים הוצאות משימוש והסרות של ממשקי API של הפלאגין של Android Gradle ‏ (AGP), ומוסבר איך לעדכן את הקוד בהתאם.

מעקב אחר הוצאות משימוש והסרות של ממשקי API

בטבלה הבאה מפורט מתי ממשקי ה-API של AGP הוצאו משימוש והוסרו, בהתאם לגרסה של AGP.

API הוצאה משימוש בגרסה של AGP הוסר מגרסה של AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
טרנספורמציה 7.2 8.0

AGP 8.8

לפניכם עדכוני API חשובים ל-AGP 8.8.

הגדרות המשאבים הוצאו משימוש

הגדרות משאבים הווצאו משימוש החל מ-AGP 8.8. הסיבה לכך היא ש-AGP לא תומך יותר בצפיפות משאבים שונה, ושמעכשיו נדרש לפרסם אפליקציות כ-App Bundles ב-Google Play Console. כדי להגדיר את השפה, אפשר לציין את השפות המקומיות שהאפליקציה תומכת בהן באמצעות ה-DSL של localeFilters כדי למפות את הגדרות השפה המקומית למשאבים המתאימים.

AGP 8.0

לפניכם עדכוני API חשובים ל-AGP 8.0.

Transform API הוסר

החל מגרסה AGP 8.0, ממשק ה-API Transform הוסר. כלומר, כל הכיתות בחבילה com.android.build.api.transform יוסרו.

אנחנו מסירים את Transform API כדי לשפר את ביצועי ה-build. פרויקטים שמשתמשים ב-Transform API מאלצים את AGP להשתמש בתהליך build פחות מותאם, שעלול לגרום לנסיגה גדולה בזמני ה-build. בנוסף, קשה להשתמש ב-Transform API ולשלב אותו עם תכונות אחרות של Gradle. מטרת ממשקי ה-API החלופיים היא להקל על הרחבת AGP בלי להוסיף בעיות בביצועים או בתקינות ה-build.

ממשקי API חלופיים

אין תחליף יחיד ל-Transform API – יש ממשקי API חדשים ומותאמים לכל תרחיש לדוגמה. כל ממשקי ה-API החלופיים נמצאים בבלוק androidComponents {}. כל ממשקי ה-API האלה זמינים ב-AGP 7.2 ואילך.

תמיכה בטרנספורמציה של קוד בייט

כדי לשנות קוד בייט, משתמשים ב-Instrumentation API. בספריות, אפשר לרשום מכשיר למדידה רק לכיתות מקומיות בפרויקט. באפליקציות ובבדיקות, אפשר לרשום מכשיר למדידה רק לכיתות מקומיות או לכל הכיתות, כולל יחסי תלות מקומיים ומרוחקים. כדי להשתמש ב-API הזה, הכלי לכלי למדידה פועל בנפרד בכל כיתה, עם גישה מוגבלת לכיתות אחרות בנתיב הספריות (מידע נוסף זמין במאמר createClassVisitor()). ההגבלה הזו משפרת את הביצועים של גרסאות build מלאות ושל גרסאות build מצטברות, ומאפשרת לשמור על ממשק API פשוט. כל ספרייה מתבצעת במקביל ברגע שהיא מוכנה, ולא בסיום כל תהליך ה-compilation. בנוסף, שינוי בכיתה אחת אומר שצריך לבצע שוב הטמעה של המודולים רק בכיתות המושפעות ב-build מצטבר. דוגמה לשימוש ב-Instrumentation API מופיעה במתכון AGP Transforming classes with ASM.

תמיכה בהוספת כיתות שנוצרו לאפליקציה

כדי להוסיף לאפליקציה עוד כיתות שנוצרו, משתמשים ב-API של Artifacts עם MultipleArtifact.ALL_CLASSES_DIRS. באופן ספציפי, צריך להשתמש ב-

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

עם MultipleArtifact.ALL_CLASSES_DIRS כדי לצרף עוד ספריות שנוצרו לכיתות הפרויקט. ה-Artifacts API יבחר באופן אוטומטי מיקום ייחודי להפקת הפלט של המשימה בהתאמה אישית. במתכון addToAllClasses מוסבר איך משתמשים בממשק ה-API הזה.

תמיכה בטרנספורמציות שמבוססות על ניתוח של התוכנית כולה

כדי להטמיע טרנספורמציות שמבוססות על ניתוח של כל התוכנית, אפשר לבצע טרנספורמציה של כל הכיתות יחד במשימה אחת. יש להשתמש בגישה הזו בזהירות, כי העלות של ביצועי ה-build גבוהה בהרבה מאשר השימוש ב-Instrumentation API. אם הפלאגין שלכם משתמש ב-API הזה, מומלץ להגדיר את הטרנספורמציה כהסכמה לכל סוג build, כדי שמפתחי האפליקציה יוכלו להשבית אותה לגרסאות build לצורכי פיתוח.

כדי לרשום משימה שמבצעת טרנספורמציה של כל הכיתות יחד, ב-Android Gradle plugin 7.4 מופיע ה-API Artifacts.forScope. כדי להמיר את כל הכיתות בפרויקט הנוכחי, משתמשים ב-Artifacts.forScope.PROJECT. כדי להמיר את כל הכיתות בפרויקט הנוכחי, את הפרויקטים המיובאים ואת כל יחסי התלות החיצוניים, משתמשים ב-Artifacts.forScope.ALL. בקוד הבא מוסבר איך להשתמש ב-Artifacts.forScope.ALL כדי לרשום משימה שמבצעת טרנספורמציה של כל הכיתות יחד:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

לדוגמה לשימוש ב-API הזה, אפשר לעיין במתכון modifyProjectClasses, ולדוגמה לרישום של תוספים מותאמים אישית לסוגי ה-build של Android, אפשר לעיין במתכון customizeAgpDsl.

אם תרחיש לדוגמה לא מכוסה באף אחד מממשקי ה-API של AndroidComponents, אפשר לדווח על באג.

כמה יישומי פלאגין נפוצים כבר הועברו לשימוש ב-API החדשים האלה, כולל הפלאגין למעקב ביצועים של Firebase (גרסה 1.4.1 תואמת ל-AGP 8.0) והפלאגין Hilt Gradle (גרסה 2.40.1 תואמת ל-AGP 8.0). כלי Assistant Upgrade של AGP יעזור גם למפתחי פרויקטים לשדרג פלאגינים נפוצים לפי הצורך.

אם אתם משתמשים ב-Transform API דרך פלאגין של צד שלישי, עליכם להודיע למפתח שהפלאגין שלו צריך להתעדכן כדי לפעול עם ממשקי ה-API החדשים של AGP 8.0.

AGP 7.2

לפניכם עדכוני API חשובים ל-AGP 7.2.

RenderScript הוצא משימוש

החל מגרסה AGP 7.2, ממשקי ה-API של RenderScript הוצאו משימוש. הן ימשיכו לפעול, אבל יוצגו אזהרות לגביהן, והן יוסרו לגמרי בגרסאות עתידיות של AGP. במאמר מעבר מ-RenderScript מוסבר איך עוברים מ-RenderScript.

האפשרויות Component.transformClassesWith ו-Component.setAsmFramesComputationMode הוצאו משימוש

החל מגרסה AGP 7.2, ממשקי ה-API למדידה של קוד בייט של הכיתה Component.transformClassesWith ו-Component.setAsmFramesComputationMode הוצאו משימוש. הם הועברו לבלוק חדש, Component.instrumentation, שמכיל את כל ממשקי ה-API שקשורים להגדרת תהליך המדידה. כדי להמשיך להשתמש בתכונות המדידה האלה, צריך להשתמש ב-APIs המתאימים בבלוק החדש במקום זאת, כפי שמוצג בקטע הקוד הבא:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }