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

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

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

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

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

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

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

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

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

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

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

जिल

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

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

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

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

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

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

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

$HOME/.jack फ़ाइल

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

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

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

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

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

प्री-डेक्स

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

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

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

अगर कंपाइलेशन में कोड छोटा करने, कोड को उलझाने या फिर से पैकेज करने की सुविधा का इस्तेमाल किया जाता है, तो Jack, लाइब्रेरी के प्री-डेक्स का फिर से इस्तेमाल नहीं करता.

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

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

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

LOCAL_JACK_ENABLED := incremental

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

जैक, 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 (जैक ऑप्टिमाइज़ नहीं करता)
  • -dontpreverify (जैक पहले से पुष्टि नहीं करता)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

रीपैकेजिंग

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

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

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