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

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

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

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

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

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

पहला डायग्राम. जैक की खास जानकारी.

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

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

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

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

जिल

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

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

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

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

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

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

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

$HOME/.jack फ़ाइल

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

  • 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 का इस्तेमाल करके 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

जैक की सीमाएं

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

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

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

प्री-डेक्स

जैक लाइब्रेरी की फ़ाइल जनरेट करते समय, लाइब्रेरी के .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 कॉन्फ़िगरेशन फ़ाइलों का इस्तेमाल करता है. जैक "नियम" नियम टाइप के साथ काम करता है, लेकिन यह "zap" या "keep" नियम के टाइप के साथ काम नहीं करता.

मल्टीडेक्स सहायता

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