ADB के आसपास काम करना "डिवाइस की प्रतीक्षा करना" समस्या


9

हम अपने एंड्रॉइड विकास के लिए एक निरंतर एकीकरण सर्वर स्थापित कर रहे हैं और हम जल्दी से एडीबी के डिवाइस मुद्दे के इंतजार में भाग रहे हैं

रिकॉर्ड के लिए, हम पहले से ही के संयोजन का एक बहुत कोशिश की है adb kill-server, adb start-server, adb devicesकोई लाभ नहीं हुआ, आदि।

अफसोस की बात है, इंटरनेट पर मैंने पाया कि "डिवाइस को अनप्लग और रिप्लेस करें" की विविधताएं हैं, जो स्पष्ट रूप से हमारे लिए एक समाधान नहीं है (हम सीआई सर्वर द्वारा अनप्लग और उपकरणों को फिर से भरने के लिए एक इंसान को बैठने से नहीं रोक सकते हैं) प्रत्येक निर्माण)।

पृष्ठभूमि के एक बिट के रूप में, हम मैक पर जेनकिन्स का उपयोग करते हैं, क्योंकि यह हमारे सीआई को आईओएस के लिए भी चलाता है।

समस्या के पास आते हुए मैंने सोचा कि अगर ओएस स्तर पर डिवाइस पाया जाता है, तो यह कम से कम एक शुरुआत है। वास्तव में, एक कमांड चलाने जैसा system_profiler SPUSBDataTypeकि डिवाइस को सफलतापूर्वक मिल जाता है, जिसमें सीरियल नंबर भी शामिल है जो सही ढंग से काम करते समय एडीबी रिपोर्ट करता है।

मैंने सभी USB गतिविधि को "रिफ्रेश" करने के लिए कुछ बल्कि लाम कमांड का प्रयास किया है, लेकिन मैं कहीं नहीं गया हूं। ऐसा नहीं है कि आप डिवाइस को माउंट / अनमाउंट कर सकते हैं, लेकिन ईमानदार होने के लिए मैं यह भी निश्चित नहीं हूं कि समस्या कहां है, मुझे निम्न स्तर के यूएसबी प्रोटोकॉल के बारे में पर्याप्त जानकारी नहीं है, अकेले मैक के लिए। एडीबी स्रोत कोड का मेरा लुकिंग एक बहुत, बहुत लंबा शॉट था।

तो इस बिंदु पर मैं एक समाधान के लिए सभी कान हूं जो हमें हमारे सीआई सर्वर पर लगातार एंड्रॉइड चलाने की अनुमति देगा। यह प्रत्येक जेनकींस नौकरी से पहले कुछ आज्ञाओं का पालन करें, एडीबी या किसी अन्य काले जादू की चाल के साथ।

जवाबों:


9

इसे हल करने का एक तरीका मिला, इसलिए पूर्णता के लिए यहां पोस्ट करना। कृपया ध्यान दें कि मैं यह नहीं कह रहा हूं कि इसे हल करने का सबसे अच्छा तरीका है, लेकिन यह हमारे लिए काम कर रहा है।

इसलिए, हमने महसूस किया कि समस्या लंबे समय तक CI निष्क्रियता (घंटों की सीमा में) के बाद हुई। इसलिए हमने एक साधारण स्क्रिप्ट बनाई जो adb devicesहर 10 सेकंड में कॉल करती है। और समस्या दूर हो गई है, कोई और "डिवाइस के लिए इंतजार" मुद्दों।

लिनक्स पर आप इसे एक साधारण cronकाम के साथ launchctlऔर OSX के साथ कर सकते हैं और मुझे यकीन है कि एक विंडोज समतुल्य है।

भले ही, हर 10 सेकंड में उपकरणों को "पिंगिंग" ने हमारे लिए हल कर दिया।


1
धन्यवाद! लगता है कि मैं एक ही मुद्दा रहा था। USB केबल को अनप्लग और प्लग करना सूची में डिवाइस को दिखा देता है।
जॉर्ज पेड्रेट


1

ओएसएक्स मशीन (आईओएस और एंड्रॉइड दोनों के लिए भी उपयोग किया जाता है) से एंड्रॉइड डिवाइस के साथ हमारे कंटीन्यूअस इंटीग्रेशन पर्यावरण के साथ हमें कुछ अंतरंग समस्याएं थीं।

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

इसे ठीक करने का एक तरीका, केवल "adb devices" को शेल से चलाना है जो CI मशीन पर खुला छोड़ दिया जाता है। आप यह बता सकते हैं कि क्या यह मूल प्रक्रिया है कि क्या यह संदेश चलने के बाद दिखाया गया है

blah$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
xxxxxxxxxxx          device

यह एक कष्टप्रद कदम है कि हर बार आपकी मशीन को फिर से शुरू करना पड़ता है, और यदि कोई भी उस कमांड विंडो को बंद करता है तो आप पिछली समस्या पर लौट आएंगे।

सिद्धांत रूप में, बूटअप पर adb डेमन को ट्रिगर करने के लिए .plist फ़ाइल बनाने का एक बेहतर तरीका होगा। यहाँ एक उदाहरण है: ~ / लाइब्रेरी / LaunchAgents / server.adb.plist। यह मूल रूप से सिर्फ जेन लॉन्च से बचने के लिए उपयोगकर्ता लॉन्च डेमॉन से एडीबी स्टार्ट-सर्वर चलाता है।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>server.adb</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Shared/Jenkins/android-sdk/platform-tools/adb</string>
        <string>start-server</string>
    </array>
  </dict>
</plist>

हालाँकि, इसके साथ समस्या यह है कि यह सिर्फ adb शुरू करता है, लेकिन यह ब्लॉक नहीं होता है, इसलिए आप KeepAlive लॉन्च कंट्रोल कार्यक्षमता का उपयोग नहीं कर सकते हैं। इसके अलावा, यह इच्छित उद्देश्य के लिए काम नहीं करता है। अगर किसी को "डेमॉन" मोड में एडीबी चलाने के तरीके के बारे में पता है, तो यह वापस नहीं आता है, तो यह लॉन्चर तंत्र को स्वचालित रूप से इसे फिर से शुरू करने के लिए सेट किया जा सकता है अगर यह मर जाता है, इसलिए यह सुनिश्चित करना कि जेनकींस को कभी भी स्वामित्व नहीं मिलता है। ओह ठीक है, अभी के लिए मैं एक शेल विंडो में "adb devices" चला रहा हूँ और इसे खुला छोड़ रहा हूँ।


1

मैंने प्रत्येक परीक्षण रन से पहले यूएसबी हब को रिबूट करने के लिए प्रोग्रामेबल पावर स्ट्रिप का उपयोग करके इसे हल किया। इसने USB केबल को अनप्लग और प्लग करने जैसा ही किया।


क्या आप अधिक विस्तार कर सकते हैं?
दिनेश

1

मैं सिर्फ जुआन-डेलगाडो द्वारा उत्कृष्ट सुझाव का पालन करना चाहता था । मुझे मैकओएस हाई सिएरा पर पाया गया कि कमांड के adbसाथ हर 10 सेकंड में चलना watchएक त्वरित वर्कअराउंड के रूप में भी प्रभावी था:

watch -n 10 adb -d devices

यह मुझे एक .plistफ़ाइल बनाने को रोकने की अनुमति देता है , लेकिन स्पष्ट दोष यह एक स्थायी समाधान नहीं है। watchतो यह प्रभावी वहाँ रूप में अच्छी तरह से किया जाना चाहिए आदेश, OSX के पिछले संस्करणों पर उपलब्ध है।


मैं watchmacos Catalina पर नहीं था , लेकिन आसानी से इसे स्थापित करने में सक्षम था brew install watch
मोकागियो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.