הבנת Builds של 64 סיביות

מערכת ה-build תומכת בבניית קבצים בינאריים עבור שתי ארכיטקטורות מעבד יעד (64 סיביות ו-32 סיביות) באותו מבנה. זה ידוע בתור build multilib .

עבור ספריות סטטיות מקוריות וספריות משותפות, מערכת הבנייה מגדירה כללים לבניית קבצים בינאריים עבור שתי הארכיטקטורות. תצורת המוצר ( PRODUCT_PACKAGES ), יחד עם גרף התלות, קובעים אילו קבצים בינאריים נבנים ומותקנים בתמונת המערכת.

עבור קובצי הפעלה ויישומים, מערכת ה-build בונה רק את גרסת ה-64 סיביות כברירת מחדל, אך אתה יכול לעקוף את ההגדרה הזו עם משתנה BoardConfig.mk גלובלי או משתנה בהיקף מודול.

תצורת המוצר

BoardConfig.mk כולל את המשתנים הבאים כדי להגדיר את ארכיטקטורת ה-CPU השנייה ואת ABI:

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

אתה יכול לראות דוגמה ב- build/target/board/generic_arm64/BoardConfig.mk .

ב-build multilib, שמות המודולים ב- PRODUCT_PACKAGES מכסים גם את הקובץ הבינארי של 32 סיביות וגם של 64 סיביות, כל עוד הם מוגדרים על ידי מערכת הבנייה. עבור ספריות שנמשכות על ידי תלות, ספריית 32 סיביות מותקנת רק אם היא נדרשת על ידי ספריית 32 סיביות אחרת או קובץ הפעלה אחר. הדבר נכון גם לגבי ספריות 64 סיביות.

עם זאת, שמות המודולים בשורת הפקודה make מכסים רק את גרסת 64 סיביות. לדוגמה, לאחר הפעלת lunch aosp_arm64-eng , הפוך make libc בונה רק את libc של 64 סיביות. כדי לבנות את ה-libc של 32 סיביות, עליך להפעיל make libc_32 .

הגדרת מודול ב-Android.mk

אתה יכול להשתמש במשתנה LOCAL_MULTILIB כדי להגדיר את ה-build שלך עבור 32 סיביות/64 סיביות ולעקוף את המשתנה הגלובלי TARGET_PREFER_32_BIT .

הגדר את LOCAL_MULTILIB לאחד מהאפשרויות הבאות:

  • "both" בונה גם 32 סיביות וגם 64 סיביות.
  • "32" בונה רק 32 סיביות.
  • "64" בונה רק 64 סיביות.
  • "first" בונה רק עבור הארכיטקטורה הראשונה (32 סיביות במכשירי 32 סיביות ו-64 סיביות בהתקני 64 סיביות).
  • "" הוא ברירת המחדל. מערכת הבנייה מחליטה איזו ארכיטקטורה לבנות בהתבסס על מחלקת המודול ומשתנים אחרים של LOCAL_ , כגון LOCAL_MODULE_TARGET_ARCH ו- LOCAL_32_BIT_ONLY .

אם ברצונך לבנות את המודול שלך עבור ארכיטקטורות ספציפיות, השתמש במשתנים הבאים:

  • LOCAL_MODULE_TARGET_ARCH
    הגדר משתנה זה לרשימת ארכיטקטורות, כגון arm x86 arm64 . אם הארכיטקטורה הנבנית נמצאת ברשימה זו, המודול הנוכחי נכלל במערכת הבנייה.
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
    משתנה זה הוא ההפך מ- LOCAL_MODULE_TARGET_ARCH . אם הארכיטקטורה הנבנית אינה ברשימה זו, המודול הנוכחי נכלל במערכת הבנייה.

ישנן גרסאות מינוריות של שני המשתנים הללו:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

מערכת הבנייה מזהירה אם הדילוג על המודול הנוכחי בגלל הארכיטקטורות המפורטות.

כדי להגדיר דגלי בנייה עבור ארכיטקטורה מסוימת, השתמש במשתני LOCAL_ הספציפיים לארכיטקטורה. משתנה LOCAL_ ספציפי לארכיטקטורה הוא משתנה LOCAL_ רגיל עם סיומת ארכיטקטורה, לדוגמה:

  • LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
  • LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
  • LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,

משתנים אלה מיושמים רק אם בינארי נבנה כעת עבור ארכיטקטורה זו.

לפעמים קל יותר להגדיר דגלים על סמך האם הבינארי נבנה כעת עבור 32 סיביות או 64 סיביות. השתמש במשתנה LOCAL_ עם סיומת _64 _32 לדוגמה:

  • LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
  • LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
  • LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,

התקנת נתיב

בעבר, אתה יכול להשתמש ב- LOCAL_MODULE_PATH כדי להתקין ספרייה במיקום אחר מאשר ברירת המחדל. לדוגמה, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw .

ב-build multilib, השתמש ב- LOCAL_MODULE_RELATIVE_PATH במקום זאת:

LOCAL_MODULE_RELATIVE_PATH := hw

עם פורמט זה, גם ספריות 64 סיביות ו-32 סיביות מותקנות במקום הנכון.

אם אתה בונה קובץ הפעלה כ-32 סיביות וגם כ-64 סיביות, השתמש באחד מהמשתנים הבאים כדי להבחין בנתיב ההתקנה:

  • LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64
    מציין את שם הקובץ המותקן.
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
    מציין את נתיב ההתקנה.

מקורות שנוצרו

ב-build multilib, אם אתה יוצר קבצי מקור ל $(local-intermediates-dir) (או $(intermediates-dir-for) עם משתנים מפורשים), זה לא עובד בצורה מהימנה. הסיבה לכך היא שמקורות הביניים שנוצרו נדרשים הן על ידי 32-bit ו-64-bit, אבל $(local-intermediates-dir) מצביע רק על אחת משתי ספריות הביניים.

מערכת ה-build מספקת ספריית ביניים ייעודית, ידידותית ל-multilib, להפקת מקורות. אתה יכול לקרוא $(local-generated-sources-dir) או $(generated-sources-dir-for) כדי לקבל את הנתיב של הספרייה. השימושים שלהם דומים ל $(local-intermediates-dir) ו $(intermediates-dir-for) .

אם נוצר קובץ מקור לספרייה הייעודית הזו ונקלט על ידי LOCAL_GENERATED_SOURCES , הוא בנוי ל-32 סיביות וגם ל-64 סיביות ב-build multilib.

בנוי מראש

ב-build multilib, אינך יכול להשתמש ב- TARGET_ARCH (או יחד עם TARGET_2ND_ARCH ) כדי לומר למערכת ה-build לאיזו ארכיטקטורה המטרות הבינאריות שנבנו מראש. במקום זאת, השתמש במשתני LOCAL_ LOCAL_MODULE_TARGET_ARCH או LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH .

עם משתנים אלה, מערכת ה-build יכולה לבחור את הבינארי הנבנה מראש של 32 סיביות המקביל, גם אם היא עובדת על בנייה של 64 סיביות multilib.

אם ברצונך להשתמש בארכיטקטורה שנבחרה כדי לחשב את נתיב המקור עבור הבינארי שנבנה מראש, קרא $(get-prebuilt-src-arch) .

יצירת קבצי ODEX

עבור התקני 64 סיביות, כברירת מחדל אנו יוצרים קובצי ODEX של 32 סיביות ו-64 סיביות עבור תמונת האתחול וכל ספריית Java. עבור APKs, כברירת מחדל אנו יוצרים ODEX רק עבור ארכיטקטורת ה-64 סיביות הראשית. אם אפליקציה תושק גם בתהליכים של 32 סיביות וגם בתהליכים של 64 סיביות, השתמש ב- LOCAL_MULTILIB := both כדי לוודא שנוצרים גם קובצי 32-bit וגם 64-bit ODEX. אם לאפליקציה יש ספריות של 32 סיביות או 64 סיביות JNI, הדגל הזה גם אומר למערכת הבנייה לכלול אותן.