एंड्रॉइड एमुलेटर के साथ रिमोट डिबगिंग


94

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

जवाबों:


72

मैंने पहले उस adb connectकमांड का प्रयास नहीं किया है (या यहां तक ​​कि देखा गया है) जो कमांड ने उल्लेख किया है, लेकिन मैं पुष्टि कर सकता हूं कि खुद को टीसीपी पोर्ट को अग्रेषित करना - जैसे कि एसएसएच पर - ठीक काम करता है।

एमुलेटर प्रति उदाहरण दो टीसीपी पोर्ट पर सुनता है: टेलनेट इंटरफेस के लिए 5554 और डीडीएमएस जैसे टूल के साथ नियंत्रण संचार के लिए 5555। तो आप शायद केवल 5555 को अग्रेषित करने वाले पोर्ट के साथ भाग सकते हैं (हालांकि मैंने केवल दोनों के साथ अब तक की कोशिश की है)। प्रत्येक बाद के एमुलेटर अगले उपलब्ध समतुल्य + विषम पोर्ट नंबर ट्यूपल (लगभग 5580 तक, मुझे लगता है) लेता है।

संदर्भ के लिए, मैंने अपने स्थानीय मशीन पर निम्नलिखित कदम उठाए:

  • ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
  • killall adb; adb devices

मेरा मानना ​​है कि एमुलेटर स्टार्टअप पर एक स्थानीय एडीबी सर्वर को सूचित करने की कोशिश करता है; इसलिए स्थानीय 5554+ पोर्ट की जांच के लिए इसके लिए adb को पुनः आरंभ करने की आवश्यकता है।

ध्यान दें कि localhostssh कमांड में रिमोट मशीन के स्थानीय इंटरफ़ेस को संदर्भित करता है ।

adb devicesएक नया एमुलेटर दिखाया गया है emulator-5554- और मैं इसका उपयोग कर सकता हूं जैसे कि यह मेरे स्थानीय मशीन पर चल रहा हो।


1
पुट्टी एसएसएच पोर्ट फॉरवर्डिंग के साथ मेरे विंडोज 7 मशीन से भी, एक आकर्षण की तरह काम करता है। धन्यवाद।
gsbabil

1
@JimMcKeeth: उपरोक्त नेटवर्क कॉन्फ़िगरेशन के आधार पर, पोटीन खोलें, कनेक्शन> एसएसएच> सुरंगों पर जाएं। अब सोर्स-पोर्ट: 5556 और डेस्टिनेशन: लोकलहोस्ट: 5554 के साथ एक प्रविष्टि जोड़ें। सोर्स-पोर्ट: 5557 और डेस्टिनेशन: लोकलहोस्ट: 5555 के साथ भी इसे दोहराएं। चीयर्स!
gsbabil

5
बस याद रखें कि आपको killall adbसर्वर पर भी जाने की आवश्यकता है , क्योंकि एमुलेटर कई कनेक्शनों को स्वीकार नहीं करेगा और offlineस्थानीय मशीन के लिए होगा ।
हेनरिक डी सोसा

क्या कोई इसे अंग्रेजी में समझा सकता है?
अनिल जीआर

21

यहां बताया गया है कि मैंने इसे विंडोज पर कैसे हल किया। मैंने क्रिस्टोफर की अगुवाई में बहुत पीछा किया, लेकिन मैं संपादित नहीं कर सकता, इसलिए एक नया जवाब देना होगा।

मेरे पास समस्या यह थी कि एडीबी और एमुलेटर सिर्फ 127.0.0.1 पर सुन रहा था, मेरे लिए 0.0.0.0 नहीं। अन्यथा मैंने TCPMon का उपयोग किया होता । मुझे लगता है कि यह या तो विंडोज पर अलग है, या एसडीके के नवीनतम संस्करणों के साथ बदल गया है। (आप के साथ जाँच कर सकते हैं netstat -ban)

  1. मैंने एमुलेटर चलाने वाली मशीन पर WinSSHD लगाया । (मेरा मानना ​​है कि इसे फ्रीएसएसएचडी के साथ भी काम करना चाहिए, लेकिन मुझे वहां काम करने में कोई लॉगिन नहीं मिला।)

  2. मैंने विंडोज फ़ायरवॉल में पोर्ट 22 (टीसीपी) खोला। (WinSSHD आपके लिए ऐसा करने में सक्षम हो सकता है।)

  3. मैंने WinSSHD GUI में एक वर्चुअल अकाउंट बनाया।

  4. मैंने विकास मशीन से एमुलेटर मशीन में एक नया PuTTY कनेक्शन बनाया और सुनिश्चित किया कि मैं कनेक्ट कर सकता हूं।

  5. फिर मैंने पुट्टी में टनलिंग स्थापित की: कनेक्शन -> एसएसएच -> टनल

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (सुरंग को बनाए रखने के लिए, PuTTY को कनेक्ट और खुला रखें।)

  6. अब मैंने रिमोट मशीन पर एमुलेटर को निकाल दिया और सुनिश्चित किया कि एडीबी वहां नहीं चल रहा है।

  7. मैंने एडीबी को विकास मशीन ( adb kill-serverफिर, adb start-server) पर फिर से शुरू किया ।

  8. adb devicesऔर दूरस्थ एमुलेटर के रूप में दिखाया गया है emulator-5554 device। अब मैं अपने ऐप को सीधे ग्रहण / एडीटी से तैनात और चला सकता हूं, जहां एमुलेटर वर्चुअल डिवाइसेस के तहत दिखाई देता है जैसे कि यह एक स्थानीय एमुलेटर है।


बढ़िया काम किया! विवरण के लिए धन्यवाद।
जिम मैककेथ

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

@MisterSmith बहुत ही मान्य बिंदु, आप एक संपादन क्यों प्रस्तुत नहीं करते? :)
हेनरिक हेमबर्गर

@ मिस्टरस्मिथ क्या आप इस टिप्पणी को प्रतिबिंबित करने के लिए अपना जवाब संपादित कर सकते हैं, यह समस्या की सफलता के लिए बहुत महत्वपूर्ण है। इसके अलावा, धन्यवाद, मैं अब अपने गेस्ट मशीन से अपने होस्ट से कनेक्ट करने में सक्षम हूं।
मीनबुनि

20

मुझे एहसास है कि यह प्रश्न वास्तव में पुराना है, लेकिन मैंने समस्या को थोड़ा अलग तरीके से हल किया, और मुझे इस तुच्छ समाधान का पता लगाने में थोड़ा समय लगा।

मैं आमतौर पर अपने फ्रंट-एंड के रूप में विंडोज 7 पीसी या लैपटॉप (जहां मैं काम कर रहा हूं) का उपयोग करता हूं क्योंकि मुझे जीयूआई पसंद है, हालांकि मैं अपने सभी एडिट / कंपाइल / डिबग को एक हेडलेस उबंटू सर्वर पर करना पसंद करता हूं क्योंकि सभी कमांड-लाइन पावर यह प्रदान करता है। मेरा लक्ष्य प्रत्येक विंडोज़ सिस्टम को किसी भी अतिरिक्त सेवाओं (जैसे sshd) या फ़ायरवॉल छेद के बिना जितना संभव हो सके उतना पतला-क्लाइंट बनाना है।

तो यहाँ है senario:

  • सिस्टम-ए: एंड्रॉइड एमुलेटर के साथ विंडोज 7 सिस्टम चल रहा है
  • सिस्टम-बी: एसडीके के साथ उबंटू सर्वर स्थापित

पहले बताई गई समस्या यह है कि सिस्टम-ए पर एम्यूलेटर लोकलहोस्ट को बांधता है, न कि बाहरी ईथरनेट इंटरफेस को, इसलिए सिस्टम-बी पर एडीबी सिस्टम-ए पर एमुलेटर तक नहीं पहुंच सकता है। आपको बस इतना करना है कि सिस्टम-बी में आपके एसएसएच कनेक्शन के लिए 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

क्या सिस्टम-ए पर android sdk स्थापित किए बिना ऐसा करने का कोई तरीका है? (विंडोज़ मशीन?)
कीथ ट्वोमेबी

नहीं, क्योंकि डिवाइस के साथ संचार करने के लिए adb सर्वर और usb ड्राइवरों को सिस्टम-ए पर चलने की आवश्यकता होती है।
पैट्रिक मैकिनॉन

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

अगर आपको Mac OS X के लिए पोटीन की आवश्यकता है तो आप इसे यहाँ पा सकते हैं: mac-tools.org/putty-fur-mac-os-x/02/2012 मेरे लिए यह उस टूल के साथ काम करता है।
ब्रूनो बीरी

@PatrickMcKinnon की बात ठीक है, लेकिन सिस्टम-बी पर, मुझे "विज्ञापन उपकरणों" को कॉल करने पर अनधिकृत रूप से मिल रहा है। सिस्टम-बी "एडीबी उपकरणों" पर इसे ठीक काम करने के रूप में दिखाता है। कोई मदद?
तेजस शेरदीवाला

6

मुझे ऐसा करने का एक आसान तरीका मिला अगर आपकी दो मशीनें एक ही निजी नेटवर्क में हैं और इसलिए आपको 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 का उपयोग किया है, लेकिन निश्चित रूप से आप अन्य पोर्ट का उपयोग कर सकते हैं जब तक कि वे पहले से उपयोग में न हों।


2

जब मेरी 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>

1

किसी भी प्रस्तावित समाधान ने मेरे लिए काम नहीं किया। मैंने 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/ अस्वीकरण, मैं लेखक हूं।


एकदम सही जवाब और लेख! यदि आप Genymotion का उपयोग करते हैं, तो इस समाधान का उपयोग करें। लेख विंडोज और मैक के बारे में लिखा गया है, लेकिन मेरे पास स्थानीय उबंटू और दूरस्थ उबंटू हैं और सभी ठीक काम करते हैं। मेरा हफ्ता बचा लिया!
konstantin_doncov

1

जब आप adb चलाते हैं, तो यह स्वयं की एक सर्वर प्रति शुरू करता है यदि कोई पहले से नहीं चल रहा है। आप डिवाइस के साथ मशीन पर खुद को कॉपी कर सकते हैं और sdk 4.3 के बाद से आप दूरस्थ सर्वर के लिए सुनने के लिए उस सर्वर को यह बताने के लिए -a विकल्प दे सकते हैं। निम्नलिखित आदेश के साथ ऐसा करें जो बाहर नहीं निकलता है:

adb -a -P 5037 सर्वर nodaemon

उस मशीन पर जिसे आप डिवाइस से उपयोग करना चाहते हैं, ADB_SERVER_SOCKET को tcp पर सेट करें: xxxx: 5037 एक पर्यावरण चर में (या -L विकल्प के साथ प्रत्येक adb मंगलाचरण को समान मूल्य दें), जहाँ xxxx IP पता या होस्टनाम है उपकरणों के साथ मशीन, और 5037 उस पोर्ट से मेल खाती है जिसे आपने ऊपर कमांड में दिया था।

हम इसका उपयोग 3 मशीनों में फैले लगभग 100 एमुलेटर तक पहुँच देने के लिए करते हैं, जो समानांतर में परीक्षण समाप्त करने के लिए मशीन चला रहे हैं, और डेवलपर्स को दूर से वास्तविक डिवाइस साझा करना चाहते हैं।

आप आगे और अदब के साथ एमुलेटर से बंदरगाहों को अग्रेषित कर सकते हैं और रिवर्स रिवर्स कर सकते हैं, और वे यंत्रों के साथ मशीन पर दिखाई देंगे (न कि वह मशीन जिसे आप 'अदब फॉरवर्ड' से चला रहे हैं)।


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

@ डॉन-प्रोग आप यह नहीं कहते हैं कि यह कमांड-लाइन से आपके लिए काम करता है: adb -L tcp:remotehost:1234 devicesयदि यह करता है, तो आपको यह पता लगाने की आवश्यकता है कि एंड्रॉइड स्टूडियो दूरस्थ एडीबी का समर्थन करता है या नहीं - यह मुझे आश्चर्यचकित नहीं करेगा अगर यह उपयोग करने पर जोर देता है स्थानीय उपकरण।
Android.weasel

0

मेरे पास हाथ में एसडीके के साथ दूसरी मशीन नहीं है, लेकिन मैं ध्यान देता हूं कि एमुलेटर के पोर्ट्स (डिफ़ॉल्ट 5554, 5555) सुन रहे हैं 0.0.0.0, यानी रिमोट मशीनों से पहुंच योग्य है, और यह adb --helpएक connect <host>:<port>कमांड दिखाता है । मुझे लगता है कि ऐसा लगता है कि यह आदेश में adb devicesइस adbपर काम करेंगे। ग्रहण के लिए, "रन / रन कॉन्फ़िगरेशन ..." का प्रयास करें और लक्ष्य को मैनुअल पर सेट करें। यदि आप एक "डिवाइस चयनकर्ता" जो मुझे लगता है कि एक दूरस्थ एमुलेटर शामिल होगा अगर अदब इसे से जुड़ा हुआ है देता है। एक कोशिश के काबिल है।

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