जैक के साथ कंपाइल करें (AOSP 6.0 - 8.1)

Android 6.0 से 8.1 के लिए, Jack, Android बिल्ड टूलचेन का डिफ़ॉल्ट टूल है

Jack, Android टूलचेन है. यह Java सोर्स को Android dex bytecode में कंपाइल करता है. Jack का इस्तेमाल करने के लिए, आपको कुछ अलग करने की ज़रूरत नहीं है. ट्री या अपने प्रोजेक्ट को कंपाइल करने के लिए, सिर्फ़ अपने स्टैंडर्ड मेकफ़ाइल निर्देशों का इस्तेमाल करें. Android 8.1, Jack का इस्तेमाल करने वाली आखिरी रिलीज़ है.

Jack के बारे में जानकारी

जैक, पहली इमेज में दिखाए गए तरीके से काम करता है.

जैक की खास जानकारी.

पहली इमेज. जैक की खास जानकारी.

Jack लाइब्रेरी फ़ॉर्मैट

Jack का अपना .jack फ़ाइल फ़ॉर्मैट होता है. इसमें लाइब्रेरी के लिए पहले से कंपाइल किया गया dex कोड होता है. इससे, तेज़ी से कंपाइल करने (pre-dex) की सुविधा मिलती है.

जैक की लाइब्रेरी फ़ाइल का कॉन्टेंट.

दूसरी इमेज. जैक की लाइब्रेरी फ़ाइल का कॉन्टेंट.

जिल

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

किसी मौजूदा `jar.` लाइब्रेरी को इंपोर्ट करने का वर्कफ़्लो.

तीसरी इमेज. किसी मौजूदा .jar लाइब्रेरी को इंपोर्ट करने का वर्कफ़्लो.

Jack कंपाइलेशन सर्वर

देखें

Jack का इस्तेमाल पहली बार करने पर, यह आपके कंप्यूटर पर एक स्थानीय Jack कंपाइलेशन सर्वर लॉन्च करता है. यह सर्वर:

  • इससे प्रोसेस तेज़ी से होती है, क्योंकि इसमें हर बार कंपाइल करने पर, नया होस्ट JRE JVM लॉन्च करने, Jack कोड लोड करने, Jack को शुरू करने, और JIT को वॉर्म अप करने की ज़रूरत नहीं होती. यह छोटे कॉम्पाइलेशन (उदाहरण के लिए, इंक्रीमेंटल मोड में) के दौरान भी बहुत कम समय में कॉम्पाइल करता है.
  • यह एक ऐसा तरीका है जिससे कुछ समय के लिए, पैरलल जैक कंपाइलेशन की संख्या को कंट्रोल किया जा सकता है. सर्वर आपके कंप्यूटर पर लोड (मेमोरी या डिस्क से जुड़ी समस्या) डालने से बचता है, क्योंकि यह एक साथ कई प्रोग्राम को कंपाइल करने की संख्या को सीमित करता है.

Jack सर्वर, कोई कंपाइलेशन किए बिना, कुछ समय के लिए कोई गतिविधि न होने पर अपने-आप बंद हो जाता है. यह localhost इंटरफ़ेस पर दो टीसीपी पोर्ट का इस्तेमाल करता है और बाहरी तौर पर उपलब्ध नहीं है. $HOME/.jack फ़ाइल में बदलाव करके, सभी पैरामीटर (एक साथ कई प्रोग्राम कंपाइल करने की संख्या, टाइम आउट, पोर्ट की संख्या वगैरह) में बदलाव किया जा सकता है.

$HOME/.jack फ़ाइल

$HOME/.jack फ़ाइल में, Jack server वैरिएबल के लिए पूरी bash सिंटैक्स में ये सेटिंग शामिल हैं:

  • SERVER=true, Jack के सर्वर की सुविधा चालू करता है.
  • 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 लॉन्च करने के लिए इस्तेमाल किया जाने वाला डिफ़ॉल्ट कमांड सेट करता है. डिफ़ॉल्ट रूप से, इस वैरिएबल को एनवायरमेंट वैरिएबल से ओवरलोड किया जा सकता है.

Jack compilations से जुड़ी समस्या हल करना

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

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

अगर आपने dist टारगेट के साथ make कमांड चलाया है, तो Jack लॉग $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log पर मौजूद होता है. इसके अलावा, jack-admin server-log को चलाकर भी लॉग देखा जा सकता है. अगर Jack में बार-बार गड़बड़ी आ रही है, तो इस वैरिएबल को सेट करके ज़्यादा जानकारी वाला लॉग पाया जा सकता है:

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

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

unset ANDROID_JACK_EXTRA_ARGS

जैक से जुड़ी सीमाएं

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

जैक का इस्तेमाल करना

Jack, Java प्रोग्रामिंग लैंग्वेज 1.7 के साथ काम करता है. साथ ही, इसमें नीचे बताई गई अतिरिक्त सुविधाएं भी शामिल हैं.

प्री-डेक्स

Jack लाइब्रेरी फ़ाइल जनरेट करते समय, लाइब्रेरी का .dex जनरेट किया जाता है और उसे .jack लाइब्रेरी फ़ाइल में प्री-डेक्स के तौर पर सेव किया जाता है. कंपाइल करते समय, जैक हर लाइब्रेरी के प्री-डेक्स का फिर से इस्तेमाल करता है. सभी लाइब्रेरी पहले से डिक्स की गई होती हैं.

पहले से डेक्स की गई जैक लाइब्रेरी.

चौथी इमेज. पहले से डेक्स की गई जैक लाइब्रेरी.

अगर कंपाइलेशन में छोटा करने, छिपाने या फिर से पैकेज करने का इस्तेमाल किया जाता है, तो जैक लाइब्रेरी के पहले डीईएक्स का फिर से इस्तेमाल नहीं करता.

इंक्रीमेंटल कंपाइलेशन

इंक्रीमेंटल कंपाइलेशन का मतलब है कि पिछले कंपाइलेशन के बाद बदले गए कॉम्पोनेंट (और उनकी डिपेंडेंसी) को ही फिर से कंपाइल किया जाता है. जब बदलाव सिर्फ़ कॉम्पोनेंट के सेट तक सीमित होते हैं, तो इंक्रीमेंटल कंपाइलेशन, पूरे कंपाइलेशन की तुलना में काफ़ी तेज़ हो सकता है.

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

LOCAL_JACK_ENABLED := incremental

कोड का साइज़ कम करना और उसे अस्पष्ट बनाना

जैक, प्रोग्राम को छोटा करने और उसे गुप्त करने के लिए, ProGuard कॉन्फ़िगरेशन फ़ाइलों का इस्तेमाल करता है.

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

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (सिर्फ़ एक आउटपुट jar काम करता है)
  • -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

रीपैकेजिंग

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

मल्टीडेक्स की सुविधा

Jack में, बिल्ट-इन और लेगसी मल्टीडेक्स की सुविधा मिलती है. डेक्स फ़ाइलों में 65 हज़ार तरीकों तक का डेटा सेव किया जा सकता है. इसलिए, जिन ऐप्लिकेशन में 65 हज़ार से ज़्यादा तरीके हैं उन्हें कई डेक्स फ़ाइलों में बांटना होगा. ज़्यादा जानकारी के लिए, 64 हज़ार से ज़्यादा तरीकों वाले ऐप्लिकेशन के लिए मल्टीडेक्स की सुविधा चालू करना लेख पढ़ें