นี่คือชุดของสคริปต์ขั้นต่ำเพื่อเรียกใช้อีมูเลเตอร์ในคอนเทนเนอร์สำหรับระบบต่าง ๆ เช่น Docker สำหรับการบริโภคภายนอก สคริปต์เข้ากันได้กับทั้ง Python เวอร์ชัน 2 และ 3
*โปรดทราบว่านี่ยังคงเป็นคุณสมบัติการทดลองและเราขอแนะนำให้ติดตั้งเครื่องมือนี้ในสภาพแวดล้อมเสมือนจริงของ Python โปรดยื่นปัญหาหากคุณสังเกตเห็นว่าสิ่งใดไม่ทำงานตามที่คาดไว้
การสาธิตเหล่านี้มีจุดประสงค์เพื่อให้ทำงานบน Linux OS ระบบของคุณต้องเป็นไปตามข้อกำหนดดังต่อไปนี้:
ต้องติดตั้งล่าม Python (Python3 พร้อม Python3-Venv เพื่อสร้างสภาพแวดล้อมเสมือนจริง)
ADB จะต้องมีอยู่บนเส้นทาง ADB มาเป็นส่วนหนึ่งของ Android SDK โปรดทราบว่าการติดตั้งเครื่องมือบรรทัดคำสั่งนั้นเพียงพอแล้ว
ต้องติดตั้งนักเทียบท่า ตรวจสอบให้แน่ใจว่าคุณสามารถเรียกใช้เป็นผู้ใช้ที่ไม่ใช่รูท
ต้องติดตั้ง compose นักเทียบท่า
ต้องมี KVM คุณสามารถเข้าถึง KVM ได้โดยใช้ "Bare Metal" หรือบนเครื่อง (เสมือน) ที่ให้การจำลองเสมือนจริง หากคุณวางแผนที่จะเรียกใช้สิ่งนี้ในคลาวด์ (GCE/Azure/AWS/etc .. ) ก่อนอื่นคุณต้องแน่ใจว่าคุณสามารถเข้าถึง KVM ได้ รายละเอียดเกี่ยวกับวิธีการเข้าถึง KVM บนผู้ให้บริการคลาวด์ต่างๆสามารถพบได้ที่นี่:
โปรดทราบว่าคุณจะเห็นประสิทธิภาพที่ลดลงหากคุณใช้ประโยชน์จากการจำลองเสมือนจริง คอนเทนเนอร์ได้รับการทดสอบภายใต้ Debian และ Ubuntu Running เคอร์เนล 5.2.17
หมายเหตุ: รูปภาพจะไม่ทำงานใน Docker บน Mac หรือ Windows
ตอนนี้เราโฮสต์ชุดคอนเทนเนอร์ในที่เก็บสาธารณะ คุณสามารถค้นหารายละเอียดเกี่ยวกับคอนเทนเนอร์ได้ที่นี่ ตอนนี้คุณสามารถเรียกใช้ภาชนะเหล่านี้ได้โดยไม่ต้องสร้าง ตัวอย่างเช่น:
docker run
-e ADBKEY= " $( cat ~ /.android/adbkey ) "
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp
us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
สิ่งนี้จะดึงคอนเทนเนอร์ลงหากไม่มีในท้องถิ่นและเปิดใช้งาน คุณจะเห็นว่ากำลังเริ่มต้น:
หลังจากนี้คุณสามารถเชื่อมต่อกับอุปกรณ์ได้โดยกำหนดค่า ADB:
adb connect localhost:5555
ตอนนี้อุปกรณ์ควรปรากฏขึ้นหลังจากนั้นไม่นาน:
$ adb devices
List of devices attached
localhost:5555 device
หากคุณต้องการใช้สิ่งนี้ในสคริปต์คุณสามารถทำสิ่งต่อไปนี้:
docker run -d
-e ADBKEY= " $( cat ~ /.android/adbkey ) "
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp
us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
adb connect localhost:5555
adb wait-for-device
# The device is now booting, or close to be booted
สคริปต์ที่มีรายละเอียดเพิ่มเติมสามารถพบได้ใน run-in-script-example.sh
คุณสามารถติดตั้งแพ็คเกจ Python ได้ดังนี้:
source ./configure.sh
สิ่งนี้จะเปิดใช้งานสภาพแวดล้อมเสมือนจริงและทำให้ emu-docker
สามารถใช้งานได้ คุณสามารถรับข้อมูลรายละเอียดเกี่ยวกับการใช้งานได้โดยเปิดตัวดังนี้:
emu-docker -h
คุณจะต้องยอมรับข้อตกลงใบอนุญาตก่อนที่คุณจะสามารถสร้างคอนเทนเนอร์ Docker
คุณสามารถเลือก Android และ Emulator เวอร์ชันใดที่คุณต้องการใช้โดย Running:
emu-docker interactive --start
คุณจะถูกขอให้เลือกภาพระบบและเวอร์ชัน Emulator หลังจากนั้นจะสร้างไฟล์ Docker ภาพระบบและตัวจำลองจะถูกดาวน์โหลดไปยังไดเรกทอรีปัจจุบันหากจำเป็น สคริปต์จะให้คำสั่งแก่คุณเพื่อดูบันทึกรวมถึงคำสั่งเพื่อหยุดคอนเทนเนอร์
หากเซิร์ฟเวอร์ ADB ในพื้นที่ตรวจพบคอนเทนเนอร์ที่เริ่มต้นโดยอัตโนมัติคุณไม่มีอะไรจะทำเพื่อสอบถามผ่าน ADB หากไม่เป็นเช่นนั้นคุณสามารถเชื่อมต่อกับอุปกรณ์ที่ทำงานโดยใช้ ADB:
adb connect localhost:5555
ในการตรวจสอบว่า ADB ได้เห็นคอนเทนเนอร์คุณสามารถใช้::
adb devices
คำสั่งและตรวจสอบว่าตรวจพบอุปกรณ์หรือไม่
อย่าลืมหยุดคอนเทนเนอร์ Docker เมื่อคุณทำเสร็จแล้ว!
อ่านส่วนเกี่ยวกับการทำให้ Emulator พร้อมใช้งานบนเว็บเพื่อเรียกใช้ Emulator โดยใช้ WEBRTC
การออก:
emu-docker list
จะสอบถาม URL Android SDK และเอาต์พุตที่เผยแพร่ในปัจจุบันสำหรับไฟล์ zip ของ:
สำหรับแต่ละภาพระบบระดับ API ตัวแปร ABI และ URL จะปรากฏขึ้น สำหรับตัวจำลองแต่ละตัวช่องอัปเดต (เสถียร vs คานารี) เวอร์ชันระบบปฏิบัติการโฮสต์และ URL จะปรากฏขึ้น
ตัวอย่างเอาต์พุต:
SYSIMG android 21 L x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-21_r05.zip
SYSIMG android 22 L x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-22_r06.zip
SYSIMG android 23 M x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-23_r10.zip
SYSIMG android 24 N x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-24_r08.zip
SYSIMG android 25 N x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-25_r01.zip
SYSIMG android 26 O x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-26_r01.zip
SYSIMG android 27 O x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-27_r01.zip
SYSIMG android 28 P x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-28_r04.zip
SYSIMG android 28 Q x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-Q_r04.zip
SYSIMG google_apis 21 L x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-21_r30.zip
SYSIMG google_apis 22 L x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-22_r24.zip
SYSIMG google_apis 23 M x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-23_r31.zip
SYSIMG google_apis 24 N x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-24_r25.zip
SYSIMG google_apis 25 N x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-25_r16.zip
SYSIMG google_apis 26 O x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-26_r13.zip
SYSIMG google_apis 28 P x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-28_r09.zip
SYSIMG google_apis 28 Q x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-Q_r04.zip
SYSIMG google_apis_playstore 28 P x86_64 https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86_64-28_r08.p
SYSIMG google_apis_playstore 28 Q x86_64 https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86_64-Q_r04.zp
EMU stable 29.0.11 windows https://dl.google.com/android/repository/emulator-windows-5598178.zip
EMU stable 29.0.11 macosx https://dl.google.com/android/repository/emulator-darwin-5598178.zip
EMU stable 29.0.11 linux https://dl.google.com/android/repository/emulator-linux-5598178.zip
EMU stable 28.0.25 windows https://dl.google.com/android/repository/emulator-windows-5395263.zip
EMU canary 29.0.12 windows https://dl.google.com/android/repository/emulator-windows-5613046.zip
EMU canary 29.0.12 macosx https://dl.google.com/android/repository/emulator-darwin-5613046.zip
EMU canary 29.0.12 linux https://dl.google.com/android/repository/emulator-linux-5613046.zip
จากนั้นสามารถใช้เครื่องมือเช่น wget
หรือเบราว์เซอร์เพื่อดาวน์โหลดตัวจำลองและภาพระบบที่ต้องการ หลังจากได้รับทั้งสองแล้วเราสามารถสร้างภาพนักเทียบท่าได้
จากไฟล์ emulator zip และไฟล์ image image image system เราสามารถสร้างไดเรกทอรีที่สามารถส่งไปยัง docker build
ผ่านการเรียกใช้ emu-docker
ต่อไปนี้:
emu-docker create <emulator-zip> <system-image-zip> [--dest docker-src-dir
(getcwd()/src by default)]
สิ่งนี้เป็นองค์ประกอบที่เหมาะสมทั้งหมดในการเรียกใช้อิมเมจนักเทียบท่า แต่ยังไม่ได้สร้างเรียกใช้หรือเผยแพร่ ต้องใช้ไฟล์ซิป Linux Emulator
ในการสร้างอิมเมจนักเทียบท่าที่สอดคล้องกับอีมูเลเตอร์และภาพระบบเหล่านี้:
docker build <docker-src-dir, either ./src or specified argument to
emu_docker.py>
ID Image Image จะส่งออก บันทึก ID ภาพนี้
ขณะนี้เราสันนิษฐานว่า KVM จะถูกใช้กับ Docker เพื่อให้ความสามารถในการจำลองเสมือน CPU กับภาพ Docker ที่เกิดขึ้น
เราให้สคริปต์รันต่อไปนี้:
./run.sh <docker-image-id> <additional-emulator-params>
มันทำดังต่อไปนี้:
docker run -e ADBKEY="$(cat ~/.android/adbkey)"
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp <docker-image-id>
--device /dev/kvm
เพื่อให้มีการเร่งความเร็ว CPUหมายเหตุ: คุณสามารถใช้ ADBKEY สาธารณะได้โดยการฉีดตัวแปร ADBKEY_PUB เช่น: -E ADBKEY_PUB = "$ (CAT ~/.ANDROID/ADBKEY.PUB)"
นอกจากนี้คุณยังมีตัวเลือกในการติดตั้งพาร์ติชัน A /Data ซึ่ง Emulator จะใช้ถ้ามี สิ่งนี้ช่วยให้คุณสามารถใช้ TMPFs ซึ่งสามารถให้ประสิทธิภาพที่เพิ่มขึ้นโดยเฉพาะอย่างยิ่งในสถานการณ์การจำลองเสมือนจริงที่ซ้อนกัน
ตัวอย่างเช่น:
docker run -e ADBKEY="$(cat ~/.android/adbkey)"
--device /dev/kvm
--mount type=tmpfs,destination=/data
--publish 8554:8554/tcp
--publish 5555:5555/tcp <docker-image-id>
ขณะนี้เรารองรับการเร่งความเร็วฮาร์ดแวร์สำหรับ Nvidia เท่านั้น เพื่อใช้ประโยชน์จากการเร่งความเร็วของฮาร์ดแวร์คุณอาจต้องติดตั้งส่วนขยายของ Nvidia Docker จากที่นี่หากคุณใช้ Docker รุ่นเก่า (<19.03) คุณต้องตรวจสอบให้แน่ใจว่าคุณมีการติดตั้ง X ขั้นต่ำหากคุณใช้อินสแตนซ์คลาวด์ ตัวอย่างเช่น XVFB สามารถใช้งานได้ คุณต้องสร้างคอนเทนเนอร์โดยผ่านในธง -GPU:
emu-docker create stable Q --gpu
ตอนนี้คุณสามารถเปิดตัว Emulator ด้วยสคริปต์ run-with-gpu.sh
:
./run-with-gpu.sh <docker-image-id> <additional-emulator-params>
สคริปต์คล้ายกับที่อธิบายไว้ข้างต้นด้วยการเพิ่มว่ามันจะ:
--gpu all
)การเร่งความเร็วของฮาร์ดแวร์จะช่วยปรับปรุงประสิทธิภาพของแอปพลิเคชันที่พึ่งพากราฟิกอย่างมาก โปรดทราบว่าแม้ว่าเราต้องการเซิร์ฟเวอร์ X11 สำหรับการเร่งความเร็ว GPU แต่ก็ไม่มีการแสดง UI
คุณสามารถกดรูปภาพที่สร้างขึ้นไปยังที่เก็บข้อมูลได้โดยการจัดหาพารามิเตอร์ -แบบพุชและ -Repo และ -แท็กเมื่อสร้างภาพ พารามิเตอร์ -แท็กเป็นตัวเลือกและใช้เพื่อระบุเวอร์ชันของภาพที่สร้างขึ้น สิ่งนี้จะเริ่มต้นเป็น build-id ของ emulator เนื่องจากภาพระบบไม่ค่อยได้รับการอัปเดต
เราใช้รูปแบบการตั้งชื่อต่อไปนี้สำหรับรูปภาพ:
{api}-{sort}-{abi}
ที่ไหน:
ตัวอย่างเช่น: 29-playstore-x86: 30.1.2 หมายถึงรูปภาพระบบที่เปิดใช้งาน playstore พร้อมกับ Q ทำงานบน 32-bit x86
ตัวอย่างการเรียกใช้สำหรับการเผยแพร่รูปภาพ Q ทั้งหมดไปยัง Google Cloud Repo อาจเป็นได้:
emu-docker -v create --push --repo us.gcr.io/emulator-project/ stable " Q "
รูปภาพที่ถูกผลักไปยังที่เก็บสามารถเปิดตัวได้โดยตรงจากที่เก็บ ตัวอย่างเช่น:
docker run --device /dev/kvm --publish 8554:8554/tcp --publish 5555:5555/tcp
us.gcr.io/emulator-project/29-playstore-x86:30.1.2
เราส่งต่อพอร์ต 5555 สำหรับการเข้าถึง ADB ไปยังตัวจำลองที่ทำงานภายในคอนเทนเนอร์ ADB อาจไม่ตรวจจับอุปกรณ์โดยอัตโนมัติดังนั้นเรียกใช้:
adb connect localhost:5555
อุปกรณ์ของคุณควรแสดงเป็น:
$ adb devices
List of devices attached:
localhost:5555 device
ที่เก็บนี้ยังมีตัวอย่างที่แสดงให้เห็นว่าคุณสามารถใช้ Docker เพื่อให้ Emulator สามารถเข้าถึงได้ผ่านเว็บ สิ่งนี้ทำได้โดยการเขียนชุดคอนเทนเนอร์ Docker ต่อไปนี้:
ในการเรียกใช้ตัวอย่างนี้และสามารถโต้ตอบกับตัวจำลองคุณต้องจำไว้ในใจ:
คุณจะต้องใช้ compose นักเทียบท่า
คุณต้องมีพอร์ต 80 และ 443 คอนเทนเนอร์ Docker จะสร้างเครือข่ายภายในและเปิดเผยพอร์ต HTTP และ HTTPS
คุณจะต้องสร้างอิมเมจนักเทียบท่าอีมูเลเตอร์ตามที่อธิบายไว้ในเอกสารข้างต้น
ขึ้นอยู่กับเครือข่ายของคุณคุณอาจต้องเลี้ยว
ขณะนี้เราใช้ Firebase เพื่อจัดการการรับรองความถูกต้องและการอนุญาต คุณจะต้องจัดให้มีการกำหนดค่า JSON ของโครงการที่คุณต้องการใช้ คุณสามารถใช้ตัวอย่างที่ให้ไว้ที่นี่ แต่มันจะใช้ได้เฉพาะกับ LocalHost คุณสามารถรับการกำหนดค่า firebase จากคอนโซลวางการกำหนดค่า Firebase JOSN ได้ที่นี่:
./js/firebase_config.json
สิ่งนี้จะถูกใช้เพื่อสร้างการตั้งค่าและการตั้งค่าทูต
ในการสร้างเว็บคอนเทนเนอร์คุณต้องมีเครื่องมือต่อไปนี้:
ถัดไปคุณต้องสร้างคอนเทนเนอร์ด้วยเวอร์ชัน Emulator & System Image ที่คุณต้องการใช้ ตัวอย่างเช่น:
. ./configure.sh && emu-docker create canary "P.*x86_64"
เมื่อคุณดูแลขั้นตอนด้านบนแล้วคุณสามารถสร้างคอนเทนเนอร์โดยใช้สคริปต์ create_web_container.sh
:
$ ./create_web_container.sh -h
usage: create_web_container.sh [-h] [-a] [-s] [-i] -p user1,pass1,user2,pass2,...
optional arguments:
-h show this help message and exit.
-a expose adb. Requires ~ /.android/adbkey.pub to be available at run.
-s start the container after creation.
-i install systemd service, with definition in /opt/emulator
ตัวอย่างเช่น:
./create_web_container.sh
สิ่งนี้จะทำดังต่อไปนี้:
ตอนนี้คุณสามารถเปิดคอนเทนเนอร์ได้ดังนี้:
docker-compose -f js/docker/docker-compose.yaml up
หากคุณต้องการให้ ADB พร้อมใช้งานคุณสามารถใช้การซ้อนทับที่พบใน JS/Docker/Development.yaml ดังต่อไปนี้:
docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yaml up
ชี้เบราว์เซอร์ของคุณไปที่ LocalHost คุณอาจได้รับคำเตือนเนื่องจากการใช้ใบรับรองที่ลงนามในตัวเอง เมื่อคุณยอมรับใบรับรองคุณควรจะสามารถเข้าสู่ระบบและเริ่มใช้ตัวจำลอง
โปรดจำสิ่งต่อไปนี้เมื่อคุณทำให้ตัวจำลองสามารถเข้าถึงได้ผ่าน ADB:
~/.android/adbkey
นี่คือคีย์ ส่วนตัว ที่ใช้โดย ADB หากไม่มีสิ่งนี้คุณจะไม่สามารถเข้าถึงอุปกรณ์ผ่าน ADB ได้adb connect ip-address-of-container:5555
ก่อนที่คุณจะสามารถโต้ตอบกับอุปกรณ์ได้ ตัวอย่างเช่น: $ adb connect localhost:5555
$ adb shell getprop
มีสคริปต์ตัวอย่างคลาวด์อินทิทที่ให้รายละเอียดเกี่ยวกับวิธีการกำหนดค่าอินสแตนซ์ที่จะเปิดตัวและกำหนดค่าอีมูเลเตอร์โดยอัตโนมัติในการสร้าง รายละเอียดเกี่ยวกับวิธีการทำสิ่งนี้สามารถพบได้ที่นี่
เรามีเอกสารแยกต่างหากที่เกี่ยวข้องกับการจัดการกับปัญหา
รายละเอียดเกี่ยวกับการออกแบบและวิธีการแก้ไขแอปพลิเคชัน React สามารถพบได้ที่นี่