בנה עבור ארכיטקטורות 32 סיביות ו-64 סיביות

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

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

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

זהה ארכיטקטורת מעבד שנייה ו-ABI

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

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

לדוגמה של makefile שמשתמש במשתנים אלה, ראה build/make/target/board/generic_arm64/BoardConfig.mk .

ב-build multilib, שמות המודולים ב- PRODUCT_PACKAGES מכסים גם את הקובץ הבינארי של 32 סיביות וגם של 64 סיביות, כל עוד הם מוגדרים על ידי מערכת הבנייה. עבור ספריות הכלולות לפי תלות, ספריית 32 סיביות או 64 סיביות מותקנת רק אם היא נדרשת על ידי ספריית 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 .

כדי לעקוף TARGET_PREFER_32_BIT , הגדר LOCAL_MULTILIB לאחד מהאפשרויות הבאות:

  • both בונים גם 32 סיביות וגם 64 סיביות.
  • 32 בונה רק 32 סיביות.
  • 64 בונה רק 64 סיביות.
  • בונה first עבור הארכיטקטורה הראשונה בלבד (32 סיביות בהתקני 32 סיביות ו-64 סיביות בהתקני 64 סיביות).

כברירת מחדל, LOCAL_MULTILIB לא מוגדר ומערכת הבנייה מחליטה איזו ארכיטקטורה לבנות בהתבסס על מחלקת המודול ומשתנים אחרים 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 . אם הארכיטקטורה הנבנית not ברשימה זו, המודול הנוכחי נכלל במערכת הבנייה.

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

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

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

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

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

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

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

  • 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_ARCH בשילוב עם TARGET_2ND_ARCH , כדי לציין את ארכיטקטורת המערכת של היעדים הבינאריים הבנויים מראש. במקום זאת, השתמש במשתני LOCAL_ * LOCAL_MODULE_TARGET_ARCH או LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH .

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

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

ודא יצירת קובצי ODEX של 32 סיביות ו-64 סיביות

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