32-बिट और 64-बिट आर्किटेक्चर के लिए निर्माण करें

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

अंतर्निहित स्थिर पुस्तकालयों और साझा पुस्तकालयों के लिए, बिल्ड सिस्टम दोनों आर्किटेक्चर के लिए बायनेरिज़ बनाने के लिए नियम सेट करता है। उत्पाद कॉन्फ़िगरेशन ( 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/make/target/board/generic_arm64/BoardConfig.mk देखें।

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

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

Android.mk में मॉड्यूल आर्किटेक्चर को परिभाषित करें

आप अपने बिल्ड को 32 बिट और 64 बिट के लिए कॉन्फ़िगर करने और वैश्विक TARGET_PREFER_32_BIT वेरिएबल को ओवरराइड करने के लिए LOCAL_MULTILIB वेरिएबल का उपयोग कर सकते हैं।

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-बिट के लिए बनाई जा रही है या नहीं। उदाहरण के लिए, _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_ARCH TARGET_2ND_ARCH के साथ मिलाकर उपयोग नहीं कर सकते। इसके बजाय, LOCAL_ * वेरिएबल LOCAL_MODULE_TARGET_ARCH या LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH का उपयोग करें।

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

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

32-बिट और 64-बिट ODEX फ़ाइल निर्माण सुनिश्चित करें

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