मैक ओएस एक्स के लिए एंड्रॉइड का निर्माण करें

छवि

पृष्ठभूमि

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

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

मेरे मामले में, काम का माहौल इस तरह दिखता है:

आधिकारिक दस्तावेज में एओएसपी को इकट्ठा करने के सभी मुख्य बिंदुओं और कठिनाइयों को अच्छी तरह से वर्णित किया गया है। यह भी बताता है कि MacOS 10.5 या 10.6 को 4.0.x शाखा बनाने की आवश्यकता है और Xcode 3.14 की सिफारिश की गई है, और ज्ञात समस्या अनुभाग इंगित करता है कि 4.0.x शाखा MacOS 10.7 के साथ संगत नहीं है।

मैं विकास के लिए MacOS और Xcode का उपयोग करता हूं और वास्तव में पिछले संस्करणों में वापस नहीं आना चाहता। इसके अलावा, पर्यावरण में किसी भी मौलिक परिवर्तन के बिना विधानसभा से निपटने के लिए यह विशुद्ध रूप से खेल का हित था।

निर्णय

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

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

नीचे कमांड द्वारा कंपाइलर के साथ समस्याओं को हल करने के लिए असेंबली लॉन्च की गई है। यहाँ महत्वपूर्ण भाग CC = "gcc" CXX = "g ++" है , बाकी किसी भी क्रम और संयोजन में मानक पैरामीटर हो सकते हैं।
make CC="gcc" CXX="g++" -j4 

असेंबली के दौरान, वर्णित दस्तावेज के अलावा, निम्नलिखित समस्याएं उत्पन्न हुईं:

त्रुटि १

 external/webkit/Source/WebCore/xml/XPathParser.cpp: In member function 'WebCore::XPath::Expression* WebCore::XPath::Parser::parseStatement(const WTF::String&, WTF::PassRefPtr<WebCore::XPathNSResolver>, WebCore::ExceptionCode&)': external/webkit/Source/WebCore/xml/XPathParser.cpp:480:39: error: too many arguments to function 'int WebCore::XPath::xpathyyparse()' out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/XPathGrammar.hpp:106:5: note: declared here make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/xml/XPathParser.o] Error 1 

सुधार
पैच https://bugs.webkit.org/show_bug.cgi?id=92264 लागू करें । पैच एक छोटी सी त्रुटि के साथ जाता है, संदर्भ के विचलन के कारण, आपको रीज को देखने और पुरानी लाइनों के एक जोड़े को हटाने की जरूरत है जो पैच को हटा नहीं सकता है। पैच को बाहरी / वेबकिट / निर्देशिका में लागू करें।

महत्वपूर्ण है
लिंकिंग के दौरान, विधानसभा के अंतिम चरण में, त्रुटियाँ:
 prebuilt/darwin-x86/toolchain/arm-linux-androideabi-4.4.x/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a(CSSParser.o): in function WebCore::CSSParser::parseMediaQuery(WebCore::MediaList*, WTF::String const&):external/webkit/Source/WebCore/css/CSSParser.cpp:621: error: undefined reference to 'cssyyparse(WebCore::CSSParser*)' 

इस पर निर्भर करता है कि आपने CSSParser में परिवर्तन जोड़े हैं या नहीं। लिंकर का एक निश्चित रहस्यवाद यहां दिखाई देता है (4.1.1 संस्करण के लिए विधानसभा के साथ इन सुधारों के साथ ऐसी समस्याएं नहीं हैं)। समस्या को ठीक करने के लिए, आपको CSSParser में कुछ परिवर्तन करने की आवश्यकता है (संकलक द्वारा पढ़ें, यानी टिप्पणी नहीं)। मैंने cssyyparse (void *) से cssyyparse (WebCore :: CSSParser *) या इसके विपरीत इस फ़ंक्शन की परिभाषा को बदल दिया है। अगला, पुनर्निर्माण शुरू करें - इस जगह से सब कुछ आसानी से हो जाएगा।

त्रुटि २

 host SharedLib: libSR_Recognizer (out/host/darwin-x86/obj/lib/libSR_Recognizer.dylib) Undefined symbols for architecture i386: "_canPushAudioIntoRecognizer", referenced from: _SR_RecognizerAdvanceImpl in RecognizerImpl.o _detectBeginningOfSpeech in RecognizerImpl.o ... ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status make: *** [out/host/darwin-x86/obj/lib/libSR_Recognizer.dylib] Error 1 

सुधार
परिभाषा को बाहरी / srec / पोर्टेबल / में शामिल करें / portExport.h को मास्टर शाखा से हमारी में स्थानांतरित करें।
 #if defined(__APPLE_CC__) #if __APPLE_CC__ >= 5621 #undef PINLINE #define PINLINE #endif #endif 


त्रुटि ३

 host Executable: triangleCM (out/host/darwin-x86/obj/EXECUTABLES/ triangleCM_intermediates/triangleCM) Undefined symbols: "__dyld_func_lookup", referenced from: _promoteLocalToGlobal in libSDL.a(SDL_dlcompat.o) _dlcompat_init_func in libSDL.a(SDL_dlcompat.o) ... ld: symbol(s) not found collect2: ld returned 1 exit status make: *** [out/host/darwin-x86/obj/EXECUTABLES/ triangleCM_intermediates/triangleCM] Error 1 

सुधार
LESAL_SDL_LDLIBS + = /usr/lib/dylib1.o लाइब्रेरी को / GLES_V2 / Android.mk और GLES_CM / Android.mk के लिए / विकास / उपकरण / एमुलेटर / opengl / परीक्षण / अनुवादक_tests / लाइब्रेरी में जोड़ें।

त्रुटि ४
सिस्टम और स्थानीय फ़ाइलों में स्ट्रेंलेन फ़ंक्शन की अलग-अलग परिभाषा। दुर्भाग्य से, मैंने इस त्रुटि के लिए एक लॉग नहीं लिखा था, लेकिन स्ट्रेंलेन फ़ंक्शन का उल्लेख करते समय सार स्पष्ट होगा।

सुधार
बाहरी / elfutils / config-compat-darwin.h के लिए strnlen फ़ंक्शन के लिए एक शर्त जोड़ें:
 #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 static inline size_t strnlen (const char *__string, size_t __maxlen) #endif 


त्रुटि ५
एमुलेटर के निर्माण के लिए मैक ओएस एसडीके संस्करण चुनना। लॉग के बिना पिछली त्रुटि के समान, लेकिन लॉग में क्यूमू एमुलेटर का उल्लेख यहां इंगित करेगा।

सुधार
मैक ओएस संस्करण बाहरी / qemu / Makefile.android के लिए स्थिति बदलें:
 - ifeq ($(filter 10.5 10.5.%,$(DARWIN_VERSION)),) + ifneq ($(filter 10.6 10.6.%,$(DARWIN_VERSION)),) 

और MacOS के लिए लाइब्रेरी कनेक्शन जोड़ें:
  ifeq ($(HOST_OS),darwin) QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa,-framework,QTKit,-framework,CoreVideo + ifneq ($(filter 10.7 10.7.%,$(DARWIN_VERSION)),) + # Lion/XCode4 needs to be explicitly told the dynamic library + # lookup symbols in the precompiled libSDL are resolved at + # runtime + QEMU_SYSTEM_LDLIBS += -undefined dynamic_lookup + endif endif 


त्रुटि ६
यदि आपका ऑपरेटिंग सिस्टम केस-संवेदी फ़ाइल सिस्टम के साथ डिस्क पर है, तो यह त्रुटि हो सकती है:
 external/qemu/android/camera/camera-capture-mac.m:24:24: error: QTKit/QTkit.h: No such file or directory 

सुधार
समस्या का सार सरल है - बड़ी फ़ाइल के बजाय .h फ़ाइल के नाम पर एक टाइपो, एक छोटी सी k मुद्रित होती है। आमतौर पर प्रकट नहीं होता है, क्योंकि MacOS केस-असंवेदनशील फ़ाइल सिस्टम डिस्क पर स्थापित है। यह कोड में सही फ़ाइल नाम "QTKit.h" को बदलकर बस ठीक करता है।

निष्कर्ष

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

Source: https://habr.com/ru/post/In207706/


All Articles