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

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

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

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

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

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

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

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

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

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

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

जिल

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

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

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

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

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

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

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

$HOME/.जैक फ़ाइल

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

  • 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 में बदलाव करके और उसे बदलकर जैक कंपाइलेशन सर्वर false के लिए SERVER. माफ़ करें, इसकी वजह से ट्रैफ़िक काफ़ी कम हो गया है आपकी कंपाइलेशन का इस्तेमाल किया गया है. इससे आपको लोड के साथ make -j को लॉन्च करने के लिए मजबूर किया जा सकता है कंट्रोल (make में से -l विकल्प).
बिना प्रोसेस के कंपाइलेशन रुक जाता है स्थिति को अनब्लॉक करने के लिए, jack-admin kill-server) इसके बाद, अस्थायी डायरेक्ट्री हटाएं आपकी अस्थायी डायरेक्ट्री के jack-$USER में शामिल है (/tmp या $TMPDIR).

जैक लॉग ढूंढें

अगर आपने डिस्ट टारगेट के साथ 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 के मौजूदा इंटिग्रेशन की वजह से, सीटीएस को कंपाइल करने में समय लग रहा है. बाइटकोड में बदलाव करने वाले टूल (जैसे कि JaCoCo) इस्तेमाल नहीं किए जा सकते.

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

जैक, Java प्रोग्रामिंग लैंग्वेज 1.7 के साथ काम करता है और सुविधाओं के बारे में ज़्यादा जानें.

प्री-डेक्स

जैक लाइब्रेरी फ़ाइल जनरेट करते समय, लाइब्रेरी का .dex .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

रीपैकेजिंग

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

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

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