Android 6.0 - 8.1 के लिए जैक, Android बिल्ड टूलचेन का डिफ़ॉल्ट टूल है
जैक एक Android टूलचेन है, जो Java सोर्स को Android dex बाइटकोड में कंपाइल करता है. जैक का इस्तेमाल करने के लिए आपको कुछ अलग करने की ज़रूरत नहीं है - ट्री या अपने प्रोजेक्ट को कंपाइल करने के लिए बस अपने स्टैंडर्ड मेकफ़ाइल निर्देशों का इस्तेमाल करें. Android 8.1, Jack का इस्तेमाल करने वाली आखिरी रिलीज़ है.
Jack के बारे में जानकारी
जैक पहले डायग्राम में दिखाए गए तरीके से काम कर रहा है.
पहला डायग्राम. जैक की खास जानकारी.
Jack लाइब्रेरी फ़ॉर्मैट
जैक का खुद का .jack
फ़ाइल फ़ॉर्मैट है. इसमें लाइब्रेरी के लिए, पहले से कंपाइल किया गया डेक्स कोड होता है. इससे वीडियो को तेज़ी से कंपाइल किया जा सकता है (प्री-डेक्स).
दूसरी इमेज. जैक लाइब्रेरी की फ़ाइल का कॉन्टेंट.
जिल
जैसा कि यहां दिए गए डायग्राम में दिखाया गया है, जिल टूल मौजूदा .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 हज़ार से ज़्यादा तरीकों वाले ऐप्लिकेशन के लिए मल्टीडेक्स को चालू करें