64-बिट बिल्ड को समझना

बिल्ड सिस्टम एक ही बिल्ड में दो लक्ष्य CPU आर्किटेक्चर (64 बिट और 32 बिट) के लिए बायनेरिज़ बनाने का समर्थन करता है। इसे मल्टीलिब बिल्ड के रूप में जाना जाता है।

देशी स्थिर पुस्तकालयों और साझा पुस्तकालयों के लिए, बिल्ड सिस्टम दोनों आर्किटेक्चर के लिए बायनेरिज़ बनाने के लिए नियम निर्धारित करता है। उत्पाद कॉन्फ़िगरेशन ( PRODUCT_PACKAGES ), निर्भरता ग्राफ के साथ, यह निर्धारित करता है कि सिस्टम छवि में कौन से बायनेरिज़ बनाए और स्थापित किए गए हैं।

निष्पादन योग्य और ऐप्स के लिए, बिल्ड सिस्टम डिफ़ॉल्ट रूप से केवल 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 में एक उदाहरण देख सकते हैं।

मल्टीलिब बिल्ड में, PRODUCT_PACKAGES में मॉड्यूल नाम 32-बिट और 64-बिट बायनेरिज़ दोनों को कवर करते हैं, जब तक कि वे बिल्ड सिस्टम द्वारा परिभाषित होते हैं। निर्भरता द्वारा खींचे गए पुस्तकालयों के लिए, 32-बिट लाइब्रेरी केवल तभी स्थापित की जाती है जब किसी अन्य 32-बिट लाइब्रेरी या निष्पादन योग्य द्वारा इसकी आवश्यकता होती है। 64-बिट पुस्तकालयों के लिए भी यही सच है।

हालांकि, make कमांड लाइन पर मॉड्यूल नाम केवल 64-बिट संस्करण को कवर करते हैं। उदाहरण के लिए, lunch aosp_arm64-eng , make libc केवल 64-बिट libc बनाता है। 32-बिट libc बनाने के लिए, आपको make libc_32 चलाने की आवश्यकता है।

Android.mk . में मॉड्यूल परिभाषा

आप अपने बिल्ड को 32 बिट/64 बिट के लिए कॉन्फ़िगर करने के लिए LOCAL_MULTILIB चर का उपयोग कर सकते हैं और वैश्विक 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 बिट के लिए बनाई जा रही है या नहीं। _32 या _64 प्रत्यय के साथ LOCAL_ चर का उपयोग करें, उदाहरण के लिए:

  • 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

मल्टीलिब बिल्ड में, इसके बजाय 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
    स्थापना पथ निर्दिष्ट करता है।

उत्पन्न स्रोत

एक मल्टीलिब बिल्ड में, यदि आप स्रोत फ़ाइलों को $(local-intermediates-dir) (या $(intermediates-dir-for) स्पष्ट चर के साथ उत्पन्न करते हैं), तो यह विश्वसनीय रूप से काम नहीं करता है। ऐसा इसलिए है क्योंकि 32-बिट और 64-बिट बिल्ड दोनों के लिए इंटरमीडिएट जेनरेट किए गए स्रोतों की आवश्यकता होती है, लेकिन $(local-intermediates-dir) केवल दो मध्यवर्ती निर्देशिकाओं में से एक को इंगित करता है।

बिल्ड सिस्टम स्रोत उत्पन्न करने के लिए एक समर्पित, बहु-अनुकूल, मध्यवर्ती निर्देशिका प्रदान करता है। निर्देशिका का पथ प्राप्त करने के लिए आप $(local-generated-sources-dir) या $(generated-sources-dir-for) पर कॉल कर सकते हैं। उनके उपयोग $(local-intermediates-dir) और $(intermediates-dir-for) समान हैं।

यदि इस समर्पित निर्देशिका के लिए एक स्रोत फ़ाइल उत्पन्न होती है और LOCAL_GENERATED_SOURCES द्वारा उठाई जाती है, तो यह एक मल्टीलिब बिल्ड में 32 बिट और 64 बिट दोनों के लिए बनाई गई है।

पूर्वनिर्मित

मल्टीलिब बिल्ड में, आप बिल्ड सिस्टम को यह बताने के लिए TARGET_ARCH (या साथ में TARGET_2ND_ARCH ) का उपयोग नहीं कर सकते हैं कि प्रीबिल्ट बाइनरी लक्ष्य कौन सा आर्किटेक्चर है। इसके बजाय, LOCAL_ चर LOCAL_MODULE_TARGET_ARCH या LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH का उपयोग करें।

इन चरों के साथ, बिल्ड सिस्टम संबंधित 32-बिट प्रीबिल्ट बाइनरी चुन सकता है, भले ही वह 64-बिट मल्टीलिब बिल्ड पर काम कर रहा हो।

यदि आप प्रीबिल्ट बाइनरी के स्रोत पथ की गणना करने के लिए चुने हुए आर्किटेक्चर का उपयोग करना चाहते हैं, तो $(get-prebuilt-src-arch) कॉल करें।

ODEX फ़ाइल जनरेशन

64-बिट उपकरणों के लिए, डिफ़ॉल्ट रूप से हम बूट छवि और किसी भी जावा लाइब्रेरी के लिए 32-बिट और 64-बिट दोनों ODEX फ़ाइलें उत्पन्न करते हैं। APK के लिए, डिफ़ॉल्ट रूप से हम केवल प्राथमिक 64-बिट आर्किटेक्चर के लिए ODEX जेनरेट करते हैं। यदि कोई ऐप 32-बिट और 64-बिट दोनों प्रक्रियाओं में लॉन्च किया जाएगा, तो यह सुनिश्चित करने के लिए LOCAL_MULTILIB := both का उपयोग करें कि 32-बिट और 64-बिट दोनों ODEX फ़ाइलें जेनरेट की गई हैं। यदि ऐप में 32-बिट या 64-बिट जेएनआई लाइब्रेरी हैं, तो वह ध्वज बिल्ड सिस्टम को उन्हें शामिल करने के लिए भी कहता है।