aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-16 16:37:31 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-05-16 16:37:31 +0000
commit2c0731cb00a1c3d9794c297b80c0f2337d3d0722 (patch)
treee7d85b7ac6fba07b2eeb3fe950cf88e31ff55dcc
parent2a95e5051da364ab2fa0624de9ab2f2c8b37aa9e (diff)
parent2baf767bcfc40250a071fda52f7431b4c356986d (diff)
downloadqemu-emu-35-1-release.tar.gz
Merge "Snap for 11848231 from d8932dc352a181adbb4f7e0ca99900909a4c3f60 to emu-35-1-release" into emu-35-1-releaseemu-35-1-release
-rw-r--r--android-qemu2-glue/main.cpp2
-rw-r--r--android/android-emu/android/emulation/resizable_display_config.cpp24
-rw-r--r--android/android-emu/android/emulation/resizable_display_config.h2
-rw-r--r--android/android-emu/android/hw-sensors.cpp5
-rw-r--r--android/android-emu/android/physics/FoldableModel.cpp3
-rw-r--r--android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp10
-rw-r--r--android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp35
-rw-r--r--android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp7
-rw-r--r--android/build/cmake/config.toml.in3
-rw-r--r--android/build/cmake/config/emu-qt5-config.cmake64
-rw-r--r--android/build/cmake/config/emu-vulkan-config.cmake15
-rw-r--r--android/build/cmake/rust/crates/redox_syscall2/Cargo.toml3
-rw-r--r--android/build/cmake/rust/crates/redox_syscall2/src/lib.rs0
-rw-r--r--android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile83
-rw-r--r--android/build/python/aemu/prebuilts/qt.py135
-rw-r--r--android/third_party/boringssl/CMakeLists.txt20
-rw-r--r--mac.source.properties2
-rw-r--r--source.properties2
-rw-r--r--win.source.properties2
19 files changed, 283 insertions, 134 deletions
diff --git a/android-qemu2-glue/main.cpp b/android-qemu2-glue/main.cpp
index ccfba68d72..5e5f26d5e0 100644
--- a/android-qemu2-glue/main.cpp
+++ b/android-qemu2-glue/main.cpp
@@ -377,7 +377,7 @@ static void prepareSkinConfig(AndroidHwConfig* hw, const char* dataDirectory) {
if (android_foldable_is_pixel_fold()) {
const char* skin = nullptr;
if (((hw->hw_device_name &&
- "pixel_fold" == std::string(hw->hw_device_name)) ||
+ !strncmp("pixel_fold",hw->hw_device_name, 10)) ||
resizableEnabled34())) {
skin = "pixel_fold";
} else {
diff --git a/android/android-emu/android/emulation/resizable_display_config.cpp b/android/android-emu/android/emulation/resizable_display_config.cpp
index 9ba5e862ed..9d08ce518f 100644
--- a/android/android-emu/android/emulation/resizable_display_config.cpp
+++ b/android/android-emu/android/emulation/resizable_display_config.cpp
@@ -30,6 +30,7 @@
#include "host-common/opengles.h"
#include "studio_stats.pb.h"
+#include <atomic>
#include <map>
using android::metrics::MetricsReporter;
@@ -220,11 +221,21 @@ public:
mMetricsRegistered = true;
}
+ bool isTransitionInProgress() const {
+ bool result = mTransitionInProgress.load(std::memory_order_relaxed);
+ return result;
+ }
+
+ void setTransitionInProgress(int inProgress) {
+ mTransitionInProgress.store(inProgress, std::memory_order_relaxed);
+ }
+
private:
std::map<PresetEmulatorSizeType, PresetEmulatorSizeInfo> mConfigs;
PresetEmulatorSizeType mActiveConfigId = PRESET_SIZE_MAX;
std::map<PresetEmulatorSizeType, uint32_t> mTypeCount;
bool mMetricsRegistered = false;
+ std::atomic<bool> mTransitionInProgress{false};
};
static android::base::LazyInstance<ResizableConfig> sResizableConfig =
@@ -254,6 +265,19 @@ void updateAndroidDisplayConfigPath(enum PresetEmulatorSizeType id) {
android::emulation::sResizableConfig->updateAndroidDisplayConfigPath(id);
}
+bool isResizableTransitionInProgress() {
+ if (!resizableEnabled())
+ return false;
+
+ return android::emulation::sResizableConfig->isTransitionInProgress();
+}
+
+void setResizableTransitionInProgress(bool inProgress) {
+ if (!resizableEnabled())
+ return;
+ android::emulation::sResizableConfig->setTransitionInProgress(inProgress);
+}
+
bool resizableEnabled34() {
const char* pconfigs =
getConsoleAgents()->settings->hw()->hw_resizable_configs;
diff --git a/android/android-emu/android/emulation/resizable_display_config.h b/android/android-emu/android/emulation/resizable_display_config.h
index 921841b183..caf6162f6e 100644
--- a/android/android-emu/android/emulation/resizable_display_config.h
+++ b/android/android-emu/android/emulation/resizable_display_config.h
@@ -32,6 +32,8 @@ struct PresetEmulatorSizeInfo {
int dpi;
};
+bool isResizableTransitionInProgress();
+void setResizableTransitionInProgress(bool inProgress);
bool resizableEnabled();
bool resizableEnabled34();
void resizableInit();
diff --git a/android/android-emu/android/hw-sensors.cpp b/android/android-emu/android/hw-sensors.cpp
index c6f2808654..13d6853b17 100644
--- a/android/android-emu/android/hw-sensors.cpp
+++ b/android/android-emu/android/hw-sensors.cpp
@@ -1412,6 +1412,9 @@ int android_foldable_pixel_fold_second_display_id() {
// We still need to discuss how to support foldable for secondary displays
bool android_foldable_hinge_enabled() {
+ if (isResizableTransitionInProgress()) {
+ return false;
+ }
return ((android_foldable_hinge_configured() ||
android_foldable_folded_area_configured(0) ||
android_foldable_rollable_configured()) &&
@@ -1532,7 +1535,7 @@ bool android_foldable_unfold() {
}
bool android_foldable_set_posture(int posture) {
- if (!android_foldable_hinge_configured()) {
+ if (!android_foldable_hinge_enabled()) {
return false;
}
struct FoldableState state;
diff --git a/android/android-emu/android/physics/FoldableModel.cpp b/android/android-emu/android/physics/FoldableModel.cpp
index c576b9ab1f..f4764834fb 100644
--- a/android/android-emu/android/physics/FoldableModel.cpp
+++ b/android/android-emu/android/physics/FoldableModel.cpp
@@ -424,6 +424,9 @@ void FoldableModel::setHingeAngle(uint32_t hingeIndex,
PhysicalInterpolation mode,
std::recursive_mutex& mutex) {
VLOG(foldable) << "setHingeAngle index " << hingeIndex << " degrees " << degrees;
+ if (!android_foldable_hinge_enabled()) {
+ return;
+ }
std::unique_lock<std::recursive_mutex> lock(mutex);
if (hingeIndex >= ANDROID_FOLDABLE_MAX_HINGES)
return;
diff --git a/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp b/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp
index 1c3eeb844c..2612eeeb91 100644
--- a/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp
+++ b/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp
@@ -51,23 +51,13 @@ namespace emugl {
static std::string libDir() {
return
pj({TestSystem::getProgramDirectoryFromPlatform(),
-#ifdef _WIN32
- // Windows uses mock Vulkan ICD.
- "testlib64"
-#else
"lib64", "vulkan"
-#endif
});
}
static std::string testIcdFilename() {
return pj(libDir(),
-#ifdef _WIN32
- // Windows uses mock Vulkan ICD.
- "VkICD_mock_icd.json"
-#else
"vk_swiftshader_icd.json"
-#endif
);
}
diff --git a/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp b/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp
index 429eff6322..25803e6ba7 100644
--- a/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp
+++ b/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp
@@ -690,20 +690,23 @@ public:
int cPixels = reply.image().size();
bool clientAvailable = !context->IsCancelled();
- if (clientAvailable) {
- auto status = getScreenshot(context, request, &reply);
- if (!status.ok()) {
- return status;
- }
-
- assert(reply.image().size() >= cPixels);
- cPixels = reply.image().size();
- clientAvailable = !context->IsCancelled() && writer->Write(reply);
- }
-
bool lastFrameWasEmpty = reply.format().width() == 0;
int frame = 0;
+ {
+ uint32_t width, height;
+ bool enabled = true;
+ bool multiDisplayQueryWorks = mAgents->emu->getMultiDisplay(
+ request->display(), nullptr, nullptr, &width, &height, nullptr,
+ nullptr, &enabled);
+ if (!enabled) {
+ return Status(
+ ::grpc::StatusCode::INVALID_ARGUMENT,
+ "Invalid display: " + std::to_string(request->display()),
+ "");
+ }
+ }
+
// TODO(jansen): Move to ScreenshotUtils.
std::unique_ptr<EventWaiter> frameEvent;
std::unique_ptr<RaiiEventListener<gfxstream::Renderer,
@@ -755,6 +758,10 @@ public:
AEMU_SCOPED_TRACE("streamScreenshot::frame\r\n");
frame += framesArrived; Stopwatch sw;
auto status = getScreenshot(context, request, &reply);
+ if (status.error_code() == grpc::StatusCode::FAILED_PRECONDITION) {
+ continue;
+ }
+
if (!status.ok()) {
return status;
}
@@ -972,7 +979,6 @@ public:
cPixels = img.getPixelCount();
} else { // Let's make a fast call to learn how many pixels we need
// to reserve.
- while (1) {
width = 0;
height = 0;
cPixels = 0;
@@ -981,10 +987,9 @@ public:
request->format(), rotation, newWidth, newHeight, pixels,
&cPixels, &width, &height, rect);
if (width > 0 && height > 0 && cPixels > 0) {
- break;
+ } else {
+ return Status(grpc::StatusCode::FAILED_PRECONDITION, "Unable to getScreenshot");
}
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- }
}
auto format = reply->mutable_format();
diff --git a/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp b/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp
index b76db16dc6..d4f332fa10 100644
--- a/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp
+++ b/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp
@@ -476,6 +476,9 @@ void ToolWindow::on_sleep_timer_done() {
emugl::setShouldSkipDraw(false);
android_redrawOpenglesWindow();
}
+ if (isResizableTransitionInProgress()) {
+ setResizableTransitionInProgress(false);
+ }
if (mSleepKeySent) {
mEmulatorWindow->getAdbInterface()->
enqueueCommand( {"shell", "input", "keyevent", "KEYCODE_WAKEUP"});
@@ -978,6 +981,9 @@ void ToolWindow::presetSizeAdvance(PresetEmulatorSizeType newSize) {
if (getResizableActiveConfigId() == newSize) {
return;
}
+ if (isResizableTransitionInProgress()) {
+ return;
+ }
if (android_foldable_is_folded()) {
startUnfoldTimer(newSize);
return;
@@ -998,6 +1004,7 @@ void ToolWindow::presetSizeAdvance(PresetEmulatorSizeType newSize) {
on_new_posture_requested(POSTURE_OPENED);
}
+ setResizableTransitionInProgress(true);
emugl::setShouldSkipDraw(true);
startSleepTimer();
std::string updateMsg = "Updating device size\n";
diff --git a/android/build/cmake/config.toml.in b/android/build/cmake/config.toml.in
index f32f6ed80a..db70aa4d00 100644
--- a/android/build/cmake/config.toml.in
+++ b/android/build/cmake/config.toml.in
@@ -148,7 +148,8 @@ zip = { path = "${AOSP_ROOT}/external/rust/crates/zip" }
backtrace = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/backtrace" }
googletest = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/googletest" }
hermit-abi = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/hermit-abi" }
-redox_syscall = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall" }
+redox_syscall = { version = "0.2.9", path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall" }
+redox_syscall2 = { version = "0.4.1", path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall2", package="redox_syscall" }
remove_dir_all = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/remove_dir_all" }
sha2 = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/sha2" }
windows-sys = { path = "${AOSP_ROOT}/external/qemu/android/third_party/rust/crates/windows-sys-0.48.0" }
diff --git a/android/build/cmake/config/emu-qt5-config.cmake b/android/build/cmake/config/emu-qt5-config.cmake
index 278d363d11..2272cb5553 100644
--- a/android/build/cmake/config/emu-qt5-config.cmake
+++ b/android/build/cmake/config/emu-qt5-config.cmake
@@ -361,40 +361,38 @@ elseif(LINUX)
${PREBUILT_ROOT}/plugins/imageformats/libqwbmp${QT_LIBINFIX}.so>lib64/qt/plugins/imageformats/libqwbmp${QT_LIBINFIX}.so
)
- if(NOT LINUX_AARCH64)
+ list(APPEND QT5_SHARED_DEPENDENCIES
+ ${PREBUILT_ROOT}/plugins/platforms/libqxcb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqxcb${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqminimal${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqminimal${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqvnc${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqvnc${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6>lib64/qt/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6;
+ ${PREBUILT_ROOT}/lib/libfreetype.so.6>lib64/qt/lib/libfreetype.so.6;
+ ${PREBUILT_ROOT}/lib/libxkbcommon.so.0>lib64/qt/lib/libxkbcommon.so.0;
+ ${PREBUILT_ROOT}/lib/libX11-xcb.so.1>lib64/qt/lib/libX11-xcb.so.1;
+ ${PREBUILT_ROOT}/lib/libXau.so.6>lib64/qt/lib/libXau.so.6;
+ ${PREBUILT_ROOT}/lib/libXdmcp.so.6>lib64/qt/lib/libXdmcp.so.6;
+ ${PREBUILT_ROOT}/lib/libxcb-xkb.so.1>lib64/qt/lib/libxcb-xkb.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-cursor.so.0>lib64/qt/lib/libxcb-cursor.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-icccm.so.4>lib64/qt/lib/libxcb-icccm.so.4;
+ ${PREBUILT_ROOT}/lib/libxcb-image.so.0>lib64/qt/lib/libxcb-image.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-keysyms.so.1>lib64/qt/lib/libxcb-keysyms.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-randr.so.0>lib64/qt/lib/libxcb-randr.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-render-util.so.0>lib64/qt/lib/libxcb-render-util.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-render.so.0>lib64/qt/lib/libxcb-render.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-shape.so.0>lib64/qt/lib/libxcb-shape.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-shm.so.0>lib64/qt/lib/libxcb-shm.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-sync.so.1>lib64/qt/lib/libxcb-sync.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-util.so.1>lib64/qt/lib/libxcb-util.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-xfixes.so.0>lib64/qt/lib/libxcb-xfixes.so.0;
+ ${PREBUILT_ROOT}/lib/libxkbcommon-x11.so.0>lib64/qt/lib/libxkbcommon-x11.so.0;
+ ${PREBUILT_ROOT}/lib/libfontconfig.so.1>lib64/qt/lib/libfontconfig.so.1)
+ if(QTWEBENGINE)
list(APPEND QT5_SHARED_DEPENDENCIES
- ${PREBUILT_ROOT}/plugins/platforms/libqxcb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqxcb${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqminimal${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqminimal${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqvnc${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqvnc${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6>lib64/qt/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6;
- ${PREBUILT_ROOT}/lib/libfreetype.so.6>lib64/qt/lib/libfreetype.so.6;
- ${PREBUILT_ROOT}/lib/libxkbcommon.so.0>lib64/qt/lib/libxkbcommon.so.0;
- ${PREBUILT_ROOT}/lib/libX11-xcb.so.1>lib64/qt/lib/libX11-xcb.so.1;
- ${PREBUILT_ROOT}/lib/libXau.so.6>lib64/qt/lib/libXau.so.6;
- ${PREBUILT_ROOT}/lib/libXdmcp.so.6>lib64/qt/lib/libXdmcp.so.6;
- ${PREBUILT_ROOT}/lib/libxcb-xkb.so.1>lib64/qt/lib/libxcb-xkb.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-cursor.so.0>lib64/qt/lib/libxcb-cursor.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-icccm.so.4>lib64/qt/lib/libxcb-icccm.so.4;
- ${PREBUILT_ROOT}/lib/libxcb-image.so.0>lib64/qt/lib/libxcb-image.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-keysyms.so.1>lib64/qt/lib/libxcb-keysyms.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-randr.so.0>lib64/qt/lib/libxcb-randr.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-render-util.so.0>lib64/qt/lib/libxcb-render-util.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-render.so.0>lib64/qt/lib/libxcb-render.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-shape.so.0>lib64/qt/lib/libxcb-shape.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-shm.so.0>lib64/qt/lib/libxcb-shm.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-sync.so.1>lib64/qt/lib/libxcb-sync.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-util.so.1>lib64/qt/lib/libxcb-util.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-xfixes.so.0>lib64/qt/lib/libxcb-xfixes.so.0;
- ${PREBUILT_ROOT}/lib/libxkbcommon-x11.so.0>lib64/qt/lib/libxkbcommon-x11.so.0;
- ${PREBUILT_ROOT}/lib/libfontconfig.so.1>lib64/qt/lib/libfontconfig.so.1)
- if(QTWEBENGINE)
- list(APPEND QT5_SHARED_DEPENDENCIES
- ${PREBUILT_ROOT}/lib/libpcre2-16.so.0>lib64/qt/lib/libpcre2-16.so.0)
- endif()
+ ${PREBUILT_ROOT}/lib/libpcre2-16.so.0>lib64/qt/lib/libpcre2-16.so.0)
endif()
set(QT5_SHARED_PROPERTIES
diff --git a/android/build/cmake/config/emu-vulkan-config.cmake b/android/build/cmake/config/emu-vulkan-config.cmake
index b787d1a56b..57d5d8673e 100644
--- a/android/build/cmake/config/emu-vulkan-config.cmake
+++ b/android/build/cmake/config/emu-vulkan-config.cmake
@@ -30,17 +30,12 @@ if(LINUX_X86_64)
set(VULKAN_TEST_DEPENDENCIES
# Loader (for testing)
"${PREBUILT_ROOT}/libvulkan.so>testlib64/libvulkan.so"
- # Mock ICD
- "${PREBUILT_ROOT}/icds/libVkICD_mock_icd.so>testlib64/libVkICD_mock_icd.so"
- "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json"
# Debug / validation layers
"${PREBUILT_ROOT}/layers/libVkLayer_api_dump.so>testlib64/layers/libVkLayer_api_dump.so"
- "${PREBUILT_ROOT}/layers/libVkLayer_device_simulation.so>testlib64/layers/libVkLayer_device_simulation.so"
"${PREBUILT_ROOT}/layers/libVkLayer_khronos_validation.so>testlib64/layers/libVkLayer_khronos_validation.so"
"${PREBUILT_ROOT}/layers/libVkLayer_monitor.so>testlib64/layers/libVkLayer_monitor.so"
"${PREBUILT_ROOT}/layers/libVkLayer_screenshot.so>testlib64/layers/libVkLayer_screenshot.so"
"${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json"
- "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json"
"${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.json>testlib64/layers/VkLayer_khronos_validation.json"
"${PREBUILT_ROOT}/layers/VkLayer_monitor.json>testlib64/layers/VkLayer_monitor.json"
"${PREBUILT_ROOT}/layers/VkLayer_screenshot.json>testlib64/layers/VkLayer_screenshot.json"
@@ -62,15 +57,10 @@ elseif(DARWIN_X86_64 OR DARWIN_AARCH64)
set(VULKAN_TEST_DEPENDENCIES
# Loader (for testing)
"${PREBUILT_ROOT}/libvulkan.dylib>testlib64/libvulkan.dylib"
- # Mock ICD
- "${PREBUILT_ROOT}/icds/libVkICD_mock_icd.dylib>testlib64/libVkICD_mock_icd.dylib"
- "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json"
# Debug / validation layers
"${PREBUILT_ROOT}/layers/libVkLayer_api_dump.dylib>testlib64/layers/libVkLayer_api_dump.dylib"
- "${PREBUILT_ROOT}/layers/libVkLayer_device_simulation.dylib>testlib64/layers/libVkLayer_device_simulation.dylib"
"${PREBUILT_ROOT}/layers/libVkLayer_khronos_validation.dylib>testlib64/layers/libVkLayer_khronos_validation.dylib"
"${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json"
- "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json"
"${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.json>testlib64/layers/VkLayer_khronos_validation.json"
# shaders
${VULKAN_COMMON_DEPENDENCIES})
@@ -90,14 +80,9 @@ elseif(WINDOWS)
set(VULKAN_TEST_DEPENDENCIES
# Loader (for testing)
"${PREBUILT_ROOT}/vulkan-1.dll>testlib64/vulkan-1.dll"
- # Mock ICD
- "${PREBUILT_ROOT}/icds/VkICD_mock_icd.dll>testlib64/VkICD_mock_icd.dll"
- "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json"
# Debug / validation layers
"${PREBUILT_ROOT}/layers/VkLayer_api_dump.dll>testlib64/layers/VkLayer_api_dump.dll"
"${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json"
- "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.dll>testlib64/layers/VkLayer_device_simulation.dll"
- "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json"
"${PREBUILT_ROOT}/layers/VkLayer_gfxreconstruct.dll>testlib64/layers/VkLayer_gfxreconstruct.dll"
"${PREBUILT_ROOT}/layers/VkLayer_gfxreconstruct.json>testlib64/layers/VkLayer_gfxreconstruct.json"
"${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.dll>testlib64/layers/VkLayer_khronos_validation.dll"
diff --git a/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml b/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml
new file mode 100644
index 0000000000..fae9af5c16
--- /dev/null
+++ b/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml
@@ -0,0 +1,3 @@
+[package]
+name = "redox_syscall"
+version = "0.4.1"
diff --git a/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs b/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs
diff --git a/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile b/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile
new file mode 100644
index 0000000000..887483a82c
--- /dev/null
+++ b/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile
@@ -0,0 +1,83 @@
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This docker image is for build Qt 6.5.3 for linux-aarch64 on an arm mac.
+# We want to build on arm mac so we can use an arm linux image.
+#
+# To build the docker image for arm architecture:
+# > docker build -t <image_name> .
+# > docker run --mount type=bind,source="/Volumes/android/emu-prebuilts",target="/emu" -dt <image_name>
+# > docker exec -it <container_id> bash
+# $ cd emu && tools/buildSrc/servers/build_tools.py --out_dir /emu/out-prebuilts --dist_dir /emu/dist-prebuilts/12345678 --build-id 12345678 --prebuilts
+FROM ubuntu:focal-20200423
+
+# tzdata complains when running apt-get install below, so we need to set the timezone.
+ENV TZ=America/Los_Angeles
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt update
+# Install necessary utilities
+RUN apt install -y software-properties-common curl git
+
+# Install python 3.10, ninja
+RUN add-apt-repository -y ppa:deadsnakes/ppa
+RUN apt install -y python3.10 python3.10-distutils pip ninja-build
+
+# Install deps for building Qt
+RUN apt -y install \
+ patchelf \
+ libfontconfig1-dev \
+ libfreetype6-dev \
+ libx11-dev \
+ libx11-xcb-dev \
+ libxext-dev \
+ libxfixes-dev \
+ libxi-dev \
+ libxrender-dev \
+ libxcb-cursor-dev \
+ libxcb-glx0-dev \
+ libxcb-keysyms1-dev \
+ libxcb-image0-dev \
+ libxcb-shm0-dev \
+ libxcb-icccm4-dev \
+ libxcb-sync-dev \
+ libxcb-xfixes0-dev \
+ libxcb-shape0-dev \
+ libxcb-randr0-dev \
+ libxcb-render-util0-dev \
+ libxcb-util-dev \
+ libxcb-xinerama0-dev \
+ libxcb-xkb-dev \
+ libxkbcommon-dev \
+ libxkbcommon-x11-dev \
+ libsm-dev \
+ libice-dev \
+ libdbus-1-dev \
+ libxcomposite-dev \
+ libxcursor-dev \
+ libxrandr-dev \
+ libxshmfence-dev \
+ libcupsfilters-dev \
+ libegl1-mesa-dev \
+ libglib2.0-dev \
+ libcups2-dev \
+ libnss3-dev \
+ libxtst-dev \
+ libxkbfile-dev \
+ libdrm-dev
+
+# Install cmake >= 3.19; apt version is 3.16
+RUN curl -L https://github.com/Kitware/CMake/releases/download/v3.29.3/cmake-3.29.3-linux-aarch64.tar.gz > /cmake-3.29.3-linux-aarch64.tar.gz
+RUN tar -xvf /cmake-3.29.3-linux-aarch64.tar.gz
+ENV PATH=/cmake-3.29.3-linux-aarch64/bin:$PATH
diff --git a/android/build/python/aemu/prebuilts/qt.py b/android/build/python/aemu/prebuilts/qt.py
index 4b098b520f..874a7f77ee 100644
--- a/android/build/python/aemu/prebuilts/qt.py
+++ b/android/build/python/aemu/prebuilts/qt.py
@@ -32,6 +32,7 @@ import platform
AOSP_ROOT = Path(__file__).resolve().parents[7]
HOST_OS = platform.system().lower()
+HOST_ARCH = platform.machine().lower()
QT_VERSION = "6.5.3"
QT_SUBMODULES = [
@@ -81,22 +82,25 @@ def checkDependencies():
logging.info(">> Checking Ninja >= 1.7.2")
deps_common.checkNinjaVersion(min_vers=(1, 7, 2))
- # Need node.js version 12 or later for QtWebEngine
- logging.info(">> Checking for node.js version >= 12")
- deps_common.checkNodeJsVersion(min_vers=(12, 0))
-
- # QtWebEngine needs python html5lib package
- logging.info(">> Checking for python package html5lib")
- deps_common.checkPythonPackage("html5lib")
-
- # QtWebEngine requires GNUWin32 dependencies gperf, bison, flex
- # TODO(joshuaduong): Locally I installed bison from https://gnuwin32.sourceforge.net/packages.html, but maybe we use chocolatey on the buildbot.
- logging.info(">> Checking for gperf")
- deps_common.checkGperfVersion()
- logging.info(">> Checking for bison")
- deps_common.checkBisonVersion()
- logging.info(">> Checking for flex")
- deps_common.checkFlexVersion()
+ if HOST_OS == "linux" and HOST_ARCH == "aarch64":
+ logging.info("Skipping QtWebEngine dependency check for linux-aarch64")
+ else:
+ # Need node.js version 12 or later for QtWebEngine
+ logging.info(">> Checking for node.js version >= 12")
+ deps_common.checkNodeJsVersion(min_vers=(12, 0))
+
+ # QtWebEngine needs python html5lib package
+ logging.info(">> Checking for python package html5lib")
+ deps_common.checkPythonPackage("html5lib")
+
+ # QtWebEngine requires GNUWin32 dependencies gperf, bison, flex
+ # TODO(joshuaduong): Locally I installed bison from https://gnuwin32.sourceforge.net/packages.html, but maybe we use chocolatey on the buildbot.
+ logging.info(">> Checking for gperf")
+ deps_common.checkGperfVersion()
+ logging.info(">> Checking for bison")
+ deps_common.checkBisonVersion()
+ logging.info(">> Checking for flex")
+ deps_common.checkFlexVersion()
if HOST_OS == "windows":
# - Visual Studio 2019 v16.11+
@@ -109,7 +113,7 @@ def checkDependencies():
elif HOST_OS == "darwin":
# MacOS sdk >= 13
deps_mac.checkMacOsSDKVersion(min_vers=(12, 0))
- elif HOST_OS == "linux":
+ elif HOST_OS == "linux" and HOST_ARCH != "aarch64":
pkgconfig_libs = [
("xrender", [0, 9, 0]),
("xcb-render", [1, 11]),
@@ -240,25 +244,29 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta
if HOST_OS == "windows":
conf_args += ["-platform", "win32-msvc"]
elif HOST_OS == "linux":
- if crosscompile_target == "linux_aarch64":
+ if HOST_ARCH == "aarch64" or crosscompile_target == "linux_aarch64":
# Cross-compiling requires a host installation of Qt, so we must build Qt for
# linux-x86_64 prior to cross-compiling to linux_aarch64.
- if not qt_host_path:
- logging.fatal(f"No Qt host path was provided for {crosscompile_target} cross-compilation.")
- conf_args += ["-platform", "linux-aarch64-gnu-g++",
+ conf_args += ["-platform", "linux-aarch64-gnu-g++"]
+ if crosscompile_target:
+ if not qt_host_path:
+ logging.fatal(f"No Qt host path was provided for {crosscompile_target} cross-compilation.")
+ # We have to disable a lot of things for cross-compilation without a full sysroot.
+ logging.warning("GUI support is not supported in cross-compilation.")
+ conf_args += [
"-device-option", "CROSS_COMPILE=aarch64-linux-gnu-",
"-no-glib", "-qt-host-path", qt_host_path, "-qt-pcre", "-qt-zlib",
"-qt-doubleconversion", "-qt-freetype", "-qt-harfbuzz",
"-no-feature-gssapi", "-no-feature-brotli", "-no-xcb", "-no-xkbcommon",
"-qt-webp", "-no-libudev", "-no-mtdev", "-no-linuxfb"]
- os.environ["CC"] = "aarch64-linux-gnu-gcc"
- os.environ["CXX"] = "aarch64-linux-gnu-g++"
+ conf_args += ["--", "-DCMAKE_SYSTEM_NAME=Linux", "-DCMAKE_SYSTEM_PROCESSOR=arm",
+ f"-DQT_HOST_PATH={qt_host_path}", "-DCMAKE_LINKER_FLAGS=-Wl,--as-needed"]
+ os.environ["CC"] = "aarch64-linux-gnu-gcc"
+ os.environ["CXX"] = "aarch64-linux-gnu-g++"
extra_cflags = "-march=armv8-a"
extra_cxxflags = "-march=armv8-a"
os.environ["CFLAGS"] = extra_cflags
os.environ["CXXFLAGS"] = extra_cxxflags
- conf_args += ["--", "-DCMAKE_SYSTEM_NAME=Linux", "-DCMAKE_SYSTEM_PROCESSOR=arm",
- f"-DQT_HOST_PATH={qt_host_path}", "-DCMAKE_LINKER_FLAGS=-Wl,--as-needed"]
else:
conf_args += ["-linker", "lld",
"-platform", "linux-clang-libc++",
@@ -281,7 +289,11 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta
toolchain_dir = Path(builddir) / "toolchain"
os.makedirs(Path(builddir) / "toolchain")
- clang_dir = deps_common.getClangDirectory()
+ if HOST_ARCH == "aarch64":
+ clang_dir = "/usr"
+ else:
+ clang_dir = deps_common.getClangDirectory()
+
with open(toolchain_dir / "clang", 'x') as f:
f.write(f"#!/bin/sh\n{clang_dir}/bin/clang {extra_cflags} $@")
os.chmod(toolchain_dir / "clang", 0o777)
@@ -298,8 +310,6 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta
f.write(f"#!/bin/sh\n{clang_dir}/bin/lld $@")
os.chmod(toolchain_dir / "lld", 0o777)
- # Add path to libc++.so.1 as some binaries (syncqt) that require it are ran during the
- # configure step.
os.environ["LD_LIBRARY_PATH"] = str(deps_common.getClangDirectory() / "lib")
addToSearchPath(str(toolchain_dir))
@@ -421,15 +431,19 @@ def mac_postInstall(installdir):
def linux_postInstall(installdir, target, is_webengine):
# Install prebuilt clang's libc++.so.1 and libc++abi.so.1 to lib/ as Qt's compiler
# tools (moc, rcc, uic) depends on it.
- clang_libs = ["libc++.so.1", "libc++abi.so.1"]
- for lib in clang_libs:
- src_lib = deps_common.getClangDirectory() / "lib" / lib
- dst_lib = f"{installdir}/lib/{lib}"
- logging.info(f"Copy {src_lib} ==> {dst_lib}")
- shutil.copyfile(src_lib, dst_lib)
+ if HOST_ARCH == "aarch64":
+ sysroot_dir = Path("/lib/aarch64-linux-gnu")
+ else:
+ clang_libs = ["libc++.so.1", "libc++abi.so.1"]
+ clang_dir = deps_common.getClangDirectory()
+ sysroot_dir = Path("/lib/x86_64-linux-gnu")
+ for lib in clang_libs:
+ src_lib = clang_dir / "lib" / lib
+ dst_lib = f"{installdir}/lib/{lib}"
+ logging.info(f"Copy {src_lib} ==> {dst_lib}")
+ shutil.copyfile(src_lib, dst_lib)
# We also need additional libraries from the sysroot for linux
- sysroot_dir = Path("/lib/x86_64-linux-gnu")
sysroot_libs = [
"libpcre2-16.so.0",
"libfreetype.so.6",
@@ -454,13 +468,33 @@ def linux_postInstall(installdir, target, is_webengine):
"libfontconfig.so.1"]
if target == "linux" and is_webengine:
sysroot_libs += ["libjpeg.so.8"]
+ if target == "linux" and HOST_ARCH == "aarch64":
+ # Need additional libraries to build emulator
+ sysroot_libs += [
+ "libxcb.so.1",
+ "libX11.so.6",
+ "libz.so.1",
+ "libpng16.so.16",
+ "libexpat.so.1",
+ "libuuid.so.1",
+ "libdbus-1.so.3",
+ "libsystemd.so.0",
+ "liblzma.so.5",
+ "liblz4.so.1",
+ "libgcrypt.so.20",
+ "libgpg-error.so.0",
+ "libbsd.so.0"]
for lib in sysroot_libs:
src_lib = sysroot_dir / lib
dst_lib = f"{installdir}/lib/{lib}"
logging.info(f"Copy {src_lib} ==> {dst_lib}")
shutil.copyfile(src_lib, dst_lib)
+ if target == "linux" and HOST_ARCH == "aarch64":
+ # These symlinks are needed to make emulator build compile
+ os.symlink("libX11.so.6", f"{installdir}/lib/libX11.so")
+ os.symlink("libXau.so.6", f"{installdir}/lib/libXau.so")
- if target != "linux_aarch64":
+ if target != "linux_aarch64" and HOST_ARCH != "aarch64":
# need libunwind.so.1 for syncqt
src_libunwind = AOSP_ROOT / "prebuilts" / "android-emulator-build" / "common" / "libunwind" \
/ "linux-x86_64" / "lib" / "libunwind.so"
@@ -503,10 +537,14 @@ def buildPrebuilt(args, prebuilts_out_dir):
logging.fatal(f"[{vcvarsall}] does not exist")
exit(-1)
deps_win.inheritSubprocessEnv([vcvarsall, "amd64", ">NUL", "2>&1"])
- # Use cmake from our prebuilts
- addToSearchPath(CMAKE_PATH)
- # Use ninja from our prebuilts
- addToSearchPath(NINJA_PATH)
+
+ if HOST_OS == "linux" and HOST_ARCH == "aarch64":
+ logging.info("Using system-installed cmake/ninja on linux-aarch64 host")
+ else:
+ # Use cmake from our prebuilts
+ addToSearchPath(CMAKE_PATH)
+ # Use ninja from our prebuilts
+ addToSearchPath(NINJA_PATH)
logging.info(os.environ)
if not checkDependencies():
@@ -549,16 +587,19 @@ def buildPrebuilt(args, prebuilts_out_dir):
postInstall(qt_install_dir, args.target, False)
shutil.rmtree(qt_build_path)
- logging.info("Building Qt6 w/ QtWebEngine")
- qt_install_dir = os.path.join(prebuilts_out_dir, "qt")
- configureQtBuild(qt_src_path, qt_build_path, qt_install_dir, QT_SUBMODULES)
- buildQt(QT_SUBMODULES, qt_build_path)
- installQt(QT_SUBMODULES, qt_build_path, qt_install_dir)
- postInstall(qt_install_dir, args.target, True)
+ if HOST_OS == "linux" and HOST_ARCH == "aarch64":
+ logging.info("Skipping QtWebEngine build on linux-aarch64 machine")
+ else:
+ logging.info("Building Qt6 w/ QtWebEngine")
+ qt_install_dir = os.path.join(prebuilts_out_dir, "qt")
+ configureQtBuild(qt_src_path, qt_build_path, qt_install_dir, QT_SUBMODULES)
+ buildQt(QT_SUBMODULES, qt_build_path)
+ installQt(QT_SUBMODULES, qt_build_path, qt_install_dir)
+ postInstall(qt_install_dir, args.target, True)
# Since linux_aarch64 cross-compilation requires having a host build of Qt, let's just build it
# in the linux x86_64 host instead of creating an additional linux_aarch64 build target.
- if HOST_OS == "linux":
+ if HOST_OS == "linux" and HOST_ARCH != "aarch64":
logging.info("Cross-compiling Qt 6 (no QtWebEngine) for linux_aarch64")
crosscompile_target = "linux_aarch64"
qt_install_dir = os.path.join(prebuilts_out_dir, "qt-nowebengine-linux_aarch64")
diff --git a/android/third_party/boringssl/CMakeLists.txt b/android/third_party/boringssl/CMakeLists.txt
index 5248689c81..060fd92838 100644
--- a/android/third_party/boringssl/CMakeLists.txt
+++ b/android/third_party/boringssl/CMakeLists.txt
@@ -18,11 +18,10 @@ target_include_directories(ssl PUBLIC ${BORINGSSL_ROOT}/src/include)
target_include_directories(ssl PRIVATE ${BORINGSSL_ROOT}/src/ssl)
android_target_compile_options(ssl windows PRIVATE "-UNDEBUG")
-# Setup the crypto libraries:
-# On Windows x86_64 (and x86), BoringSSL uses NASM. On other platforms,
-# BoringSSL uses gas-compatible assembly syntax. Within an assembly syntax, the
-# files are conditioned by the underlying platfor, so it is not necessary to
-# condition on the target beyond this.
+# Setup the crypto libraries: On Windows x86_64 (and x86), BoringSSL uses NASM.
+# On other platforms, BoringSSL uses gas-compatible assembly syntax. Within an
+# assembly syntax, the files are conditioned by the underlying platfor, so it is
+# not necessary to condition on the target beyond this.
if(WINDOWS_MSVC_X86_64)
android_add_library(
TARGET crypto
@@ -68,9 +67,8 @@ target_link_libraries(ssl PUBLIC crypto)
# Tests
if((NOT WINDOWS) AND (NOT DARWIN_AARCH64))
- # BUG: 147893224: clang 10 results in a flaky failure in
- # ABITest.SanityCheck on Windows
- # BUG: 252237763: timeout on Mac M2
+ # BUG: 147893224: clang 10 results in a flaky failure in ABITest.SanityCheck
+ # on Windows BUG: 252237763: timeout on Mac M2
android_add_library(
TARGET boringssl_test_support NODISTRIBUTE SRC # cmake-format: sortable
${test_support_sources})
@@ -79,11 +77,17 @@ if((NOT WINDOWS) AND (NOT DARWIN_AARCH64))
${ssl_test_sources})
target_link_libraries(boringssl_ssl_unittests PRIVATE gmock_main ssl crypto
boringssl_test_support)
+ set_property(
+ TEST boringssl_ssl_unittests
+ PROPERTY ENVIRONMENT "BORINGSSL_TEST_DATA_ROOT=${BORINGSSL_ROOT}/src")
android_add_test(
TARGET boringssl_crypto_unittests SRC # cmake-format: sortable
${crypto_test_sources})
target_link_libraries(boringssl_crypto_unittests
PRIVATE gmock_main crypto boringssl_test_support)
+ set_property(
+ TEST boringssl_crypto_unittests
+ PROPERTY ENVIRONMENT "BORINGSSL_TEST_DATA_ROOT=${BORINGSSL_ROOT}/src")
android_target_link_libraries(boringssl_test_support windows
PRIVATE ws2_32::ws2_32 dbghelp::dbghelp)
endif()
diff --git a/mac.source.properties b/mac.source.properties
index 3f1db07be1..bb4982318f 100644
--- a/mac.source.properties
+++ b/mac.source.properties
@@ -1,4 +1,4 @@
Pkg.UserSrc=false
-Pkg.Revision=35.1.9
+Pkg.Revision=35.1.10
Pkg.Path=emulator
Pkg.Desc=Android Emulator
diff --git a/source.properties b/source.properties
index 3f1db07be1..bb4982318f 100644
--- a/source.properties
+++ b/source.properties
@@ -1,4 +1,4 @@
Pkg.UserSrc=false
-Pkg.Revision=35.1.9
+Pkg.Revision=35.1.10
Pkg.Path=emulator
Pkg.Desc=Android Emulator
diff --git a/win.source.properties b/win.source.properties
index 3f1db07be1..bb4982318f 100644
--- a/win.source.properties
+++ b/win.source.properties
@@ -1,4 +1,4 @@
Pkg.UserSrc=false
-Pkg.Revision=35.1.9
+Pkg.Revision=35.1.10
Pkg.Path=emulator
Pkg.Desc=Android Emulator