ग्रेडिंग का उपयोग करके प्रोजेक्ट बनाते समय पासवर्ड दर्ज करना

एंड्रॉइड के लिए प्रोजेक्ट बनाते समय, ग्रैडल आपको कुछ मापदंडों को निर्दिष्ट करने की अनुमति देता है जो आपको एक पैकेज को इकट्ठा करने और हस्ताक्षर करने की अनुमति देता है जो Google Play पर डाउनलोड के लिए तैयार है। हालांकि, यह शायद ही कुछ डेटा डाउनलोड करने के लायक है, जैसे कि निजी कुंजी के लिए पासवर्ड, सार्वजनिक भंडार में। नीचे दिए गए एक लेख में, लेखक चर्चा करता है कि किसी प्रोजेक्ट की असेंबली के दौरान पासवर्ड जैसे निजी जानकारी कैसे दर्ज करें।



Gradle आपको System.console () विधि का उपयोग करके कंसोल तक पहुंचने की अनुमति देता है। कंसोल पासवर्ड पढ़ने के लिए एक विधि प्रदान करता है, जिससे आप उपयोग कर सकते हैं:

def password = System.console().readPassword("\nPlease enter key passphrase: ")
      
      





अब आप बिल्ड स्क्रिप्ट में कहीं भी पासवर्ड का उपयोग कर सकते हैं, और आप कर रहे हैं ... ओह, तो यह बहुत छोटा पोस्ट होगा, इसलिए अब समस्याओं के बारे में बात करते हैं।





समस्या नंबर 1 - मुझे लगातार पाइस्टर करने की कोई आवश्यकता नहीं है।



यदि आप इस लाइन को अपने build.gradle में डालते हैं, तो आप देखेंगे कि यह हर बार जब आप कुछ इकट्ठा करते हैं तो चलता है। इससे कोई फर्क नहीं पड़ता कि आपको इस विधानसभा में कुछ हस्ताक्षर करने की आवश्यकता है या नहीं, वैसे भी एक पासवर्ड का अनुरोध किया जाएगा।



इस समस्या को हल करने के लिए, आप कार्य को जांचने के लिए टास्कग्राफ का उपयोग कर सकते हैं कि क्या इस कुंजी की आवश्यकता है। चूंकि टास्कग्राफ निर्माण प्रक्रिया की शुरुआत में भरा जाएगा, इसलिए आपको इसे भरने तक इंतजार करने की आवश्यकता है:

 gradle.taskGraph.whenReady { taskGraph -> // ,  TaskGraph . }
      
      





बस इस कोड को बिल्ड स्क्रिप्ट में रखें और ग्राफ तैयार होने पर इसके अंदर का कोड निष्पादित किया जाएगा।



अब आपको यह सत्यापित करने की आवश्यकता है कि हम एक कार्य कर रहे हैं जिसमें पासवर्ड की आवश्यकता है। टास्कग्राफ में एक हैटस्क () विधि है, जो यह सुनिश्चित करने के लिए डिज़ाइन की गई है कि एक विशिष्ट कार्य का निर्माण समय पर किया जाएगा। आपको पैरामीटर के रूप में कार्य नाम निर्दिष्ट करना होगा। इसके अलावा, आपको रूट निर्देशिका के नाम से पहले एक कोलन निर्दिष्ट करना होगा। यदि कार्य कुछ सबमॉड्यूल में परिभाषित किया गया है (जैसा कि एंड्रॉइड प्रोजेक्ट्स में आमतौर पर होता है), तो आपको इस मॉड्यूल का नाम भी बताना होगा। अपनी परियोजना में एक एप्लिकेशन मॉड्यूल होने दें और जब हम असेंबल करते हैं तो हमें एक महत्वपूर्ण पासवर्ड की आवश्यकता होती है। तो हम आवश्यक जाँच कर सकते हैं:

 gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { //  ,      def pass = System.console().readPassword("\nPlease enter key passphrase: ") // readPassword  char[],       String pass = new String(pass) //      pass } }
      
      





अब जब तक वह पासवर्ड की जरूरत नहीं होगी तब तक आपको परेशान नहीं किया जाएगा।



समस्या संख्या 2 - हमारे पास कंसोल नहीं है।



यदि आप IDE (उदाहरण के लिए, एंड्रॉइड स्टूडियो में) के ऊपर कोड को निष्पादित करने का प्रयास करते हैं या gradle.daemon का उपयोग करते हैं , तो आपके पास कंसोल (System.console () वापस शून्य) तक पहुंच नहीं होगी और अपवाद के कारण असेंबली टूट जाएगी। लेकिन घबराइए नहीं, यह समस्या हल हो गई है। यदि हमारे पास कंसोल तक पहुंच नहीं है, तो हमारे पास अभी भी एक यूआई है। हम एक साधारण पासवर्ड डायलॉग दिखाने के लिए Groovy से SwngBuilder का उपयोग कर सकते हैं।



सबसे पहले, आपको इसे आयात करने की आवश्यकता है, इसलिए अपने build.gradle की शुरुआत में निम्न पंक्ति रखें:

 import groovy.swing.SwingBuilder
      
      





अब आप सरल इनपुट संवाद दिखाने के लिए SwingBuilder का उपयोग कर सकते हैं:

 def pass = '' new SwingBuilder().edt { dialog(modal: true, //    ,    . title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, //     . pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password; dispose(); }) } } }
      
      





इस कोड को उस स्थान पर जोड़ें जहां आपको पासवर्ड का अनुरोध करने की आवश्यकता है और आपको पास चर में उपयोगकर्ता द्वारा दर्ज किया गया पासवर्ड प्राप्त होगा।



यह सब एक साथ रखना।



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

 gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { def pass = '' if(System.console() == null) { new SwingBuilder().edt { dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password dispose(); }) } } } } else { pass = System.console().readPassword("\nPlease enter key passphrase: ") pass = new String(pass) } if(pass.size() <= 0) { throw new InvalidUserDataException("You must enter a password to proceed.") } // ----- //      pass ,  ! // ----- } }
      
      





ग्रूवी दस्तावेज में डुबकी लगाने के लिए स्वतंत्र महसूस करें और देखें कि आप इस UI को कैसे सुधार सकते हैं।



All Articles