diff --git a/.github/workflows/tests_fyi.yml b/.github/workflows/tests_fyi.yml index 167e0f7d8b..f32978486c 100644 --- a/.github/workflows/tests_fyi.yml +++ b/.github/workflows/tests_fyi.yml @@ -48,6 +48,7 @@ jobs: fail-fast: false matrix: shard: [1, 2] + # use mac build for emulator hardware accelerator runs-on: macos-11 steps: - uses: actions/checkout@v2 diff --git a/packages/playwright-core/src/server/android/android.ts b/packages/playwright-core/src/server/android/android.ts index 1f5899cc98..674b6a87e6 100644 --- a/packages/playwright-core/src/server/android/android.ts +++ b/packages/playwright-core/src/server/android/android.ts @@ -18,9 +18,11 @@ import debug from 'debug'; import * as types from '../types'; import { EventEmitter } from 'events'; import fs from 'fs'; +import os from 'os'; +import path from 'path'; import * as stream from 'stream'; import * as ws from 'ws'; -import { createGuid, makeWaitForNextTask } from '../../utils/utils'; +import { createGuid, makeWaitForNextTask, removeFolders } from '../../utils/utils'; import { BrowserOptions, BrowserProcess, PlaywrightOptions } from '../browser'; import { BrowserContext, validateBrowserContextOptions } from '../browserContext'; import { ProgressController } from '../progress'; @@ -28,11 +30,13 @@ import { CRBrowser } from '../chromium/crBrowser'; import { helper } from '../helper'; import { PipeTransport } from '../../protocol/transport'; import { RecentLogsCollector } from '../../utils/debugLogger'; +import { gracefullyCloseSet } from '../../utils/processLauncher'; import { TimeoutSettings } from '../../utils/timeoutSettings'; import { AndroidWebView } from '../../protocol/channels'; -import { CRPage } from '../chromium/crPage'; import { SdkObject, internalCallMetadata } from '../instrumentation'; +const ARTIFACTS_FOLDER = path.join(os.tmpdir(), 'playwright-artifacts-'); + export interface Backend { devices(): Promise; } @@ -256,15 +260,26 @@ export class AndroidDevice extends SdkObject { await androidBrowser._init(); this._browserConnections.add(androidBrowser); + const artifactsDir = await fs.promises.mkdtemp(ARTIFACTS_FOLDER); + const cleanupArtifactsDir = async () => { + const errors = await removeFolders([artifactsDir]); + for (let i = 0; i < (errors || []).length; ++i) + debug('pw:android')(`exception while removing ${artifactsDir}: ${errors[i]}`); + }; + gracefullyCloseSet.add(cleanupArtifactsDir); + socket.on('close', async () => { + gracefullyCloseSet.delete(cleanupArtifactsDir); + cleanupArtifactsDir().catch(e => debug('pw:android')(`could not cleanup artifacts dir: ${e}`)); + }); const browserOptions: BrowserOptions = { ...this._android._playwrightOptions, name: 'clank', isChromium: true, slowMo: 0, persistent: { ...options, noDefaultViewport: true }, - artifactsDir: '', - downloadsPath: '', - tracesDir: '', + artifactsDir, + downloadsPath: artifactsDir, + tracesDir: artifactsDir, browserProcess: new ClankBrowserProcess(androidBrowser), proxy: options.proxy, protocolLogger: helper.debugProtocolLogger(), @@ -278,14 +293,6 @@ export class AndroidDevice extends SdkObject { await controller.run(async progress => { await defaultContext._loadDefaultContextAsIs(progress); }); - { - // TODO: remove after rolling to r838157 - // Force page scale factor update. - const page = defaultContext.pages()[0]; - const crPage = page._delegate as CRPage; - await crPage._mainFrameSession._client.send('Emulation.setDeviceMetricsOverride', { mobile: false, width: 0, height: 0, deviceScaleFactor: 0 }); - await crPage._mainFrameSession._client.send('Emulation.clearDeviceMetricsOverride', {}); - } return defaultContext; } diff --git a/utils/avd_install.sh b/utils/avd_install.sh index f2d622b4d6..aa07853a51 100755 --- a/utils/avd_install.sh +++ b/utils/avd_install.sh @@ -23,7 +23,7 @@ echo Installing emulator... yes | ${ANDROID_HOME}/tools/bin/sdkmanager --install platform-tools emulator echo Installing platform SDK... -yes | ${ANDROID_HOME}/tools/bin/sdkmanager --install "platforms;android-31" +yes | ${ANDROID_HOME}/tools/bin/sdkmanager --install "platforms;android-32" echo Starting ADB... ${ANDROID_HOME}/platform-tools/adb devices diff --git a/utils/avd_recreate.sh b/utils/avd_recreate.sh index b7d4ec4ff5..23df4626a1 100755 --- a/utils/avd_recreate.sh +++ b/utils/avd_recreate.sh @@ -8,7 +8,7 @@ if [[ -z "${ANDROID_HOME}" ]]; then export ANDROID_SDK_ROOT=${SDKDIR} fi -${ANDROID_HOME}/tools/bin/avdmanager delete avd --name android31 || true -echo "y" | ${ANDROID_HOME}/tools/bin/sdkmanager --install "system-images;android-31;google_apis;x86_64" -echo "no" | ${ANDROID_HOME}/tools/bin/avdmanager create avd --force --name android31 --device "Nexus 5X" --package "system-images;android-31;google_apis;x86_64" +${ANDROID_HOME}/tools/bin/avdmanager delete avd --name android32 || true +echo "y" | ${ANDROID_HOME}/tools/bin/sdkmanager --install "system-images;android-32;google_apis;x86_64" +echo "no" | ${ANDROID_HOME}/tools/bin/avdmanager create avd --force --name android32 --device "Nexus 5X" --package "system-images;android-32;google_apis;x86_64" ${ANDROID_HOME}/emulator/emulator -list-avds diff --git a/utils/avd_start.sh b/utils/avd_start.sh index 6b617b4a73..e6eb31967d 100755 --- a/utils/avd_start.sh +++ b/utils/avd_start.sh @@ -11,8 +11,13 @@ fi echo "Killing previous emulators" ${ANDROID_HOME}/platform-tools/adb devices | grep emulator | cut -f1 | while read line; do ${ANDROID_HOME}/platform-tools/adb -s $line emu kill; done +EMULATOR_GPU="host" +if [[ -n "${GITHUB_ACTIONS}" ]]; then + EMULATOR_GPU="swiftshader_indirect" +fi + echo "Starting emulator" -nohup ${ANDROID_HOME}/emulator/emulator -avd android31 -no-audio -no-window -gpu swiftshader & +nohup ${ANDROID_HOME}/emulator/emulator -avd android32 -no-audio -no-window -gpu ${EMULATOR_GPU} -no-boot-anim & ${ANDROID_HOME}/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' ${ANDROID_HOME}/platform-tools/adb devices echo "Emulator started" \ No newline at end of file