जैक के साथ संकलन (एओएसपी 6.0 - 8.1)

एंड्रॉइड 6.0 - 8.1 के लिए जैक डिफ़ॉल्ट एंड्रॉइड बिल्ड टूलचेन है

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

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

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

जैक सिंहावलोकन.

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

जैक लाइब्रेरी प्रारूप

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

जैक लाइब्रेरी फ़ाइल सामग्री।

चित्र 2. जैक लाइब्रेरी फ़ाइल सामग्री।

जील

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

मौजूदा `जार.` लाइब्रेरी को आयात करने के लिए वर्कफ़्लो।

चित्र 3. मौजूदा .jar लाइब्रेरी को आयात करने के लिए वर्कफ़्लो।

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

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

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

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

$HOME/.जैक फ़ाइल

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

  • SERVER=true जैक की सर्वर सुविधा को सक्षम बनाता है।
  • SERVER_PORT_SERVICE=8072 संकलन उद्देश्यों के लिए सर्वर का टीसीपी पोर्ट नंबर सेट करता है।
  • SERVER_PORT_ADMIN=8073 व्यवस्थापक उद्देश्यों के लिए सर्वर का टीसीपी पोर्ट नंबर सेट करता है।
  • 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 कम मान में बदलकर एक साथ जैक संकलनों की संख्या कम करें।
बैकग्राउंड सर्वर लॉन्च नहीं हो पाने पर संकलन विफल हो रहे हैं सबसे संभावित कारण यह है कि आपके कंप्यूटर पर टीसीपी पोर्ट पहले से ही उपयोग किए जा रहे हैं। $HOME/.jack ( SERVER_PORT_SERVICE और SERVER_PORT_ADMIN वेरिएबल) को संपादित करके पोर्ट बदलें। स्थिति को अनब्लॉक करने के लिए, $HOME/.jack को संपादित करके और SERVER को false में बदलकर जैक संकलन सर्वर को अक्षम करें। दुर्भाग्य से यह आपके संकलन को काफी धीमा कर देता है और आपको लोड नियंत्रण ( make का विकल्प -l ) के साथ make -j लॉन्च करने के लिए मजबूर कर सकता है।
संकलन बिना किसी प्रगति के अटक जाता है स्थिति को अनब्लॉक करने के लिए, jack-admin kill-server सर्वर का उपयोग करके जैक बैकग्राउंड सर्वर को मारें) फिर अपनी अस्थायी निर्देशिका ( /tmp या $TMPDIR ) के 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 एकीकरण के कारण सीटीएस संकलन धीमा है। बाइटकोड हेरफेर उपकरण (जैसे JaCoCo) समर्थित नहीं हैं।

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

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

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

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

प्री-डेक्स के साथ जैक लाइब्रेरी।

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

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

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

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

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

LOCAL_JACK_ENABLED := incremental

सिकुड़न और अस्पष्टता

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

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

  • @
  • -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 से अधिक विधियों वाले ऐप्स को एकाधिक डेक्स फ़ाइलों में विभाजित किया जाना चाहिए। अधिक विवरण के लिए, 64K से अधिक विधियों वाले ऐप्स के लिए मल्टीडेक्स सक्षम करें देखें