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

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

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

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

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

AGP 8.0

בטבלה הבאה מפורטים עדכוני API חשובים ל-AGP 8.0.

Transform API הוסר

החל מ-AGP 8.0, טרנספורמציה ה-API הוסר. זה אומר שכל הכיתות בחבילה com.android.build.api.transform הוסרו.

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

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

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

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

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

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

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

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

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

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

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

כדי לרשום משימה שמשנה את כל הכיתות ביחד, צריך להשתמש בפלאגין של Android Gradle בגרסה 7.4 מציג את Artifacts.forScope API. כדי לשנות את כל המחלקות בפרויקט הנוכחי, משתמשים 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,
    )

לצפייה לשינוי המתכון שלProjectClasses דוגמה לאופן השימוש ב-API הזה CustomizeAgpDsl דוגמה לרישום תוספים מותאמים אישית לסוגי ה-build של Android.

אם התרחיש לדוגמה שלכם לא מכוסה על ידי אף Androidרכיבי יש לדווח על באג.

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

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

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