commit | 86df89e763cf20898da6eb37e9b4384bd341dd56 | [log] [tgz] |
---|---|---|
author | Dmitrii Merkurev <dimorinny@google.com> | Sat Dec 02 02:04:38 2023 +0000 |
committer | Dmitrii Merkurev <dimorinny@google.com> | Sat Dec 02 02:04:38 2023 +0000 |
tree | f7ea9ac50b799fbb68d4f90ea90eeae330fb0dbd | |
parent | 3bd76da0fef321a740aa4522d6da7be5910978a1 [diff] |
Make sure proxy child threads are finished when proxying is done Currently socket_vsock_proxy is a long-living process that observes the kernel events and starts or stops a proxy thread depending on them. This proxy thread is listening for incoming connections and spawning 2 copying threads for every such connection: 1. Client to target copying 2. Target to client copying But when the main proxy thread is ended there is a possibility that copying threads are still alive and continue work with previously connected clients which may affect the adb / fastboot functionality. In our case the following may happen: 1. CVD is booted into fastboot 2. Fastboot socket_vsock_proxy establish proxying 6520 <-> fastboot_ethernet 3. CVD is re-booted into Android 4. Adb socket_vsock_proxy is started to proxy 6520 <-> adb_vsock, but old fastboot copying threads are still alive (even though fastboot proxy thread is finished), so adb daemon may reuse the old connection, which proxying to the wrong target. This problem is mainly reproducible with acloud remote device following the: 1. Boot cvd 2. Reboot into fastbootd 3. Reboot into Android again Then adb device will be offline before we call adb disconnect && adb connect. Just calling adb connect wouldn't help since it will not open a new connection because existing one is alive. To fix that, 1. Allowed FileInstance::CopyAllFrom to be interrupted by event fd and reused stop_fd_, so all copying threads will be interrupted together with the main thread 2. Introduced ProxyPair entity which allows us to keep track of active and finished copying threads Bug: 303236495 Test: atest FastbootRebootTest --rerun-until-failure 100 with a local cvd / remote acloud Test: 500 runs of FastbootRebootTest using abtd on acloud Change-Id: I3bf9ead5b988f0d928681cb3d125b0111506445f Signed-off-by: Dmitrii Merkurev <dimorinny@google.com>
Make sure virtualization with KVM is available.
grep -c -w "vmx\|svm" /proc/cpuinfo
This should return a non-zero value. If running on a cloud machine, this may take cloud-vendor-specific steps to enable. For Google Compute Engine specifically, see the GCE guide.
ARM specific steps:
/dev/kvm
. Note that this method can also be used to confirm support of KVM on any environment.Download, build, and install the host debian packages:
sudo apt install -y git devscripts config-package-dev debhelper-compat golang curl git clone https://github.com/google/android-cuttlefish cd android-cuttlefish for dir in base frontend; do cd $dir debuild -i -us -uc -b -d cd .. done sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f sudo usermod -aG kvm,cvdnetwork,render $USER sudo reboot
The reboot will trigger installing additional kernel modules and applying udev rules.
Go to http://ci.android.com/
Enter a branch name. Start with aosp-main
if you don‘t know what you’re looking for
Navigate to aosp_cf_x86_64_phone
and click on userdebug
for the latest build
aosp-main-throttled
and device target aosp_cf_arm64_only_phone-trunk_staging-userdebug
Click on Artifacts
Scroll down to the OTA images. These packages look like aosp_cf_x86_64_phone-img-xxxxxx.zip
-- it will always have img
in the name. Download this file
Scroll down to cvd-host_package.tar.gz
. You should always download a host package from the same build as your images.
On your local system, combine the packages:
mkdir cf cd cf tar xvf /path/to/cvd-host_package.tar.gz unzip /path/to/aosp_cf_x86_64_phone-img-xxxxxx.zip
Launch cuttlefish with:
$ HOME=$PWD ./bin/launch_cvd
You can use adb
to debug it, just like a physical device:
$ ./bin/adb -e shell
When launching with ---start_webrtc
(the default), you can see a list of all available devices at https://localhost:8443
. For more information, see the WebRTC on Cuttlefish documentation.
You will need to stop the virtual device within the same directory as you used to launch the device.
$ HOME=$PWD ./bin/stop_cvd