mmcc007 / screenshots

Screenshots: A command line utility and package for capturing screenshots for Flutter
Other
263 stars 143 forks source link

Problem with android emulator - stuck at 'Starting emulator' #19

Open ykorzikowski opened 5 years ago

ykorzikowski commented 5 years ago

Error: Screenshot command stays at starting emulator. Emulator is starting on a new window. It does not recognize that the emulator started.

Android sdk:

Yannik@workaholic:tiny_release $ emulator -list-avds
Nexus_10_API_27
Nexus_5X
Nexus_6P

Yannik@workaholic:tiny_release $ echo ${ANDROID_SDK_ROOT}
/usr/local/share/android-sdk

Flutter-Doc:

Yannik@workaholic:tiny_release $ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.2.1, on Mac OS X 10.14.3 18D109, locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[!] iOS toolchain - develop for iOS devices (Xcode 10.1)
    ✗ Verify that all connected devices have been paired with this computer in Xcode.
      If all devices have been paired, libimobiledevice and ideviceinstaller may require updating.
      To update with Brew, run:
        brew update
        brew uninstall --ignore-dependencies libimobiledevice
        brew uninstall --ignore-dependencies usbmuxd
        brew install --HEAD usbmuxd
        brew unlink usbmuxd
        brew link usbmuxd
        brew install --HEAD libimobiledevice
        brew install ideviceinstaller
[!] Android Studio (version 3.3)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] IntelliJ IDEA Ultimate Edition (version 2018.3.5)
[!] Connected device
    ! No devices available

! Doctor found issues in 3 categories.

Screenshot command:

Yannik@workaholic:tiny_release $ screenshots
Warning: Flutter integration tests do not work in multiple locals.
  See issue: https://github.com/flutter/flutter/issues/27785 for details.
  and provide a thumbs-up to prioritize a fix for this issue!

  While waiting for a fix configure only the default locale
  in screenshots.yamlClearing images in ios/fastlane/screenshots/en-GB for 'iPhone X'...
Clearing images in ios/fastlane/screenshots/de-DE for 'iPhone X'...
Clearing images in ios/fastlane/screenshots/en-GB for 'iPad Pro (12.9-inch) (2nd generation)'...
Clearing images in ios/fastlane/screenshots/de-DE for 'iPad Pro (12.9-inch) (2nd generation)'...
Clearing images in android/fastlane/metadata/android/en-GB/images/phoneScreenshots for 'Nexus 6P'...
Clearing images in android/fastlane/metadata/android/de-DE/images/phoneScreenshots for 'Nexus 6P'...
Starting emulator 'Nexus_6P' in locale en-GB ...
mmcc007 commented 5 years ago

Screenshots has code in place for running in multiple locales.

However, because of https://github.com/flutter/flutter/issues/27785, flutter driver is behaving incorrectly. This makes the code for multiple locales ineffective.

While what you describe may be an issue with running in multiple locales, for now (and until flutter/flutter#27785 is resolved), in order for you to continue, I would recommend specify one locale (probably the default locale) in screenshots.yaml.

As an interesting experiment and possible workaround for flutter/flutter#27785, it might be worth adding a job to .travis.yml to set the locale on the macOS and running with a matching screenshots.yaml

mmcc007 commented 5 years ago

To anyone else reading this, who wants to generate screenshots in multiple locales, please give a thumbs-up to the first comment in https://github.com/flutter/flutter/issues/27785#issue-408955077.

The Flutter Team uses the number of thumbs-up in the first comment to help prioritize the issue and get it fixed faster.

thnx!

ykorzikowski commented 5 years ago

@mmcc007 Did you related the wrong issue maybe? I opened two issues: One for the localization problem and one with a hanging screenshots command while waiting for android emu.

mmcc007 commented 5 years ago

Maybe 🤣... I had not noticed your other issue at time of writing.

The hanging-on-emulator issue (this one), may well be an issue with running in multiple locales. But, because of mentioned Flutter issue, multiple locales are not working anyway. Hence, I re-labeled this issue.

Will try to sort out any potential for confusion.

thnx for your feedback

mmcc007 commented 5 years ago

BTW: if so inclined, you can try forking and running the example on Travis with your screenshots.yaml.

If it reproduces the hanging-on-emulator problem from this issue, that would be helpful (especially after the flutter issue is resolved)

ykorzikowski commented 5 years ago

@mmcc007 what OS you are using? I experience this issue on my two developer machines with MacOS. So maybe this is a mac issue.

# Screen capture tests
tests:
  - test_driver/app_full.dart

# Interim location of screenshots from tests
staging: /tmp/screenshots

# A list of locales supported by the app
locales:
  - en-GB
  - de-DE
  - nl-NL

# A list of devices to emulate
devices:
  ios:
#    - iPhone X
    #    - iPhone 7 Plus
#    - iPad Pro (12.9-inch) (2nd generation)
  #   "iPhone 6",
  #   "iPhone 6 Plus",
  #   "iPhone 5",
  #   "iPhone 4s",
  #   "iPad Retina",
  #   "iPad Pro"
  android:
    - Nexus 6P
#    - Nexus 5X

# Frame screenshots
frame: false
mmcc007 commented 5 years ago

The reference environment I use for Screenshots builds is on Travis using the example (internationalized) app. It is using the default macOS v10.13.3 (can be configured to match your version if necessary): https://travis-ci.com/mmcc007/screenshots/jobs/185060852#L16

Even though the example app supports en-US and fr-CA the screenshots.yaml has been set to the default locale of the device (en-US) because of the above mentioned flutter bug. Using multiple locales in screenshots.yaml will cause the test to hang and timeout (probably the same thing you are experiencing).

This problem can be reproduced on a device completely independently from Screenshots. So probably shouldn't really be considered a Screenshots bug. (I probably should remove the bug label on this issue for clarification).

The flutter issue is that Flutter Driver does not work with internationalized apps (in particular, when an integration test is run in a locale different from the devices default locale, ie, the locale of a device has been changed prior to running the test).

To demonstrate this, and as referenced in the flutter issue, I setup a demo test using an iOS simulator (is also reproducible on an android emulator). You can see the test running on travis here: https://travis-ci.org/mmcc007/test_internationalization/builds/491485092 and the config file here: https://travis-ci.org/mmcc007/test_internationalization/builds/491485092/config The test runs fine for a regular app in both locales. The test fails for an internationalized app if the locale of a device is changed from the default locale of the device to the locale under test prior to starting up the device and running the test.

Since the problem can be reproduced independently of Screenshots, searching for workarounds should probably be done independently of Screenshots. If a workaround is found, it will probably be possible to use the workaround in Screenshots.

(btw: in this context device is interchangeable with iOS simulator and android emulator)

The flutter issue can be tricky to explain so apologies if I am not explaining it clearly.

Based on my testing, I suspect there is not a workaround for this on emulated devices. It might be worth trying on real devices. You might have better luck than me.

If no workaround is available, it might be possible to dig into the flutter driver code, or the flutter engine code, to find the problem and maybe develop a fix.

noumaans commented 5 years ago

I'm seeing this issue as well with Android emulators (iOS simulators work fine), and am using only en-US:

screenshots.yaml:

...
locales:
#  - fr-CA
  - en-US # this is assumed to be the default for your test machine.
...
devices:
  ios:
    - iPhone X
    - iPad Pro (12.9-inch) (2nd generation)
  android:
    - Nexus 6P
...

Issue exists for both Nexus 5X and 6P.

$ emulator -list-avds
Nexus_5X_API_27
Nexus_6P_API_28
mmcc007 commented 5 years ago

@noumaans Can you send me the output your are getting when running screenshots. Should be something like: https://travis-ci.com/mmcc007/screenshots/builds/104898262#L1054 (though, due to hardware acceleration, your emulator should be running much faster)

... and your 'flutter doctor -v'

BTW: does your app use internationalization?

thnx.

mmcc007 commented 5 years ago

@ykorzikowski Could you take a look at #29 ... it may be related to this issue.

It's possible I may have misunderstood and that this issue may be unrelated to internationalization. So if you could try the fix mentioned in #29 and let me know, that would be great.

Thnx a bunch!

mmcc007 commented 5 years ago

Added a fix for localization. Try it out with:

git clone https://github.com/mmcc007/screenshots.git
cd screenshots
git checkout #19_#20_localization
pub global activate --source path .
cd example
screenshots

Give it a shot and let me know how it goes. A confirmation of fix would help get fix into a release.

patreu22 commented 4 years ago

Hi @mmcc007 and sorry for opening this issue again, but I'm still experiencing an error related to this issue.

What's happening is, while I'm trying to automate my Android screenshots, the App is stuck on the splash screen and the test just times out after some time. I'm having two languages to localize and I realized everything is working fine for the first language, but after the first run is done and screenshots sets the new language, the app is stuck forever. This won't change, even if I comment the first language and try to runscreenshots on its own for the second language. Also calling flutter drive --target=test_driver/app.dart fails from this point on.

Only removing the app from the emulator and quitting the emulator fixes this behaviour and makes screenshot work again (for the first run).

These are my logs:

patreu22@patreu22s-MBP-3 flutter_myproject % screenshots
Starting flutter daemon...                                          5.8s
Clearing images in
android/fastlane/metadata/android/en-US/images/phoneScreenshots for 'Nexus
6P'...
Clearing images in
android/fastlane/metadata/android/de-DE/images/phoneScreenshots for 'Nexus
6P'...
Starting Nexus 6P...
Setting orientation to Portrait
Running test_driver/app.dart on 'Nexus 6P' in locale en-US...
Starting application: test_driver/app.dart
Initializing gradle...                                              0,8s
Resolving dependencies...                                           1,6s
Installing build/app/outputs/apk/app.apk...                         2,2s
Running Gradle task 'assembleDebug'...                              2,4s
Built build/app/outputs/apk/debug/app-debug.apk.
I/flutter (11201): Observatory listening on http://127.0.0.1:46205/Zgc5lskyZmY=/
00:00 +0: myproject (setUpAll)
[info ] FlutterDriver: Connecting to Flutter application at http://127.0.0.1:53679/Zgc5lskyZmY=/
[trace] FlutterDriver: Isolate found with number: 1387888498866863
[trace] FlutterDriver: Isolate is paused at start.
[trace] FlutterDriver: Attempting to resume isolate
[trace] FlutterDriver: Waiting for service extension
[info ] FlutterDriver: Connected to Flutter application.
### App Setup: Sleep for 10 seconds ###
I/flutter (11201): Init started
I/flutter (11201): ### Start Snap Setup ###
I/flutter (11201): ### Snap Setup done ###
I/flutter (11201): Load en
### App woke up ###
00:11 +0: myproject screenshot
I/flutter (11201): ANSWER WAS WRONG!
Screenshot 00Question created
I/flutter (11201): Session cleared
Screenshot 01Statistics created
Screenshot 02Exam created
Screenshot 03FotoTutorial created
00:24 +1: myproject (tearDownAll)
00:24 +1: All tests passed!
Stopping application instance.
Warning: framing is not enabled
Moving screenshots to
android/fastlane/metadata/android/en-US/images/phoneScreenshots
Changing locale from en-US to de-DE on 'Nexus 6P'...
Setting orientation to Portrait
Running test_driver/app.dart on 'Nexus 6P' in locale de-DE...
Starting application: test_driver/app.dart
Initializing gradle...                                              0,7s
Resolving dependencies...                                           1,5s
Installing build/app/outputs/apk/app.apk...                         3,0s
Running Gradle task 'assembleDebug'...                              3,0s
Built build/app/outputs/apk/debug/app-debug.apk.
I/flutter (13708): Observatory listening on http://127.0.0.1:39221/peUooxyxTvQ=/
00:00 +0: myproject (setUpAll)
[info ] FlutterDriver: Connecting to Flutter application at http://127.0.0.1:54034/peUooxyxTvQ=/
[trace] FlutterDriver: Isolate found with number: 4321025658285507
[trace] FlutterDriver: Isolate is paused at start.
[trace] FlutterDriver: Attempting to resume isolate
[trace] FlutterDriver: Waiting for service extension
[info ] FlutterDriver: Connected to Flutter application.
### App Setup: Sleep for 10 seconds ###
### App woke up ###
00:11 +0: myproject screenshot
00:12 +0 -1: myproject screenshot [E]
  DriverError: Error in Flutter application: Uncaught extension error while executing waitFor: 'package:flutter_driver/src/extension/extension.dart': Failed assertion: line 193 pos 14: 'WidgetsBinding.instance.isRootWidgetAttached || !command.requiresRootWidgetAttached': No root widget is attached; have you remembered to call runApp()?
  #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:40:39)
  #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
  #2      FlutterDriverExtension.call (package:flutter_driver/src/extension/extension.dart:193:14)
  <asynchronous suspension>
  #3      BindingBase.registerServiceExtension.<anonymous closure> (package:flutter/src/foundation/binding.dart:512:32)
  <asynchronous suspension>
  #4      _runExtension (dart:developer-patch/developer.dart:84:23)

  Original error: null
  Original stack trace:
  null

  package:flutter_driver/src/driver/driver.dart 455:7  FlutterDriver._sendCommand
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1062:19                         _CustomZone.registerBinaryCallback
  dart:async-patch/async_patch.dart 80:23              _asyncErrorWrapperHelper
  package:test_api/src/backend/invoker.dart            Invoker.waitForOutstandingCallbacks.<fn>
  dart:async/zone.dart 1124:13                         _rootRun
  dart:async/zone.dart 1021:19                         _CustomZone.run
  dart:async/zone.dart 1516:10                         _runZoned
  dart:async/zone.dart 1463:12                         runZoned
  package:test_api/src/backend/invoker.dart 247:5      Invoker.waitForOutstandingCallbacks
  package:test_api/src/backend/declarer.dart 166:33    Declarer.test.<fn>.<fn>
  dart:async/zone.dart 1124:13                         _rootRun
  dart:async/zone.dart 1021:19                         _CustomZone.run
  dart:async/zone.dart 1516:10                         _runZoned
  dart:async/zone.dart 1463:12                         runZoned
  package:test_api/src/backend/declarer.dart 165:13    Declarer.test.<fn>
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1045:19                         _CustomZone.registerCallback
  dart:async/zone.dart 962:22                          _CustomZone.bindCallbackGuarded
  dart:async/timer.dart 52:45                          new Timer
  dart:async/timer.dart 87:9                           Timer.run
  dart:async/future.dart 174:11                        new Future
  package:test_api/src/backend/invoker.dart 399:21     Invoker._onRun.<fn>.<fn>.<fn>

00:12 +0 -1: myproject (tearDownAll)
00:12 +0 -1: Some tests failed.

Unhandled exception:
Dummy exception to set exit code.
#0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
#1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#3      _Timer._runTimers (dart:isolate-patch/timer_impl.dart:391:30)
#4      _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:416:5)
#5      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
Stopping application instance.
I/flutter (13708): Init started
Driver tests failed: 255
Unhandled exception:
command failed: exitcode=255, cmd='flutter -d emulator-5554 drive test_driver/app.dart', workingDirectory=., mode=normal
#0      streamCmd (package:screenshots/src/utils.dart:403:7)
<asynchronous suspension>
#1      runProcessTests (package:screenshots/src/run.dart:391:13)
<asynchronous suspension>
#2      runTestsOnAll (package:screenshots/src/run.dart:345:15)
<asynchronous suspension>
#3      runScreenshots (package:screenshots/src/run.dart:109:9)
<asynchronous suspension>
#4      screenshots.<anonymous closure> (package:screenshots/src/run.dart:45:14)
<asynchronous suspension>
#5      AppContext.run.<anonymous closure> (package:tool_base/src/base/context.dart:153:29)
<asynchronous suspension>
#6      _rootRun (dart:async/zone.dart:1124:13)
#7      _CustomZone.run (dart:async/zone.dart:1021:19)
#8      _runZoned (dart:async/zone.dart:1516:10)
#9      runZoned (dart:async/zone.dart:1463:12)
#10     AppContext.run (package:tool_base/src/base/context.dart:152:18)
<asynchronous suspension>
#11     runInContext (package:screenshots/src/context_runner.dart:16:24)
<asynchronous suspension>
#12     screenshots (package:screenshots/src/run.dart:44:12)
<asynchronous suspension>
#13     main (file:///Users/patreu22/.pub-cache/hosted/pub.dartlang.org/screenshots-2.0.2+1/bin/main.dart:102:25)
<asynchronous suspension>
#14     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:303:32)
#15     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)

My flutter doctor -v:


patreu22@patreu22s-MBP-3 flutter_myproject % flutter doctor -v
[✓] Flutter (Channel stable, v1.9.1+hotfix.6, on Mac OS X 10.15 19A583, locale de-DE)
    • Flutter version 1.9.1+hotfix.6 at /Users/patreu22/Development/flutter
    • Framework revision 68587a0916 (9 weeks ago), 2019-09-13 19:46:58 -0700
    • Engine revision b863200c37
    • Dart version 2.5.0

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/patreu22/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.0)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.0, Build version 11A420a
    • CocoaPods version 1.8.4

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 41.1.2
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] VS Code (version 1.40.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.6.0

[✓] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)
´´´

Would be really glad about some help fixing this! :)
mmcc007 commented 4 years ago

I suspect this may have something to do with https://github.com/flutter/flutter/issues/27785#issuecomment-511091956 which was implemented in this commit https://github.com/mmcc007/screenshots/pull/80/commits/0c3df71931083b6c81c9f7c9f3eee6515ec4351f

To get to a basis for comparison, try running the example app which implements internationalization and uses the recommended way to run integration tests for internationalized apps.

git clone https://github.com/mmcc007/screenshots
cd screenshots/example
screenshots -c screenshots_android.yaml -v

If this succeeds, then try using the example app as a model for implementing integration tests for internationalization.

If it fails send me the output.

patreu22 commented 4 years ago

Hey @mmcc007 , thank you very much for your quick response. Indeed, the example ran smoothly and the problem existed in my local test setup. For anybody who might end up here struggling and using the flutter_localizations package:

For me it did the trick to add change my test_driver/main.dart to this:

Future main() async {
  final DataHandler handler = (_) async {
    await AppLocalizationsDelegate()
        .load(Locale(ui.window.locale.languageCode));
    return Future.value();
  };
  enableFlutterDriverExtension(handler: handler);
  app.main();
}

and simply calling that in the setUpAll() method of my app_test.dart:

await driver.requestData(null);

Thanks again for your help, from my view this issue can be closed with the reference you provided to the example.

mmcc007 commented 4 years ago

Glad you got it working. I suspect this might be a common problem for new internationalized apps. Should probably mention it in README.

ened commented 4 years ago
❯ screenshots -v
[  +26 ms] Starting flutter daemon...
[   +7 ms] executing: flutter daemon
[ +409 ms] <== Starting device daemon...
[   +1 ms] <== [{"event":"daemon.connected","params":{"version":"0.5.3","pid":18942}}]
[   +2 ms] ==> [{"method":"device.enable","id":0}]
[        ] waiting for response: {method: device.enable, id: 0}
[  +12 ms] <== [{"id":0}]
[+5015 ms] executing: [./] sh -c ios-deploy -c || echo "no attached devices"
[   +1 ms] <== [{"event":"device.added","params":{"id":"emulator-5554","name":"Android SDK built for
x86","platform":"android-x86","emulator":true,"category":"mobile","platformType":"android","ephemeral":true,"emulatorId":"Nexus_5X_API_29_x86"}}]
[ +114 ms] Starting flutter daemon... (completed in 5.5s)
[        ] ==> [{"method":"device.getDevices","id":1}]
[        ] waiting for response: {method: device.getDevices, id: 1}
[   +3 ms] <== [{"id":1,"result":[{"id":"emulator-5554","name":"Android SDK built for
x86","platform":"android-x86","emulator":true,"category":"mobile","platformType":"android","ephemeral":true,"emulatorId":"Nexus_5X_API_29_x86"}]}]
[   +1 ms] daemonDevice=id: emulator-5554, name: Android SDK built for x86, category: mobile, platformType: android platform: android-x86, emulator: true, ephemeral: true,
emulatorId: Nexus_5X_API_29_x86, iosModel: null
[   +1 ms] ==> [{"method":"emulator.getEmulators","id":2}]
[        ] waiting for response: {method: emulator.getEmulators, id: 2}
[  +18 ms] <== [{"id":2,"result":[{"id":"Nexus_5X_API_29_x86","name":"Nexus 5X API 29 x86","category":"mobile","platformType":"android"},{"id":"apple_ios_simulator","name":"iOS
Simulator","category":"mobile","platformType":"ios"}]}]
[        ] daemonEmulator=id: Nexus_5X_API_29_x86, name: Nexus 5X API 29 x86, category: mobile, platformType: android
[        ] daemonEmulator=id: apple_ios_simulator, name: iOS Simulator, category: mobile, platformType: ios
[  +17 ms] executing: [./] chmod u+x /tmp/screenshots/resources/script/android-wait-for-emulator
[   +5 ms] executing: [./] chmod u+x /tmp/screenshots/resources/script/android-wait-for-emulator-to-stop
[   +5 ms] executing: [./] chmod u+x /tmp/screenshots/resources/script/simulator-controller
[   +5 ms] executing: [./] chmod u+x /tmp/screenshots/resources/script/sim_orientation.scpt
[   +3 ms] Warning: using default value 'phone' in fastlane directory.
[        ] Clearing images in android/fastlane/metadata/android/en-GB/images/phoneScreenshots for 'Nexus_5X_API_29_x86'...
[   +2 ms] Starting Nexus_5X_API_29_x86...
[        ] ==> [{"method":"emulator.launch","params":{"emulatorId":"Nexus_5X_API_29_x86"},"id":3}]
[+2297 ms] <== [{"event":"daemon.logMessage","params":{"level":"error","message":"The Android emulator exited with code 1 during startup"}}]
[        ] Warning: ignoring log message: [{"event":"daemon.logMessage","params":{"level":"error","message":"The Android emulator exited with code 1 during startup"}}]
[        ] <== [{"event":"daemon.logMessage","params":{"level":"error","message":"Android emulator stderr:"}}]
[        ] Warning: ignoring log message: [{"event":"daemon.logMessage","params":{"level":"error","message":"Android emulator stderr:"}}]
[        ] <== [{"event":"daemon.logMessage","params":{"level":"error","message":"Address these issues and try again."}}]
[        ] Warning: ignoring log message: [{"event":"daemon.logMessage","params":{"level":"error","message":"Address these issues and try again."}}]
[ +721 ms] <== [{"id":3}]

This is based on a single locale configuration. Do you have any further idea?

ened commented 4 years ago

The issue was sorted in my case by adjusting the configuration to use the device name instead of ID:

  android:
    Nexus 5X API 29 x86:
    # Nexus_5X_API_29_x86:
    # Pixel 2:
      frame: false