Android 6.0–8.1 . के लिए जैक के साथ संकलन

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

जैक एक एंड्रॉइड टूलचेन है जो जावा स्रोत को एंड्रॉइड डेक्स बाइटकोड में संकलित करता है। जैक का उपयोग करने के लिए आपको कुछ अलग करने की आवश्यकता नहीं है - पेड़ या अपने प्रोजेक्ट को संकलित करने के लिए बस अपने मानक मेकफ़ाइल कमांड का उपयोग करें। Android 8.1 जैक का उपयोग करने वाली अंतिम रिलीज़ है।

जैक के बारे में

जैक चित्र 1 में दिखाए अनुसार काम करता है।

जैक सिंहावलोकन
चित्र 1. जैक सिंहावलोकन

जैक पुस्तकालय प्रारूप

जैक का अपना .jack फ़ाइल स्वरूप है जिसमें पुस्तकालय के लिए पूर्व-संकलित डेक्स कोड होता है, जो तेजी से संकलन (प्री-डेक्स) की अनुमति देता है।

जैक पुस्तकालय फ़ाइल सामग्री
चित्रा 2. जैक पुस्तकालय फ़ाइल सामग्री

जील

जिल टूल मौजूदा .jar लाइब्रेरी को नए लाइब्रेरी फॉर्मेट में ट्रांसलेट करता है, जैसा कि नीचे दिखाया गया है।

जिल के साथ .jar पुस्तकालयों का आयात करना
चित्र 3. मौजूदा .jar पुस्तकालय को आयात करने के लिए कार्यप्रवाह

जैक संकलन सर्वर

पहली बार जैक का उपयोग किया जाता है, यह आपके कंप्यूटर पर एक स्थानीय जैक संकलन सर्वर लॉन्च करता है। यह सर्वर:

  • एक आंतरिक गति लाता है क्योंकि यह एक नया होस्ट जेआरई जेवीएम लॉन्च करने, जैक कोड लोड करने, जैक को प्रारंभ करने और प्रत्येक संकलन पर जेआईटी को गर्म करने से बचाता है। यह छोटे संकलनों के दौरान बहुत अच्छा संकलन समय भी प्रदान करता है (उदाहरण के लिए, वृद्धिशील मोड में)।
  • समानांतर जैक संकलनों की संख्या को नियंत्रित करने के लिए एक अल्पकालिक समाधान है। सर्वर आपके कंप्यूटर (स्मृति या डिस्क समस्या) को ओवरलोड करने से बचाता है क्योंकि यह समानांतर संकलन की संख्या को सीमित करता है।

जैक सर्वर बिना किसी संकलन के निष्क्रिय समय के बाद स्वयं को बंद कर देता है। यह लोकलहोस्ट इंटरफ़ेस पर दो टीसीपी पोर्ट का उपयोग करता है और बाहरी रूप से उपलब्ध नहीं है। $HOME/.jack फ़ाइल को संपादित करके सभी पैरामीटर (समानांतर संकलनों की संख्या, टाइमआउट, पोर्ट नंबर, आदि) को संशोधित किया जा सकता है।

$HOME/.jack फ़ाइल

$HOME/.jack फ़ाइल में जैक सर्वर चर के लिए पूर्ण बैश सिंटैक्स में निम्नलिखित सेटिंग्स शामिल हैं:

  • SERVER=true जैक की सर्वर सुविधा को सक्षम बनाता है।
  • SERVER_PORT_SERVICE=8072 संकलन उद्देश्यों के लिए सर्वर का TCP पोर्ट नंबर सेट करता है।
  • SERVER_PORT_ADMIN=8073 व्यवस्थापक उद्देश्यों के लिए सर्वर का TCP पोर्ट नंबर सेट करता है।
  • SERVER_COUNT=1 अप्रयुक्त है।
  • SERVER_NB_COMPILE=4 अनुमत समानांतर संकलनों की अधिकतम संख्या निर्धारित करता है।
  • SERVER_TIMEOUT=60 निष्क्रिय सेकंड की संख्या सेट करता है जिसे सर्वर को स्वयं को बंद करने से पहले बिना किसी संकलन के प्रतीक्षा करनी चाहिए।
  • SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} वह फ़ाइल सेट करता है जहां सर्वर लॉग लिखे जाते हैं। डिफ़ॉल्ट रूप से, इस चर को एक पर्यावरण चर द्वारा अधिभारित किया जा सकता है।
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} होस्ट पर JVM लॉन्च करने के लिए प्रयुक्त डिफ़ॉल्ट कमांड सेट करता है। डिफ़ॉल्ट रूप से, इस चर को पर्यावरण चर द्वारा अधिभारित किया जा सकता है।

समस्या निवारण जैक संकलन

संकट गतिविधि
आपका कंप्यूटर संकलन के दौरान अनुत्तरदायी हो जाता है या आप स्मृति से बाहर त्रुटि पर जैक संकलन विफल होने का अनुभव करते हैं $HOME/.jack संपादित करके और SERVER_NB_COMPILE को कम मान में बदलकर एक साथ जैक संकलन की संख्या कम करें।
पृष्ठभूमि सर्वर लॉन्च नहीं कर सकता पर संकलन विफल हो रहे हैं सबसे संभावित कारण यह है कि आपके कंप्यूटर पर पहले से ही TCP पोर्ट का उपयोग किया जाता है। $HOME/.jack ( SERVER_PORT_SERVICE और SERVER_PORT_ADMIN चर) संपादित करके पोर्ट बदलें। स्थिति को अनब्लॉक करने के लिए, $HOME/.jack संपादित करके और SERVER को false में बदलकर जैक संकलन सर्वर को अक्षम करें। दुर्भाग्य से यह आपके संकलन को महत्वपूर्ण रूप से धीमा कर देता है और आपको make -j को लोड नियंत्रण (विकल्प -l का make ) के साथ लॉन्च करने के लिए मजबूर कर सकता है।
बिना किसी प्रगति के संकलन अटक जाता है स्थिति को अनब्लॉक करने के लिए, jack-admin kill-server सर्वर का उपयोग करके जैक बैकग्राउंड सर्वर को मारें) फिर अपनी अस्थायी निर्देशिका ( /tmp या $TMPDIR ) के jack- jack-$USER में निहित अस्थायी निर्देशिकाओं को हटा दें।

जैक लॉग ढूँढना

यदि आप एक दूरस्थ लक्ष्य के साथ एक make कमांड चलाते हैं, तो जैक लॉग $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log पर स्थित होता है। अन्यथा, आप jack-admin server-log चलाकर लॉग ढूंढ सकते हैं। प्रतिलिपि प्रस्तुत करने योग्य जैक विफलताओं के मामले में, आप निम्न चर सेट करके अधिक विस्तृत लॉग प्राप्त कर सकते हैं:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

पेड़ (या आपकी परियोजना) को संकलित करने के लिए मानक मेकफ़ाइल कमांड का उपयोग करें और मानक आउटपुट और त्रुटि संलग्न करें। विस्तृत बिल्ड लॉग निकालने के लिए, चलाएँ:

unset ANDROID_JACK_EXTRA_ARGS

जैक सीमाएं

  • डिफ़ॉल्ट रूप से, जैक सर्वर का उपयोग कंप्यूटर पर केवल एक उपयोगकर्ता द्वारा किया जा सकता है। अतिरिक्त उपयोगकर्ताओं का समर्थन करने के लिए, प्रत्येक उपयोगकर्ता के लिए अलग-अलग पोर्ट नंबर चुनें और तदनुसार SERVER_NB_COMPILE समायोजित करें। आप $HOME/.jack में SERVER=false सेट करके जैक सर्वर को अक्षम भी कर सकते हैं।
  • वर्तमान vm-tests-tf एकीकरण के कारण सीटीएस संकलन धीमा है।
  • बाइटकोड हेरफेर उपकरण (जैसे जाकोको) समर्थित नहीं हैं।

जैक का उपयोग करना

जैक जावा प्रोग्रामिंग भाषा 1.7 का समर्थन करता है और नीचे वर्णित अतिरिक्त सुविधाओं को एकीकृत करता है।

प्री-डेक्सिंग

जैक लाइब्रेरी फ़ाइल जनरेट करते समय, लाइब्रेरी का .dex जनरेट किया जाता है और .jack लाइब्रेरी फ़ाइल के अंदर प्री-डेक्स के रूप में संग्रहीत किया जाता है। संकलन करते समय, जैक प्रत्येक पुस्तकालय से प्री-डेक्स का पुन: उपयोग करता है। सभी पुस्तकालय पूर्व-अनुक्रमित हैं।

प्री-डेक्स के साथ जैक लाइब्रेरी
चित्रा 4. प्री-डेक्स के साथ जैक पुस्तकालय

यदि संकलन में सिकुड़न, आक्षेप, या पुन: पैकेजिंग का उपयोग किया जाता है, तो जैक लाइब्रेरी प्री-डेक्स का पुन: उपयोग नहीं करता है।

वृद्धिशील संकलन

वृद्धिशील संकलन का अर्थ है कि केवल पिछले संकलन (और उनकी निर्भरता) के बाद से स्पर्श किए गए घटकों को पुन: संकलित किया जाता है। वृद्धिशील संकलन पूर्ण संकलन की तुलना में काफी तेज हो सकता है जब परिवर्तन घटकों के एक सेट तक सीमित होते हैं।

वृद्धिशील संकलन डिफ़ॉल्ट रूप से अक्षम होता है (और सिकुड़ते, अस्पष्टता, रीपैकेजिंग या बहु-डेक्स विरासत सक्षम होने पर स्वचालित रूप से निष्क्रिय हो जाता है)। वृद्धिशील बिल्ड को सक्षम करने के लिए, उस प्रोजेक्ट की Android.mk फ़ाइल में निम्न पंक्ति जोड़ें जिसे आप वृद्धिशील रूप से बनाना चाहते हैं:

LOCAL_JACK_ENABLED := incremental

सिकुड़ना और उलझन

जैक सिकुड़न और अस्पष्टता को सक्षम करने के लिए ProGuard कॉन्फ़िगरेशन फ़ाइलों का उपयोग करता है।

सामान्य विकल्पों में निम्नलिखित शामिल हैं:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (केवल 1 आउटपुट जार समर्थित)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

सिकुड़ते विकल्पों में निम्नलिखित शामिल हैं:

  • -dontshrink

अस्पष्टता विकल्पों में निम्नलिखित शामिल हैं:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

उपेक्षित विकल्पों में निम्नलिखित शामिल हैं:

  • -dontoptimize (जैक ऑप्टिमाइज़ नहीं करता है)
  • -dontpreverify (जैक प्रेवेरिफाई नहीं करता है)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

पैकेजिंग

जैक रीपैकेजिंग करने के लिए जारजर कॉन्फ़िगरेशन फ़ाइलों का उपयोग करता है। जबकि जैक "नियम" नियम प्रकारों के साथ संगत है, यह "ज़ैप" या "रखें" नियम प्रकारों के साथ संगत नहीं है।

मल्टीडेक्स समर्थन

जैक देशी और विरासती मल्टीडेक्स समर्थन प्रदान करता है। क्योंकि डेक्स फ़ाइलें 65K विधियों तक सीमित हैं, 65K से अधिक विधियों वाले ऐप्स को एकाधिक dex फ़ाइलों में विभाजित किया जाना चाहिए। अधिक विवरण के लिए, 64K से अधिक विधियों वाले ऐप्स के लिए मल्टीडेक्स सक्षम करें देखें।