การแก้ไขปัญหา ADB“ รออุปกรณ์”


9

เรากำลังตั้งค่าเซิร์ฟเวอร์รวมอย่างต่อเนื่องสำหรับการพัฒนา Android ของเราและเรากำลังพบปัญหาเกี่ยวกับอุปกรณ์ของ ADB อย่างรวดเร็ว

สำหรับบันทึกที่เราได้พยายามแล้วเป็นจำนวนมากของการรวมกันของadb kill-server, adb start-server, adb devicesฯลฯ จะไม่มีประโยชน์

น่าเสียดายที่สิ่งที่ฉันพบบนอินเทอร์เน็ตคือรูปแบบของ "ถอดปลั๊กและถอดปลั๊กอุปกรณ์" ซึ่งเห็นได้ชัดว่าไม่ใช่วิธีแก้ปัญหาสำหรับเรา (เราไม่สามารถให้คนนั่งบนเซิร์ฟเวอร์ CI เพื่อถอดปลั๊กและถอดปลั๊กอุปกรณ์ก่อน แต่ละบิลด์)

ในฐานะที่เป็นพื้นหลังเราใช้ Jenkins บน Mac เนื่องจากใช้ CI สำหรับ iOS ด้วย

ในขณะที่เข้าใกล้ปัญหาฉันคิดว่าถ้าในระดับระบบปฏิบัติการพบอุปกรณ์นั่นเป็นจุดเริ่มต้นอย่างน้อย ที่จริงแล้วการรันคำสั่งเช่นsystem_profiler SPUSBDataTypeค้นหาอุปกรณ์ได้สำเร็จรวมถึงหมายเลขซีเรียลที่ ADB รายงานเมื่อทำงานอย่างถูกต้อง

ฉันได้ลองคำสั่งที่ค่อนข้างง่อยเพื่อ "รีเฟรช" กิจกรรม USB ทั้งหมด แต่ฉันไม่ไปไหนเลย ไม่ใช่ว่าคุณสามารถเมานต์ / เลิกเมานท์อุปกรณ์ได้ แต่ตามจริงแล้วฉันไม่แน่ใจด้วยซ้ำว่าปัญหาอยู่ที่ไหนฉันไม่รู้จักพอเกี่ยวกับโปรโตคอล USB ระดับต่ำ การซุ่มโจมตีของซอร์สโค้ด ADBของฉันนั้นเป็นช็อตที่ยาวมาก ๆ

ดังนั้น ณ จุดนี้ฉันยินดีรับฟังวิธีแก้ปัญหาที่จะช่วยให้เราใช้ Android อย่างสม่ำเสมอบนเซิร์ฟเวอร์ CI ของเรา ไม่ว่าจะเป็นคำสั่งไม่กี่คำก่อนงานของ Jenkins, การติดตั้ง ADB หรือเคล็ดลับมายากลดำอื่น ๆ

คำตอบ:


9

พบวิธีแก้ปัญหาดังนั้นโพสต์ที่นี่เพื่อความสมบูรณ์ โปรดทราบว่าฉันไม่ได้บอกว่านี่เป็นวิธีที่ดีที่สุดในการแก้ปัญหา แต่มันก็ได้ผลสำหรับเรา

ดังนั้นเราจึงตระหนักถึงปัญหาที่เกิดขึ้นหลังจากไม่มีการใช้งาน CI เป็นระยะเวลานาน (ในช่วงชั่วโมง) ดังนั้นเราจึงสร้างสคริปต์ง่าย ๆ ที่เรียกใช้adb devicesทุกๆ 10 วินาที และปัญหาจะหายไปไม่มีปัญหา "รออุปกรณ์" อีกต่อไป

บน Linux คุณสามารถทำสิ่งนี้ได้ด้วยcronงานง่าย ๆและบน OSX ด้วยlaunchctlและฉันแน่ใจว่ามี Windows ที่เทียบเท่า

ไม่ว่าจะ "กระตุก" อุปกรณ์ทุก ๆ 10 วินาทีแก้ไขให้เรา


1
ขอบคุณ! ดูเหมือนว่าฉันกำลังมีปัญหาเดียวกัน การถอดและเสียบสายเคเบิล USB กลับทำให้อุปกรณ์แสดงในรายการ
Jorge Pedret

5

การเปิดใช้งานการแก้ไขข้อบกพร่อง USB (การตั้งค่า => ตัวเลือกนักพัฒนา) ในโทรศัพท์ช่วย


1

เรามีปัญหาที่คล้ายกันกับสภาพแวดล้อมการรวมอย่างต่อเนื่องของเรากับอุปกรณ์ Android จากเครื่อง OSX (ใช้ทั้ง iOS และ Android)

ฉันเชื่อว่าปัญหาคือคุณอนุญาตให้เจนกินส์เริ่มต้นเซิร์ฟเวอร์ adb ปัญหาที่เกิดขึ้นเพราะงาน Jenkins เกี่ยวข้องกับกระสุนที่เข้ามาและออกจากการดำรงอยู่ หากเจนกินส์เริ่มต้นการเรียก adb daemon ด้วยการเรียก "อุปกรณ์ adb" (ตัวอย่าง) adb daemon จะเป็นเจ้าของโดยเชลล์เจนกินส์ที่มีอายุสั้นและเมื่อเชลล์นั้นเสร็จสิ้นการดำเนินการและปิด adb daemon จะถูกล้างออก จนกว่าจะเริ่มการสำรองข้อมูลอัตโนมัติโดยการเรียก adb อื่น สิ่งนี้ส่งผลให้วงจรของการเริ่มต้นและหยุด adb daemon แต่สิ่งที่คุณต้องการคือมันจะอยู่ต่อไปเรื่อย ๆ

วิธีหนึ่งในการแก้ไขปัญหานี้คือเพียงเรียกใช้ "อุปกรณ์ adb" จากเชลล์ที่เปิดทิ้งไว้บนเครื่อง CI คุณสามารถบอกได้ว่ามันเป็นกระบวนการหลักโดยไม่ว่าข้อความนี้จะปรากฏขึ้นหลังจากทำงาน

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

นี่เป็นขั้นตอนที่น่ารำคาญที่ต้องทำทุกครั้งที่เครื่องรีสตาร์ทและถ้าใครก็ตามปิดหน้าต่างคำสั่งนั้นคุณจะกลับไปสู่ปัญหาก่อนหน้า

ในทางทฤษฎีแล้ววิธีที่ดีกว่าคือการสร้างไฟล์. plist เพื่อเรียก adb daemon เมื่อ bootup นี่คือตัวอย่าง: ~ / Library / LaunchAgents / server.adb.plist สิ่งนี้เพียงแค่เรียกใช้ adb start-server จากผู้ใช้ launch daemon เพื่อหลีกเลี่ยง Jenkins จากการเป็นเจ้าของ

<?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 ในโหมด "daemon" ดังนั้นมันจะไม่ส่งคืนดังนั้นกลไกการเปิดใช้งานนี้สามารถตั้งค่าให้รีสตาร์ทโดยอัตโนมัติหากมันตายดังนั้นจึงมั่นใจได้ว่าเจนกินส์ไม่ได้เป็นเจ้าของ โอ้ดีสำหรับตอนนี้ฉันจะใช้ "อุปกรณ์ adb" ในหน้าต่าง shell และเปิดทิ้งไว้


1

ฉันแก้ไขปัญหานี้โดยใช้รางปลั๊กไฟที่ตั้งโปรแกรมได้เพื่อรีบูตฮับ usb ก่อนการทดสอบแต่ละครั้ง สิ่งนี้ทำเช่นเดียวกับการถอดและเสียบสายเคเบิล USB กลับเข้ามา


คุณช่วยอธิบายเพิ่มอีกได้ไหม
Dinesh

1

ฉันแค่อยากจะติดตามข้อเสนอแนะที่ดีเยี่ยมโดยJuan-เดลกาโด ฉันพบใน MacOS High Sierra ที่ทำงานadbทุก ๆ 10 วินาทีด้วยwatchคำสั่งก็มีประสิทธิภาพเช่นเดียวกับวิธีแก้ปัญหาอย่างรวดเร็ว:

watch -n 10 adb -d devices

สิ่งนี้ทำให้ฉันก้าวเท้าเลี่ยงการสร้าง.plistไฟล์ แต่ข้อเสียเปรียบที่เห็นได้ชัดคือมันไม่ใช่วิธีแก้ปัญหาถาวร watchคำสั่งที่มีอยู่ในรุ่นก่อนหน้าของ OSX ดังนั้นจึงควรที่จะมีประสิทธิภาพมีเช่นกัน


ฉันไม่ได้มีwatchใน MacOS Catalina brew install watchแต่ก็สามารถที่จะติดตั้งได้อย่างง่ายดายด้วย
mokagio

0

แก้ไขได้ที่นี่โดยเปลี่ยนสาย USB


คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้ไหม?
Donald Duck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.