जैक के साथ कंपाइल करें

Jack, Android 6.0 से 8.1 के लिए डिफ़ॉल्ट Android बिल्ड टूलचेन था. इसका इस्तेमाल, Java सोर्स को Android dex बाइटकोड में कंपाइल करने के लिए किया जाता था. इसके बारे में पहली इमेज में दिखाया गया है:

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

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

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

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

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

Jill टूल

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

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

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

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

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

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

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

$HOME/.jack फ़ाइल

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

  • 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 के कंपाइलेशन से जुड़ी समस्याएं हल करना

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

Jack का लॉग ढूंढना

अगर आपने 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 की सीमाएं

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

Jack का इस्तेमाल करना

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

प्री-डेक्स

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

प्री-डेक्स वाली जैक लाइब्रेरी.

चौथी इमेज. प्री-डेक्स वाली Jack लाइब्रेरी.

अगर कंपाइलेशन में श्रिंकिंग, ऑब्सफ़केशन या रीपैकेजिंग का इस्तेमाल किया जाता है, तो Jack, लाइब्रेरी प्री-डेक्स का फिर से इस्तेमाल नहीं करता.

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

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

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

LOCAL_JACK_ENABLED := incremental

श्रिंकिंग और ऑब्सफ़केशन

Jack, श्रिंकिंग और ऑब्सफ़केशन की सुविधा चालू करने के लिए, ProGuard कॉन्फ़िगरेशन फ़ाइलों का इस्तेमाल करता है. आम विकल्पों में ये शामिल हैं:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (सिर्फ़ एक आउटपुट जार काम करता है)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

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

  • -dontshrink

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

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

इन विकल्पों को अनदेखा किया जाता है:

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

रीपैकेजिंग

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

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

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