Xcode बिल्ड विकल्पों का प्रभाव "बिटकोड सक्षम करें" हां / नहीं


239

कल मैंने parse.com लाइब्रेरी के बारे में एक चेतावनी दी:

URGENT: सभी बिटकोड को हटा दिया जाएगा क्योंकि '[पथ] /Parse.framework/Parse (PFAnalytics.o)' बिटकोड के बिना बनाया गया था। आपको इसे बिटकोड सक्षम (Xcode सेटिंग ENABLE_BITCODE) के साथ फिर से बनाना होगा, विक्रेता से एक अद्यतन पुस्तकालय प्राप्त होगा, या इस लक्ष्य के लिए बिटकोड को अक्षम करना होगा। नोट: यह भविष्य में एक त्रुटि होगी।

मैं इस तथ्य से अवगत हूं कि मैं इस उत्तर के साथ उन चेतावनियों को हटा सकता हूं लेकिन अब सोच रहा हूं कि क्या यह AppStore प्रस्तुत करने और / या मेरे ऐप के वास्तविक प्रदर्शन के संबंध में कोई नकारात्मक प्रभाव पड़ेगा।

Xcode आपको बिटकोड के बारे में सूचित करता है

इस सेटिंग को सक्रिय करना इंगित करता है कि लक्ष्य या परियोजना को प्लेटफार्मों और आर्किटेक्चर के लिए संकलन के दौरान बिटकोड उत्पन्न करना चाहिए जो इसका समर्थन करते हैं। आर्काइव बिल्ड के लिए, बिटकॉइन को ऐप स्टोर में जमा करने के लिए लिंक किए गए बाइनरी में उत्पन्न किया जाएगा। अन्य बिल्ड के लिए, कंपाइलर और लिंकर यह जांच करेगा कि कोड बिटकॉइन पीढ़ी के लिए आवश्यकताओं का अनुपालन करता है, लेकिन वास्तविक कोडकोड उत्पन्न नहीं करेगा। [ENABLE_BITCODE]

लेकिन मुझे इस पाठ से कोई उपयोगी जानकारी नहीं मिल रही है।

  • क्या मैं किसी नकारात्मक प्रभाव के बिना और भविष्य के AppStore सबमिशन से समझौता किए बिना इस मुद्दे को दरकिनार करने के लिए लिंक किए गए उत्तर का उपयोग कर सकता हूं?
  • ENABLE_BITCODEवास्तव में क्या करता है, क्या यह भविष्य में गैर-वैकल्पिक आवश्यकता होगी?
  • यदि मैं इसे सक्षम / अक्षम करता हूं तो क्या कोई प्रदर्शन प्रभाव पड़ता है?

जवाबों:


399
  • ENABLE_BITCODE वास्तव में क्या करता है, क्या यह भविष्य में गैर-वैकल्पिक आवश्यकता होगी?

मुझे यकीन नहीं है कि आप किस स्तर पर उत्तर की तलाश कर रहे हैं, तो चलो थोड़ी यात्रा करें। इसमें से कुछ आप पहले से ही जानते होंगे।

जब आप अपना प्रोजेक्ट बनाते हैं, तो Xcode clangऑब्जेक्टिव-सी टारगेट और swift/ swiftcस्विफ्ट टारगेट के लिए इनवाइट करता है। ये दोनों कंपाइलर ऐप को इंटरमीडिएट प्रतिनिधित्व (IR) में संकलित करते हैं , इनमें से एक IR बिटकोड है। इस आईआर से, एलएलवीएम नामक एक कार्यक्रम लेता है और x86 32 और 64 बिट मोड (सिम्युलेटर के लिए) और arm6 / arm7 / arm7s / arm64 (डिवाइस के लिए) के लिए आवश्यक बायनेरी बनाता है। आम तौर पर, इन सभी अलग-अलग बायनेरिज़ को एक एकल फ़ाइल में एक साथ एक मोटी द्विआधारी कहा जाता है ।

ENABLE_BITCODE विकल्प इस अंतिम चरण को काट देता है। यह आईआर बिटकोड बाइनरी के साथ ऐप का एक संस्करण बनाता है। इसमें कई अच्छी विशेषताएं हैं, लेकिन एक बड़ी खामी: यह कहीं भी नहीं चल सकती है। एक बिटकोड बाइनरी के साथ एक ऐप प्राप्त करने के लिए, बिटकोड को फिर से संकलित करने की आवश्यकता है ( शायद इकट्ठे या ट्रांसकोड किए गए ... मुझे सही क्रिया का यकीन नहीं है ) एक x86 या एआरएम बाइनरी में।

जब एक बिटकोड ऐप ऐप स्टोर में सबमिट किया जाता है, तो ऐप्पल यह अंतिम चरण करेगा और समाप्त बायनेरिज़ का निर्माण करेगा।

अभी, बिटकॉइन ऐप वैकल्पिक हैं, लेकिन इतिहास ने दिखाया है कि ऐप्पल वैकल्पिक चीजों को आवश्यकताओं में बदल देता है (जैसे 64 बिट समर्थन)। इसमें आमतौर पर कुछ साल लगते हैं, इसलिए तीसरे पक्ष के डेवलपर्स (जैसे पार्से) को अपडेट करने का समय है।

  • क्या मैं बिना किसी नकारात्मक प्रभाव के और बिना किसी भविष्य के एपस्टोर को प्रस्तुत किए बिना उपरोक्त विधि का उपयोग कर सकता हूं?

हां, आप ENABLE_BITCODE को बंद कर सकते हैं और सबकुछ पहले की तरह ही काम करेगा। जब तक Apple बिटकॉइन ऐप को ऐप स्टोर के लिए आवश्यक नहीं बनाता, तब तक आप ठीक रहेंगे।

  • यदि मैं इसे सक्षम / अक्षम करता हूं तो क्या कोई प्रदर्शन प्रभाव पड़ता है?

इसे सक्षम करने के लिए कभी भी नकारात्मक प्रदर्शन प्रभाव नहीं होगा, लेकिन परीक्षण के लिए किसी एप्लिकेशन का आंतरिक वितरण अधिक जटिल हो सकता है।

सकारात्मक प्रभावों के लिए ... अच्छी तरह से यह जटिल है।

ऐप स्टोर में वितरण के लिए, ऐप एक वसा बाइनरी के साथ एक ऐप के बजाय प्रत्येक मशीन आर्किटेक्चर (arm6 / arm7 / arm7s / arm64) के लिए आपके ऐप के अलग-अलग संस्करण बनाएगा। इसका मतलब है कि iOS डिवाइस पर इंस्टॉल किया गया ऐप छोटा होगा।

इसके अलावा, जब बिटकॉइन recompiled है ( शायद इकट्ठे या ट्रांसकोड किया गया है ... फिर से, मैं सही क्रिया के बारे में निश्चित नहीं हूं ), यह अनुकूलित है। LLVM हमेशा नई बेहतर अनुकूलन बनाने पर काम कर रहा है। सिद्धांत रूप में, ऐप स्टोर एलएलवीएम की प्रत्येक नई रिलीज़ के साथ ऐप स्टोर में ऐप के अलग-अलग संस्करण को फिर से बना सकता है, इसलिए आपके ऐप को नवीनतम एलएलवीएम तकनीक के साथ फिर से अनुकूलित किया जा सकता है।


19
"ऐप्पल प्रत्येक मशीन आर्किटेक्चर (arm6 / arm7 / arm7s / arm64) के लिए आपके ऐप के अलग-अलग संस्करण एक वसा बाइनरी के साथ एक ऐप के बजाय बनाएगा। इसका मतलब है कि iOS उपकरणों पर इंस्टॉल किया गया ऐप छोटा होगा।" जो कि स्लाइसिंग करता है। यह बिटकोड के लिए असंबंधित है।
user102008

10
"ENABLE_BITCODE विकल्प इस अंतिम चरण को काट देता है।" यह कोई भी कदम नहीं काटता है। सभी वास्तुकला बायनेरिज़ अभी भी निर्मित हैं। इसके बाद EACH आर्किटेक्चर के लिए PLUS बिटकोड जानकारी जोड़ी जाती है। देखें stackoverflow.com/a/31030741/102008
user102008

6
देखें developer.apple.com/library/prerelease/watchos/documentation/... "स्लाइसिंग बनाने और विभिन्न लक्षित उपकरणों के लिए एप्लिकेशन बंडल के वेरिएंट पहुंचाने की प्रक्रिया है। एक संस्करण केवल शामिल निष्पादन वास्तुकला और संसाधनों है कि लक्ष्य के लिए आवश्यक हैं डिवाइस। "
user102008

7
यह एक सही कथन नहीं है कि Bitcode को सक्षम करने से Bitcode अक्षम होने की तुलना में डिवाइस पर ऐप इंस्टॉल हो जाएगा। कहीं यह नहीं कहता कि
user102008

7
@ onmyway133 सभी विक्रेता स्रोत प्रदान नहीं करते हैं। यदि सभी विक्रेता प्रदान करता है एक स्थिर lib और हैडर फ़ाइलें (या एक फ्रेमवर्क), तो विक्रेता को बिटकॉइन सक्षम के साथ अपने सामान को संकलित करने की आवश्यकता होती है।
जेफरी थॉमस


35

बिटकॉइन iOS 9 का एक नया फीचर है

बिटकोड एक संकलित कार्यक्रम का एक मध्यवर्ती प्रतिनिधित्व है। जिन ऐप्प को आप iTunes से अपलोड करते हैं, उनमें बिटकोड सम्‍मिलित किया जाएगा और ऐप स्‍टोर पर लिंक किया जाएगा। बिटकोड सहित ऐप्पल भविष्य में आपके ऐप के बाइनरी को स्टोर में अपने ऐप के नए संस्करण को प्रस्तुत करने की आवश्यकता के बिना भविष्य में फिर से ऑप्टिमाइज़ करने की अनुमति देगा।

नोट: iOS ऐप्स के लिए, बिटकोड डिफ़ॉल्ट है, लेकिन वैकल्पिक है। यदि आप बिटकोड प्रदान करते हैं, तो ऐप बंडल में सभी ऐप और फ़्रेमवर्क को बिटकोड शामिल करना होगा। वॉचओएस ऐप्स के लिए, बिटकोड की आवश्यकता होती है

इसलिए आपको बिटकॉइन को तब तक डिसेबल करना चाहिए जब तक आपके ऐप के सभी फ्रेमवर्क बिटकॉइन इनेबल न हो जाएं।


'भविष्य में अपने ऐप बाइनरी को फिर से ऑप्टिमाइज़ करें' - क्या आप थोड़ा और समझा सकते हैं?
जीनकज

यहाँ यह कहता है कि: "बिटकोड आईओएस 9 की एक नई विशेषता है" और यह कि "[...] वॉचओएस ऐप्स के लिए, बिटकोड की आवश्यकता है [...]"। तो, क्या होगा अगर मैं iOS 8 के तहत वॉचओएस ऐप बनाना चाहूंगा?
सुपरपुकियो

33

बिटकोड क्रैश रिपोर्टिंग को कठिन बनाता है । यहाँ हॉकी से एक उद्धरण है (जो किसी अन्य दुर्घटना रिपोर्टिंग समाधान के लिए भी सही है ):

ऐप स्टोर में एक ऐप अपलोड करते समय और "बिटकोड" चेकबॉक्स को सक्षम करने पर, ऐप्पल उस बिटकोड का उपयोग करेगा और इसे डिवाइसेस पर वितरित करने से पहले अपने अंत में पुन: संकलित करेगा। इससे बाइनरी को एक नया UUID मिलेगा और Xcode के माध्यम से संबंधित dSYM डाउनलोड करने का विकल्प है।

नोट: उत्तर 2016 को हाल के बदलावों को प्रतिबिंबित करने के लिए संपादित किया गया था


2
सिपाही और दिसंबर के बीच, यह नए Xcode ऑर्गनाइज़र एक्सपोर्ट ऑप्शन के माध्यम से तय करने में कामयाब रहा (हा हाओतो में अपडेट देखें) और फिर से टूट गया (देखें मेरा हल हा सवाल देखें )
Pavel Zdenek

13

@ vj9 thx मैं xcode 7 को अपडेट करता हूं। यह मुझे वही त्रुटि दिखाता है। "NO" सेट के बाद अच्छी तरह से बनाएँ

यहां छवि विवरण दर्ज करें

सेट "नहीं" यह अच्छी तरह से काम करता है।

यहां छवि विवरण दर्ज करें


1
@ सेप्टिक यदि आप हाँ का चयन करना चाहते हैं। आपको अपने सभी तीसरे ढांचे का समर्थन करने की आवश्यकता है।
17

आपके लक्षित न्यूनतम समर्थित iOS संस्करण को iOS 6 या उच्चतर होना चाहिए।
उथला

9

यहां आप बिटकोड के बारे में सभी समाधान पा सकते हैं

Apple Doc के अनुसार

बिटकोड एक संकलित कार्यक्रम का एक मध्यवर्ती प्रतिनिधित्व है। जिन ऐप्प को आप iTunes से अपलोड करते हैं, उनमें बिटकोड सम्‍मिलित किया जाएगा और स्टोर पर लिंक किया जाएगा। बिटकोड सहित ऐप्पल भविष्य में आपके ऐप के बाइनरी को स्टोर में अपने ऐप के नए संस्करण को प्रस्तुत करने की आवश्यकता के बिना भविष्य में फिर से ऑप्टिमाइज़ करने की अनुमति देगा।

Xcode डिफ़ॉल्ट रूप से बिल्ड समय के दौरान उत्पन्न प्रतीकों को छुपाता है, इसलिए वे Apple द्वारा पठनीय नहीं हैं। यदि आप अपने ऐप को iTunes से अपलोड करते समय प्रतीकों को शामिल करने का चयन करते हैं तो केवल प्रतीकों को ऐप्पल को भेजा जाएगा। Apple से क्रैश रिपोर्ट प्राप्त करने के लिए आपको प्रतीकों को शामिल करना चाहिए।

नोट: iOS ऐप्स के लिए, बिटकोड डिफ़ॉल्ट है, लेकिन वैकल्पिक है। वॉचओएस और टीवीओएस ऐप के लिए, बिटकोड की आवश्यकता है। यदि आप बिटकोड प्रदान करते हैं, तो ऐप बंडल में सभी ऐप और फ्रेमवर्क (प्रोजेक्ट में सभी लक्ष्य) को बिटकोड शामिल करना होगा। आइट्यून्स कनेक्ट का उपयोग करके अपने ऐप को वितरित करने के बाद, आप डिवाइस विंडो में देखने और आयात करने के तरीके में वर्णित बिल्ड के लिए dSYMs फ़ाइल डाउनलोड कर सकते हैं

बिटकॉइन और ऐप थिनिंग सेवा के ऐप्पल के शुरुआती रोल-आउट को रोक दिया गया था, क्योंकि एक प्रकार के हार्डवेयर से एक अलग प्रकार के हार्डवेयर में अपग्रेड करने में समस्याएँ बायनेरिज़ के सही संस्करणों को पुनर्स्थापित नहीं करती थीं। इस मुद्दे को बाद में iOS 9.0.2 के साथ तय किया गया था और इस सुविधा को फिर से सक्षम किया गया था।

बिटकॉइन हमेशा LLVM संकलन और अनुकूलन चरणों का एक हिस्सा रहा है, लेकिन Apple सर्वर पर बैक-एंड लॉजिक को स्थानांतरित करके, यह ऑप्टिमाइज़ को स्थानांतरित करता है और डेवलपर संकलन समय से ऐप स्टोर परिनियोजन में चरणों को इकट्ठा करता है। यह भविष्य में नए और तेज प्रोसेसर का समर्थन करने के लिए भविष्य के पुन: अनुकूलन या फिर से अनुवाद की क्षमता को अनलॉक करता है। WatchOS और tvOS deploments के लिए बिटकोड की तैनाती आवश्यक है, और परियोजना सेटिंग्स में "बिटकोड को सक्षम करें" विकल्प के साथ मौजूदा iOS तैनाती के लिए सशर्त रूप से सक्षम किया जा सकता है। यह डिबग बिल्ड के लिए एक ध्वज एम्बेड-बिटकोड-मार्कर और संग्रह / डिवाइस बिल्ड के लिए एम्बेड-बिटकोड जोड़ देगा। ये स्विफ्ट कंपाइलर को -embed-bitcode के साथ या -fembed-bitcode के साथ क्लैंग का उपयोग करके पास किया जा सकता है।

बिटकॉइन के कुछ नुकसान भी हैं।डेवलपर्स ऐप्पल को भेजे गए बाइनरी के अनुरूप डीबग प्रतीकों की प्रतियां संग्रहीत करके क्रैश रिपोर्ट को डिबग कर सकते हैं। जब क्रैश किसी दिए गए स्टैक में होता है, तो डेवलपर इन डीबग प्रतीकों का उपयोग करके क्रैश रिपोर्ट का प्रतीक करके मूल स्टैक ट्रेस को पुनर्स्थापित कर सकता है। हालांकि, प्रतीक द्विआधारी को मध्यवर्ती रूप में अनुवाद करने का एक उप-उत्पाद हैं; लेकिन अगर वह कदम सर्वर पर किया जाता है, तो यह जानकारी खो जाती है। Apple एक क्रैश रिपोर्टिंग सेवा प्रदान करता है जो डिबगर का हिस्सा निभा सकती है, बशर्ते कि डेवलपर ने डिबग प्रतीकों को एप्लिकेशन प्रकाशन के समय अपलोड किया हो। तथ्य यह है कि डेवलपर कभी भी सटीक बाइनरी नहीं देखता है, इसका मतलब है कि वे नए हार्डवेयर के रूप में विशिष्ट मुद्दों के लिए परीक्षण करने में सक्षम नहीं हो सकते हैं।

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

अधिक जानकारी के लिए कृपया यहां और यहां देखें


6

से डॉक्स

  • क्या मैं बिना किसी नकारात्मक प्रभाव के और बिना किसी भविष्य के एपस्टोर को प्रस्तुत किए बिना उपरोक्त विधि का उपयोग कर सकता हूं?

बिटकॉइन ऐप्प को आपके द्वारा किसी अन्य बिल्ड को सबमिट किए बिना ऐप को ऑप्टिमाइज़ करने की अनुमति देगा। लेकिन, आप केवल इस सुविधा को सक्षम कर सकते हैं यदि ऐप बंडल में सभी चौखटे और ऐप में यह सुविधा सक्षम है। इसके होने से मदद मिलती है, लेकिन नहीं होने से इसका कोई नकारात्मक प्रभाव नहीं होना चाहिए।

  • ENABLE_BITCODE वास्तव में क्या करता है, क्या यह भविष्य में गैर-वैकल्पिक आवश्यकता होगी?

IOS ऐप्स के लिए, बिटकोड डिफ़ॉल्ट है, लेकिन वैकल्पिक है। यदि आप बिटकोड प्रदान करते हैं, तो ऐप बंडल में सभी ऐप और फ़्रेमवर्क को बिटकोड शामिल करना होगा। वॉचओएस ऐप्स के लिए, बिटकोड की आवश्यकता होती है।

  • यदि मैं इसे सक्षम / अक्षम करता हूं तो क्या कोई प्रदर्शन प्रभाव पड़ता है?

ऐप स्टोर और ऑपरेटिंग सिस्टम कम से कम छाप के साथ उपयोगकर्ता की विशेष डिवाइस की क्षमताओं को ऐप डिलीवरी के द्वारा iOS और वॉचओएस ऐप की स्थापना का अनुकूलन करते हैं। यह अनुकूलन, जिसे ऐप थिनिंग कहा जाता है, आपको सबसे अधिक डिवाइस सुविधाओं का उपयोग करने वाले ऐप्स बनाने, न्यूनतम डिस्क स्थान पर कब्जा करने और भविष्य के अपडेट को समायोजित करने की अनुमति देता है जिसे ऐप्पल द्वारा लागू किया जा सकता है। अन्य एप्लिकेशन और सामग्री के लिए तेज़ डाउनलोड और अधिक स्थान एक बेहतर उपयोगकर्ता अनुभव प्रदान करता है।

कोई प्रदर्शन प्रभाव नहीं होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.