2017-06-01 6 views
8

मैं एंड्रॉइड स्टूडियो में एंड्रॉइड स्टूडियो के दृश्यों के पीछे क्या होता है, इसकी एक बेहतर तस्वीर प्राप्त करने की कोशिश कर रहा हूं। मैं ग्रैडल पर पढ़ रहा हूं, लेकिन एक चीज जिसे मैं समझ नहीं पा रहा हूं वह है कि संबंधित सीएलआई कमांड और तर्क जो ग्रैडल द्वारा बुलाया जा रहा है। ऐसा लगता है कि Gradle Console या Event Log पर लॉग इन नहीं किया गया है।एंड्रॉइड स्टूडियो में ग्रैडल कार्य द्वारा निष्पादित सीएलआई कमांड को मैं कैसे देख सकता हूं?

ग्रैडल के अंदर क्या हो रहा है यह देखने के लिए मुझे सबसे नज़दीकी एओएसपी कोड है।

2.2.2 स्रोत:

https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks

लक्ष्य

मैं संबंधित CLI आदेश है कि अंदर एंड्रॉयड स्टूडियो Gradle कार्यों से उत्पन्न होता है देखने के लिए सक्षम होना चाहता हूँ।

प्रयोग करें प्रकरण उदाहरण

मैं गहराई में विरासत एंड्रॉयड बिल्ड प्रक्रिया को देखना चाहते। > Javac - -> जावा बाईटकोड (.class) -> ProGuard -> कम से कम बाईटकोड (.class) -> डेक्स -> DEX बाईटकोड (.dex)

स्रोत कोड/लाइब्रेरी कोड: इस के माध्यम से निम्नलिखित जा रहा शामिल

उदाहरण के लिए मैं संबंधित javac कमांड AndroidJavaCompile द्वारा आमंत्रित कमांड देखना चाहता हूं। https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/factory/AndroidJavaCompile.java

मुझे डर है कि ऐसा करने का एकमात्र तरीका स्रोत कोड के माध्यम से सीधे देखना या स्रोत से सीधे बनाना है।

कारण परिश्रम

मैं काफी गूगल पर खोज, एंड्रॉयड ब्लॉग, गूगल आई/ओ वार्ता, एंड्रॉयड किताबें, और भी बहुत कुछ का एक सा किया है। मैं सीधे-आगे जवाब खोजने में सक्षम नहीं हूं।

उत्तर

4

यह संभव नहीं। बस, क्योंकि अधिकांश ग्रैडल कार्य सीएलआई कमांड का आह्वान नहीं करते हैं।

हर Gradle फ़ाइल का निर्माण ग्रूवी कोड का एक टुकड़ा है कि Gradle एपीआई (जावा में लिखा) के साथ एक JVM में मार डाला जाता है। वजह, आप किसी भी JVM भाषा है, जिसमें से सबसे प्लगइन्स कमांड लाइन उपकरण को क्रियान्वित करने के बजाय का उपयोग करने में सीधे किसी भी कार्य या विन्यास कार्यक्षमता लागू कर सकते हैं। फिर भी, Exec कार्य का उपयोग या विस्तार करके यह संभव है।

संकलन कदम एक AndroidJavaCompile कार्य है, जो कुछ संस्करण की जांच और Instant Run सुविधा के द्वारा आम JavaCompile Gradle कार्य फैली द्वारा नियंत्रित किया जाता। हालांकि, आप नहीं जानते कि कैसे Gradle वास्तव में .java फ़ाइलों संकलित करता है। Gradle एपीआई के JavaCompile कार्य के लिए internal source files में, कई कार्यान्वयन (DaemonJavaCompiler, JdkJavaCompiler और यहां तक ​​कि CommandLineJavaCompiler) होने लगते हैं। चूंकि आप अपने कार्य के साथ CompilerOptions निर्दिष्ट कर सकते हैं, Gradle असली इन विकल्पों के आधार पर संकलक चुनने के लिए लगता है।कृपया ध्यान दें कि भले ही एक CommandLineJavaCompiler मौजूद है, यह भी संभव है (और अत्यधिक संभावना) है, कि Gradle javax.tools पैकेज और उसके JavaCompiler कार्यान्वयन उपयोग करने के लिए एक कमांड लाइन उपकरण लागू की स्रोत फ़ाइलों को संकलित करने के बजाय पसंद करती हैं।

मैं भी अपने उदाहरण निर्माण प्रक्रिया में ProGuard कदम पर एक दृष्टि डाली: ProGuard कमांड लाइन टूल है, जहां आप यह कैसे काम करता हूँ परिभाषित करने के लिए तर्क निर्दिष्ट कर सकते हैं के रूप में इस्तेमाल किया जा सकता। लेकिन ProGuard भी एक ग्रैडल कार्य (ProGuardTask) प्रदान करता है, जो कमांड लाइन से ProGuard को आमंत्रित किए बिना निष्पादित करता है। ProGuard जावा कोड Gradle JVM में निष्पादित किया जाएगा।

आप देख सकते हैं, प्रत्येक Gradle कार्य एक (या एकाधिक) CLI कमांड (रों) द्वारा बदले जा सकते हैं, भले ही, Gradle इन आदेश पर अमल नहीं करता है। इसके बजाए, कार्यक्षमता को सीधे ग्राडल जेवीएम में बुलाया जाता है। यदि आप बेहतर अंतर्दृष्टि प्राप्त करना चाहते हैं, तो आप increase the Gradle log level कर सकते हैं। ग्रैडल कार्यों के अच्छे कार्यान्वयन को लॉग में सभी आवश्यक जानकारी प्रदान करनी चाहिए।

+0

समय देने के लिए इस का जवाब देने के लिए धन्यवाद! ग्रैडल लॉग स्तरों के अलावा, क्या यह चल रहा है कि इन आंतरिक ग्रेडल कार्यों को डीबग करने का एक आसान तरीका है? मुझे लगता है कि यह बहुत छोटा नहीं है। –

+0

ईमानदारी से कहूं तो मैं Gradle और/या उसके प्लग इन की आंतरिक कोड डिबग करने की कोशिश कभी नहीं, क्योंकि मैं इस तरह के जटिल समस्याओं कभी नहीं किया था। क्या यह किसी विशेष समस्या से संबंधित है? –

संबंधित मुद्दे