מערכת build של Sog

לפני השקת Android 7.0, מערכת Android השתמשה יצרן GNU אך ורק לתיאור ולביצוע של כללי ה-build שלו. מערכת ה-build של Make נעשה שימוש נרחב בתמיכה ובשימוש, אבל בקנה מידה גדול של Android הפך לאיטי, מועד לשגיאות, בלתי ניתן להתאמה וקשה לבדיקה. מערכת build של Sog מספקת את הגמישות הדרושה לגרסאות build של Android.

לכן אנחנו מצפים שמפתחי פלטפורמות יעברו מ-Maker בקרוב. לשלוח שאלות פיתוח מכשירי Android קבוצה ב-Google לקבלת תמיכה.

מה זה סונג?

מערכת ה-build של Sog הושקה ב-Android 7.0 (Nougat) כדי להחליף את Maker. הוא מנצל את GNU Kati כלי ליצירת שכפול ולמערכת build של Ninja להאצת גרסאות build של Android.

לצפייה מערכת Android Maker Build בתיאור של פרויקט הקוד הפתוח של Android (AOSP) הוראות וגם יצירת שינויים במערכת שמיועדים לכותבי Android.mk כדי ללמוד על השינויים שדרושים להתאמה מ'לעשות' ל'סוונג'.

ניתן לעיין ברשומות הקשורות ל-build של מונחי מפתח לקבלת פרטים מלאים, קובצי עזר של Soong.

השוואה לשוק וסונג

הנה השוואה בין הגדרת Make ל-Songg שמבצעת את אותה פעולה: קובץ תצורה של Soundg (תוכנית שיווקית או .bp).

יצירת דוגמה

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

דוגמה למֶסֶר

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

דוגמאות להגדרות ספציפיות ל-Sung זמינות כאן הגדרת build פשוטה

להסבר על השדות בקובץ Android.bp, אפשר לעיין במאמר פורמט הקובץ Android.bp.

מודולים מיוחדים

לחלק מקבוצות המודולים המיוחדות יש מאפיינים ייחודיים.

מודולים של ברירות מחדל

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

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

מודולים מוכנים מראש

חלק מסוגי המודולים המובנים מראש מאפשרים למודול לקבל את אותו שם כמו מקבילות שמבוססות על מקור. לדוגמה, יכול להיות גם cc_prebuilt_binary בשם foo כשכבר יש cc_binary בשם הזה. הפעולה הזאת נותנת למפתחים את הגמישות לבחור איזו גרסה לכלול המוצר. אם תצורת build מכילה את שתי הגרסאות, הדגל prefer בהגדרה של המודול המובנה קובע איזו גרסה תקבל עדיפות. לתשומת ליבכם: לחלק מהמודולים המובנים מראש יש שמות שאינם מתחילים ב-prebuilt. כמו android_app_import.

מודולים של מרחב שמות

עד ש-Android יבצע את ההמרה המלאה מ-Make ל-Sung, הגדרת המוצר 'לעשות' חייב לציין ערך PRODUCT_SOONG_NAMESPACES. שלו הערך צריך להיות רשימה מופרדת ברווחים של מרחבי שמות שאותם מייצאת בקרוב. שרוצים ליצור באמצעות הפקודה m. לאחר השלמת ההמרה של Android ל-Sung, הפרטים של הפעלת מרחבי שמות עשויים להשתנות.

בקרוב אפשר לציין בספריות שונות את היכולת לציין זהה, כל עוד כל מודול מוצהר בתוך מרחב שמות נפרד. א' אפשר להצהיר על מרחב שמות כך:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

שימו לב שלמרחב שמות אין מאפיין שם. הנתיב שלו משתנה באופן אוטומטי שמוקצה לו כשם.

לכל מודול Sung מוקצה מרחב שמות על סמך המיקום שלו בעץ. כל מודול Sog נחשב כמרחב השמות שמוגדר על ידי soong_namespace נמצא בקובץ Android.bp בספרייה הנוכחית או ספריית האב הקרובה ביותר. אם לא נמצא מודול soong_namespace כזה, נחשב כמרחב השמות המשתמע של שורש.

לדוגמה: סונג מנסה לפתור את התלות ד' שהוצהרה על ידי מודול M במרחב השמות N שמיובא מרחבי שמות I1, I2, I3...

  1. לאחר מכן, אם D הוא שם שמוגדר במלואו של הטופס //namespace:module, רק המערכת מחפשת במרחב השמות שצוין את שם המודול שצוין.
  2. אחרת, סונג מחפש תחילה מודול בשם D שהוצהר במרחב השמות לא
  3. אם המודול הזה לא קיים, סונג מחפש מודול בשם D מרחבי שמות I1, I2, I3...
  4. לבסוף, סונג מחפש את מרחב השמות של הרמה הבסיסית (root).