क्या एक मशीन पर कोड / संकलन एंड्रॉइड एप्लिकेशन को लिखना और दूसरे पर लॉन्च किए गए एमुलेटर पर दूरस्थ रूप से डिबग करना संभव है? मैं बीमार हूं और अपने लैपटॉप के सीपीयू के लगातार आधे खाने वाले एमुलेटर से थक गया हूं।
जवाबों:
मैंने पहले उस adb connect
कमांड का प्रयास नहीं किया है (या यहां तक कि देखा गया है) जो कमांड ने उल्लेख किया है, लेकिन मैं पुष्टि कर सकता हूं कि खुद को टीसीपी पोर्ट को अग्रेषित करना - जैसे कि एसएसएच पर - ठीक काम करता है।
एमुलेटर प्रति उदाहरण दो टीसीपी पोर्ट पर सुनता है: टेलनेट इंटरफेस के लिए 5554 और डीडीएमएस जैसे टूल के साथ नियंत्रण संचार के लिए 5555। तो आप शायद केवल 5555 को अग्रेषित करने वाले पोर्ट के साथ भाग सकते हैं (हालांकि मैंने केवल दोनों के साथ अब तक की कोशिश की है)। प्रत्येक बाद के एमुलेटर अगले उपलब्ध समतुल्य + विषम पोर्ट नंबर ट्यूपल (लगभग 5580 तक, मुझे लगता है) लेता है।
संदर्भ के लिए, मैंने अपने स्थानीय मशीन पर निम्नलिखित कदम उठाए:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
मेरा मानना है कि एमुलेटर स्टार्टअप पर एक स्थानीय एडीबी सर्वर को सूचित करने की कोशिश करता है; इसलिए स्थानीय 5554+ पोर्ट की जांच के लिए इसके लिए adb को पुनः आरंभ करने की आवश्यकता है।
ध्यान दें कि localhost
ssh कमांड में रिमोट मशीन के स्थानीय इंटरफ़ेस को संदर्भित करता है ।
adb devices
एक नया एमुलेटर दिखाया गया है emulator-5554
- और मैं इसका उपयोग कर सकता हूं जैसे कि यह मेरे स्थानीय मशीन पर चल रहा हो।
killall adb
सर्वर पर भी जाने की आवश्यकता है , क्योंकि एमुलेटर कई कनेक्शनों को स्वीकार नहीं करेगा और offline
स्थानीय मशीन के लिए होगा ।
यहां बताया गया है कि मैंने इसे विंडोज पर कैसे हल किया। मैंने क्रिस्टोफर की अगुवाई में बहुत पीछा किया, लेकिन मैं संपादित नहीं कर सकता, इसलिए एक नया जवाब देना होगा।
मेरे पास समस्या यह थी कि एडीबी और एमुलेटर सिर्फ 127.0.0.1 पर सुन रहा था, मेरे लिए 0.0.0.0 नहीं। अन्यथा मैंने TCPMon का उपयोग किया होता । मुझे लगता है कि यह या तो विंडोज पर अलग है, या एसडीके के नवीनतम संस्करणों के साथ बदल गया है। (आप के साथ जाँच कर सकते हैं netstat -ban
)
मैंने एमुलेटर चलाने वाली मशीन पर WinSSHD लगाया । (मेरा मानना है कि इसे फ्रीएसएसएचडी के साथ भी काम करना चाहिए, लेकिन मुझे वहां काम करने में कोई लॉगिन नहीं मिला।)
मैंने विंडोज फ़ायरवॉल में पोर्ट 22 (टीसीपी) खोला। (WinSSHD आपके लिए ऐसा करने में सक्षम हो सकता है।)
मैंने WinSSHD GUI में एक वर्चुअल अकाउंट बनाया।
मैंने विकास मशीन से एमुलेटर मशीन में एक नया PuTTY कनेक्शन बनाया और सुनिश्चित किया कि मैं कनेक्ट कर सकता हूं।
फिर मैंने पुट्टी में टनलिंग स्थापित की: कनेक्शन -> एसएसएच -> टनल
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(सुरंग को बनाए रखने के लिए, PuTTY को कनेक्ट और खुला रखें।)
अब मैंने रिमोट मशीन पर एमुलेटर को निकाल दिया और सुनिश्चित किया कि एडीबी वहां नहीं चल रहा है।
मैंने एडीबी को विकास मशीन ( adb kill-server
फिर, adb start-server
) पर फिर से शुरू किया ।
adb devices
और दूरस्थ एमुलेटर के रूप में दिखाया गया है emulator-5554 device
। अब मैं अपने ऐप को सीधे ग्रहण / एडीटी से तैनात और चला सकता हूं, जहां एमुलेटर वर्चुअल डिवाइसेस के तहत दिखाई देता है जैसे कि यह एक स्थानीय एमुलेटर है।
मुझे एहसास है कि यह प्रश्न वास्तव में पुराना है, लेकिन मैंने समस्या को थोड़ा अलग तरीके से हल किया, और मुझे इस तुच्छ समाधान का पता लगाने में थोड़ा समय लगा।
मैं आमतौर पर अपने फ्रंट-एंड के रूप में विंडोज 7 पीसी या लैपटॉप (जहां मैं काम कर रहा हूं) का उपयोग करता हूं क्योंकि मुझे जीयूआई पसंद है, हालांकि मैं अपने सभी एडिट / कंपाइल / डिबग को एक हेडलेस उबंटू सर्वर पर करना पसंद करता हूं क्योंकि सभी कमांड-लाइन पावर यह प्रदान करता है। मेरा लक्ष्य प्रत्येक विंडोज़ सिस्टम को किसी भी अतिरिक्त सेवाओं (जैसे sshd) या फ़ायरवॉल छेद के बिना जितना संभव हो सके उतना पतला-क्लाइंट बनाना है।
तो यहाँ है senario:
पहले बताई गई समस्या यह है कि सिस्टम-ए पर एम्यूलेटर लोकलहोस्ट को बांधता है, न कि बाहरी ईथरनेट इंटरफेस को, इसलिए सिस्टम-बी पर एडीबी सिस्टम-ए पर एमुलेटर तक नहीं पहुंच सकता है। आपको बस इतना करना है कि सिस्टम-बी में आपके एसएसएच कनेक्शन के लिए PuTTY में रिमोट पोर्ट फॉरवर्डिंग सेट किया जाए। ट्रिक "रिमोट" रेडियो बटन को चेक करने के लिए है जब आप दो सुरंग बनाते हैं ताकि सुरंग दिशा उलट जाए (जिस सर्वर से आप लॉग इन कर रहे हैं उस क्लाइंट से सुरंग बना रहे हैं)।
अंत में, SSH कनेक्शन स्थापित करने के बाद सिस्टम-बी पर "लोकलहोस्ट" के लिए adb से जुड़ें:
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
अब आप छवियों / डिबग को सामान्य रूप से डाउनलोड कर सकते हैं, और यदि आप अपने लैपटॉप को बाहर निकालना चाहते हैं और कुछ कॉफी प्राप्त करना चाहते हैं, तो एक अलग विंडोज सिस्टम पर स्विच करना एक तुच्छ मामला है।
इसके अलावा, उसी तरीके से पोर्ट 5037 को भी टनलिंग करके आप वास्तव में अपने एडीबी सर्वर कनेक्शन को आगे बढ़ा सकते हैं ताकि आप सिस्टम-ए पर यूएसबी पर एक वास्तविक एंड्रॉइड डिवाइस को कनेक्ट कर सकें और सिस्टम-बी से इसे डाउनलोड कर सकें। इसे काम करने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि सिस्टम-ए पर एडीबी सर्वर चल रहा है, और आपके एसएसएच सत्र को शुरू करने से पहले सिस्टम-बी पर नहीं चल रहा है:
सबसे पहले, सिस्टम-ए (कमांड प्रॉम्प्ट) पर एडीबी सर्वर शुरू करें
C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC device
अगला, सिस्टम-बी पर एडीबी सर्वर को मारें
System-B$ adb kill-server
अंत में, सिस्टम-बी में अपना ssh सत्र पुनः आरंभ करें और सत्यापित करें
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
मुझे ऐसा करने का एक आसान तरीका मिला अगर आपकी दो मशीनें एक ही निजी नेटवर्क में हैं और इसलिए आपको SSH एन्क्रिप्शन (जो कि सामान्य मामला है) का उपयोग करने की आवश्यकता नहीं है। यह SSH सुरंग के रूप में मदद कर सकता है और स्थापित करने में काफी लंबा और कठिन हो सकता है। उदाहरण के लिए, पहली बार Cygwin / Windows के तहत SSH डेमॉन को स्थापित करने से आपको हार का सामना करना पड़ सकता है (ठीक है, मैंने हार मान ली)।
विंडोज के तहत, पैकेज निस्पंदन के साथ साइगविन को स्थापित करने के लिए निम्न प्रकार की आवश्यकता होती है । यह लिनक्स / नॉटपुनलाइन के तहत भी काम करना चाहिए, लेकिन मैंने कोशिश नहीं की।
किसी एक मशीन पर एमुलेटर चलाएं ( मान लें कि इसका होस्ट नाम HostEmulator है )
अन्य मशीन पर ग्रहण शुरू करें (इसे HostEclipse कहें )
प्रत्येक मशीन पर एक सिगविन टर्मिनल खोलें, और फिर,
पर HostEmulator , निम्नलिखित cygwin आदेशों में प्रवेश :
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts का मतलब है Http Tunnel Server ।
ये दोनों कमांड दो आधे-सेतु बनाते हैं जो बंदरगाहों को 10001 और 10001 को सुनते हैं और इन बंदरगाहों के I / O को स्थानीय बंदरगाहों 5554 और 5555 पर पुनर्निर्देशित करते हैं, जो एमुलेटर द्वारा उपयोग किए जाने वाले पोर्ट हैं (वास्तव में, पहला लॉचिंग एमुलेटर - यदि आप उनमें से कई चल रहे हैं तो वे उच्च पोर्ट संख्या का उपयोग करेंगे जैसा कि इस पृष्ठ के अन्य उत्तरों में देखा गया है)।
पर HostEclipse , इन लोगों में प्रवेश :
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc का मतलब है Http टनल क्लाइंट ।
ये कमांड लापता आधे पुलों का निर्माण करते हैं। वे 5554 और 5555 के स्थानीय बंदरगाहों को सुनते हैं और हमने इन बंदरगाहों के I / O को उस पुर्ज़े को पुनर्निर्देशित कर दिया है जो हमने HostEmulator पर कुछ समय पहले बनाया था ।
फिर, HostEclipse पर , इन तीन आदेशों को दर्ज करें :
adb kill-server
adb start-server
adb devices
यह अदब को पुनः आरंभ करता है क्योंकि यह दूरस्थ एमुलेटर का पता नहीं लगाता है। यह स्टार्टअप पर कुछ स्कैनिंग कर रहा होगा। और फिर यह केवल जाँच के लिए उपकरणों (उपलब्ध एमुलेटर) को सूचीबद्ध करता है।
आप अपने दूरस्थ एमुलेटर के साथ काम कर सकते हैं जैसे कि यह स्थानीय था। आपको साइगविन टर्मिनलों को दोनों मशीन पर खुला रखना होगा अन्यथा आप बनाए गए आधे पुलों को मार देंगे।
मैंने यहां मशीन / मशीन एक्सचेंज के लिए पोर्ट 10000 और 10001 का उपयोग किया है, लेकिन निश्चित रूप से आप अन्य पोर्ट का उपयोग कर सकते हैं जब तक कि वे पहले से उपयोग में न हों।
जब मेरी ssh सेवा प्रारंभ करने में विफल रही, तो Windows + AndroVM (जिसके लिए केवल होस्ट एडाप्टर की आवश्यकता है) का मेरा समाधान। इसलिए इसे किसी अतिरिक्त सॉफ्टवेयर की आवश्यकता नहीं है।
adb connect <Andro VM IP>
adp tcpip 555
Cmd प्रॉम्प्ट पर व्यवस्थापक के रूप में चलाएं:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
विंडोज़ फ़ायरवॉल में TCP पोर्ट 5555 खोलें।
फिर, दूसरे पीसी रन से:
adb connect <host ip>
किसी भी प्रस्तावित समाधान ने मेरे लिए काम नहीं किया। मैंने Emirikol के समाधान से शुरुआत की है और इसे परिष्कृत किया है, क्योंकि नए Android API> 21 के साथ एमुलेटर ऑफ़लाइन दिखाई दे रहा था और मुझे Genymotion सेटिंग में जाना था और Android SDK पथ को खाली छोड़ना था। और कमांड लाइन से:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
स्रोत: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ अस्वीकरण, मैं लेखक हूं।
जब आप adb चलाते हैं, तो यह स्वयं की एक सर्वर प्रति शुरू करता है यदि कोई पहले से नहीं चल रहा है। आप डिवाइस के साथ मशीन पर खुद को कॉपी कर सकते हैं और sdk 4.3 के बाद से आप दूरस्थ सर्वर के लिए सुनने के लिए उस सर्वर को यह बताने के लिए -a विकल्प दे सकते हैं। निम्नलिखित आदेश के साथ ऐसा करें जो बाहर नहीं निकलता है:
adb -a -P 5037 सर्वर nodaemon
उस मशीन पर जिसे आप डिवाइस से उपयोग करना चाहते हैं, ADB_SERVER_SOCKET को tcp पर सेट करें: xxxx: 5037 एक पर्यावरण चर में (या -L विकल्प के साथ प्रत्येक adb मंगलाचरण को समान मूल्य दें), जहाँ xxxx IP पता या होस्टनाम है उपकरणों के साथ मशीन, और 5037 उस पोर्ट से मेल खाती है जिसे आपने ऊपर कमांड में दिया था।
हम इसका उपयोग 3 मशीनों में फैले लगभग 100 एमुलेटर तक पहुँच देने के लिए करते हैं, जो समानांतर में परीक्षण समाप्त करने के लिए मशीन चला रहे हैं, और डेवलपर्स को दूर से वास्तविक डिवाइस साझा करना चाहते हैं।
आप आगे और अदब के साथ एमुलेटर से बंदरगाहों को अग्रेषित कर सकते हैं और रिवर्स रिवर्स कर सकते हैं, और वे यंत्रों के साथ मशीन पर दिखाई देंगे (न कि वह मशीन जिसे आप 'अदब फॉरवर्ड' से चला रहे हैं)।
adb -L tcp:remotehost:1234 devices
यदि यह करता है, तो आपको यह पता लगाने की आवश्यकता है कि एंड्रॉइड स्टूडियो दूरस्थ एडीबी का समर्थन करता है या नहीं - यह मुझे आश्चर्यचकित नहीं करेगा अगर यह उपयोग करने पर जोर देता है स्थानीय उपकरण।
मेरे पास हाथ में एसडीके के साथ दूसरी मशीन नहीं है, लेकिन मैं ध्यान देता हूं कि एमुलेटर के पोर्ट्स (डिफ़ॉल्ट 5554, 5555) सुन रहे हैं 0.0.0.0
, यानी रिमोट मशीनों से पहुंच योग्य है, और यह adb --help
एक connect <host>:<port>
कमांड दिखाता है । मुझे लगता है कि ऐसा लगता है कि यह आदेश में adb devices
इस adb
पर काम करेंगे। ग्रहण के लिए, "रन / रन कॉन्फ़िगरेशन ..." का प्रयास करें और लक्ष्य को मैनुअल पर सेट करें। यदि आप एक "डिवाइस चयनकर्ता" जो मुझे लगता है कि एक दूरस्थ एमुलेटर शामिल होगा अगर अदब इसे से जुड़ा हुआ है देता है। एक कोशिश के काबिल है।