Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions .github/workflows/flix_sample.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,19 @@ jobs:

- name: Create AVD
id: create
uses: ndtp/android-avd-manager-action@main
uses: ndtp/android-avd-manager-action@2.0
with:
api-level: 29
target: google_apis
# 37.0 and 37.1 both crash-loop SurfaceFlinger: mapper.ranchu.so
# aborts on `!hasReadColorBufferDma`, taking system_server with it.
# 37.2-beta3 is the first image where that is fixed -- it carries a
# DEV-branch build, so the fix has not reached a release image yet.
api-level: '37.2-beta3'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pinning to @2.0, moving to google_apis_ps16k and adding the settle step all look right — and I checked the inputs against ndtp/android-avd-manager-action@2.0's action.yml: api-level, target, channel, arch, profile, ram-size and disk-size are all valid, and the 2.0 tag exists. 37.2-beta3 still reports SDK_INT == 37, so DeviceStringFormatter.androidVersion keeps producing the 37-… key and the baselines still resolve. No concern there.

The question is the divergence this creates. The comment states plainly that:

37.0 and 37.1 both crash-loop SurfaceFlinger: mapper.ranchu.so aborts on !hasReadColorBufferDma, taking system_server with it.

Meanwhile API 37.0 is what everything else in the repo prescribesbitrise.yml:124 (api_level: '37.0'), docs/docs/get-started/2-configuring-an-emulator.md, RECIPES.md:10, and the blog post's setup instructions.

So either:

  • the crash is specific to the GH Actions environment (nested virt + swiftshader_indirect), in which case 37.0 is fine locally and on Bitrise and it's worth saying so in the comment — otherwise the next person reads this and assumes the documented local setup is broken; or
  • it's a property of the 37.0 system image, in which case Bitrise's _emulatorSetup is running on a known-crashy image and the contributor docs are sending people to one.

Worth resolving either way — right now the repo simultaneously documents 37.0 as the target and 37.0 as broken.

Minor: enable-hw-keyboard defaults to false in this action and cores defaults to 2, while the emulator docs specify keyboard input enabled and 4 cores. Pre-existing and almost certainly irrelevant for Flix (no text input), so only worth touching if you're already in here.

target: google_apis_ps16k
channel: beta
arch: x86_64
profile: pixel_3a
ram-size: 4096M
disk-size: 6G

- name: Enable kernel-based virtual machine (KVM)
uses: ndtp/enable-kvm-action@v1
Expand All @@ -78,6 +85,14 @@ jobs:
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim
verbose: true

- name: Wait for the device to settle
run: |
# sys.boot_completed goes high while PackageManager is still doing
# first-boot work, so wait for the package service to actually answer.
timeout 240 bash -c 'until adb shell service check package | grep -q ": found"; do sleep 2; done'
echo "Host disk:"; df -h /
echo "Guest /data:"; adb shell df -h /data

- name: Download app apk
uses: actions/download-artifact@v4
with:
Expand Down
106 changes: 106 additions & 0 deletions Library/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Testify — Core Library

`dev.testify:testify` is the core runtime of Android Testify. It extends
[Android instrumentation tests](https://developer.android.com/training/testing/instrumented-tests)
with screenshot assertions: the library captures a bitmap of an `Activity` or `View` after all
layout and draw passes have completed, then compares that capture against a baseline image checked
into your source tree. When the rendering changes, the test fails and reports the difference.

Because screenshot tests are ordinary instrumented tests, they run on emulators and physical
devices from Android Studio, from the Gradle command line, and on continuous integration, and they
integrate with existing JUnit4 and Espresso test suites.

## Core use cases

- **Assert UI rendering.** Add `ScreenshotScenarioRule` (used with `ActivityScenario`) or the
legacy `ScreenshotRule` to a test class, annotate each test method with
`@ScreenshotInstrumentation`, and call `assertSame()`.
- **Capture a subset of the screen.** Target a specific view with a view provider or root view ID
instead of capturing the full `Activity`.
- **Vary the device configuration.** Set locale, font scale, and orientation per test to verify
localization, accessibility text sizes, and rotation without maintaining separate test suites.
- **Control comparison.** Apply an exactness tolerance, exclude regions from the comparison, or
supply a custom compare method for cases where an exact pixel match is not appropriate.
- **Stabilize captures.** Suppress sources of nondeterminism — text cursors, scrollbars, password
reveal, text suggestions, and the soft keyboard — and select an alternate capture method such as
`PixelCopy` or software rendering.
- **Diagnose failures.** Enable high-contrast diff images and YAML run reports through
`TestifyFeatures` to identify which pixels changed.

> [!NOTE]
> This README covers the library itself. For installation, tutorials, and task-oriented guides —
> including the [**Recipes**](https://testify.dev/docs/category/recipes) section, which documents
> the scenarios listed above step by step — see [testify.dev](https://testify.dev).

## Building

The library is built from the repository root with the Gradle wrapper. It depends on the `:Ktx`
module, so build it through the root project rather than in isolation.

- Build the debug variant:
```
./gradlew :Library:assembleDebug
```

- Build the release AAR (written to `Library/build/outputs/aar/`):
```
./gradlew :Library:assembleRelease
```

- Publish to the local Maven repository for use by a consuming project:
```
./gradlew :Library:publishToMavenLocal
```

Building requires JDK 25. Warnings are treated as errors in this module, so any new compiler
warning fails the build.

## Testing

The Testify core library is expected to pass KtLint checks, junit unit tests, and Android instrumented tests.

- To run the KtLint linter:
```
./gradlew Library:ktlintCheck
```

- To run the junit tests:
```
./gradlew Library:testDebugUnitTest
```

- To run the Android instrumented tests:
```
./gradlew Library:connectedDebugAndroidTest
```

Instrumented tests require a connected device or a running emulator. They exercise the capture and
comparison pipeline against baseline images stored in `src/androidTest/assets/screenshots/`, which
are grouped by device characteristics, so results depend on the API level, resolution, density, and
locale of the target device.


# License

MIT License

Modified work copyright (c) 2022-2026 ndtp
Original work copyright (c) 2021 Shopify

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
2 changes: 1 addition & 1 deletion Library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ base {
archivesName = pom.artifact
}

jacoco { toolVersion = "0.8.10" }
jacoco { toolVersion = "0.8.15" }

android {
compileOptions {
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2023 ndtp
* Copyright (c) 2026 ndtp
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand Down Expand Up @@ -42,8 +42,10 @@ class AssertExpectedDeviceTest {
/**
* WHEN the baseline image matches the current device settings THEN success
*
* The baseline was recorded against a Pixel 3a (1080x2220 440dpi) running Q API level 29, x86, Android 10.0 (Google APIs)
* key = 29-1080x2220@440dp-en_US
* The baseline was recorded against a Pixel 3a (1080x2220 440dpi) running 16 KB Page Size Google
* APIs ARM 64 v8a System Image, API 37.0 (CinnamonBun; Android 17.0)
*
* key = 37-1080x2220@440dp-en_US
*
* https://testify.dev/docs/get-started/configuring-an-emulator
*/
Expand Down Expand Up @@ -87,7 +89,7 @@ class AssertExpectedDeviceTest {
val e = assertThrows(UnexpectedDeviceException::class.java, rule::assertSame)
assertTrue(
e.message!!.contains(
"The currently running device '29-1080x2220@440dp-en_US'" +
"The currently running device '37-1080x2220@440dp-en_US'" +
" does not match the expected device '33-1080x1920@395dp-en_CA'"
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2024 ndtp
* Copyright (c) 2026 ndtp
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand Down Expand Up @@ -44,8 +44,10 @@ class ScenarioRuleAssertExpectedDeviceTest {
/**
* WHEN the baseline image matches the current device settings THEN success
*
* The baseline was recorded against a Pixel 3a (1080x2220 440dpi) running Q API level 29, x86, Android 10.0 (Google APIs)
* key = 29-1080x2220@440dp-en_US
* The baseline was recorded against a Pixel 3a (1080x2220 440dpi) running 16 KB Page Size Google
* APIs ARM 64 v8a System Image, API 37.0 (CinnamonBun; Android 17.0)
*
* key = 37-1080x2220@440dp-en_US
*
* https://testify.dev/docs/get-started/configuring-an-emulator
*/
Expand Down Expand Up @@ -105,7 +107,7 @@ class ScenarioRuleAssertExpectedDeviceTest {
}
assertTrue(
e.message!!.contains(
"The currently running device '29-1080x2220@440dp-en_US'" +
"The currently running device '37-1080x2220@440dp-en_US'" +
" does not match the expected device '33-1080x1920@395dp-en_CA'"
)
)
Expand Down
15 changes: 15 additions & 0 deletions Plugins/Gradle/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,21 @@ Disables the soft keyboard on the device

```

### disableStylusInput
Comment thread
DanielJette marked this conversation as resolved.

Disables stylus input on the device. The stylus input method can disrupt screenshots of text input fields, so it's good to turn it off.

```console
~/: ./gradlew FlixSample:disableStylusInput

> Task :FlixSample:disableStylusInput
------------------------------------------------------------
Disables stylus input on the device
------------------------------------------------------------
Success

```

### hidePasswords

Hides passwords fully on the device.
Expand Down
2 changes: 2 additions & 0 deletions Plugins/Gradle/src/main/kotlin/dev/testify/TestifyPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import dev.testify.tasks.report.ReportShowTask
import dev.testify.tasks.utility.DeviceKeyTask
import dev.testify.tasks.utility.DevicesTask
import dev.testify.tasks.utility.DisableSoftKeyboardTask
import dev.testify.tasks.utility.DisableStylusTask
import dev.testify.tasks.utility.HidePasswordsTasks
import dev.testify.tasks.utility.LocaleTask
import dev.testify.tasks.utility.SettingsTask
Expand Down Expand Up @@ -109,6 +110,7 @@ class TestifyPlugin : Plugin<Project> {
registerTask<DeviceKeyTask>(DeviceKeyTask.Companion)
registerTask<DevicesTask>(DevicesTask.Companion)
registerTask<DisableSoftKeyboardTask>(DisableSoftKeyboardTask.Companion)
registerTask<DisableStylusTask>(DisableStylusTask.Companion)
registerTask<HidePasswordsTasks>(HidePasswordsTasks.Companion)
registerTask<InternalScreenshotTestRecordTask>(InternalScreenshotTestRecordTask.Companion)
registerTask<LocaleTask>(LocaleTask.Companion)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import dev.testify.tasks.internal.TaskDependencyProvider
import dev.testify.tasks.internal.TaskNameProvider
import dev.testify.tasks.internal.TestifyDefaultTask
import dev.testify.tasks.utility.DisableSoftKeyboardTask
import dev.testify.tasks.utility.DisableStylusTask
import dev.testify.tasks.utility.HidePasswordsTasks
import dev.testify.tasks.utility.LocaleTask
import dev.testify.tasks.utility.TimeZoneTask
Expand Down Expand Up @@ -189,6 +190,7 @@ open class ScreenshotTestTask : TestifyDefaultTask() {
task.dependsOn(
HidePasswordsTasks.taskName(),
DisableSoftKeyboardTask.taskName(),
DisableStylusTask.taskName(),
LocaleTask.taskName(),
TimeZoneTask.taskName()
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2026 ndtp
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package dev.testify.tasks.utility

import dev.testify.internal.Adb
import dev.testify.tasks.internal.TaskNameProvider
import dev.testify.tasks.internal.TestifyUtilityTask

Comment thread
DanielJette marked this conversation as resolved.
open class DisableStylusTask : TestifyUtilityTask() {

override fun getDescription() = "Disables stylus input on the device"

override fun taskAction() {
Adb(adbServiceProvider.get()).arguments(
"shell",
"settings",
"put",
"secure",
"stylus_handwriting_enabled",
"0"
)
.execute()

println(" Success")
}

companion object : TaskNameProvider {
override fun taskName() = "disableStylusInput"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class ConfigurationCacheTest {
"deviceLocale, true",
"deviceTimeZone, true",
"disableSoftKeyboard, true",
"disableStylusInput, true",
"hidePasswords, true",
"reportPull, true",
"reportShow, true",
Expand Down
12 changes: 7 additions & 5 deletions RECIPES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ Examples of advanced test cases.

The Sample application includes a baseline for an emulator that's compatible with GitHub Actions. To configure an AVD locally, create a new virtual device with the following settings in the Android Virtual Device (AVD) configuration:

- Phone: Pixel 3a (1080x2220 440dpi)
- Q API level 29, x86, Android 10.0 (Google APIs)
- RAM: 1536 MB
- Phone: Pixel 3a (Obsolete) (1080x2220 440dpi)
- 16 KB Page Size Google APIs ARM 64 v8a System Image, API 37.0 (CinnamonBun; Android 17.0)
- CPU cores: 4
- Graphics acceleration: Automatic
- RAM: 2 GB
- VM heap: 256 MB
- Internal Storage: 2048 MB
- SD card, Studio-managed: 512 MB
- Internal Storage: 10 GB
- Expanded storage, Custom: 512 MB
- Enable Device Frame with pixel_3a skin
- Enable keyboard input

Expand Down
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
3 changes: 2 additions & 1 deletion Samples/Legacy/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the line that resolves the Compose blocker, and I think it's the right call — it fixes the whole Legacy set at once rather than just the Compose captures, and it's what keeps the new baselines comparable to the API 29 originals. Verified working: LegacySample:screenshotTest is OK (88 tests) on a real API 37 emulator, and MainActivityScreenshotTest_default has its dark-blue status bar and black nav bar back.

Two things I'd attach to it.

It deserves a mention in the PR description. Right now the only place this appears is a commit subject. The description documents the AVD down to the VM heap but says nothing about the sample opting out of a platform behaviour — and this is the mechanism the whole baseline diff rests on. Same for the blog post, which tells readers the samples left API 29 so they'd stop "demonstrating Testify on rendering behaviour that has since moved on", while Legacy now opts out of the largest such change. One sentence — we opt Legacy out deliberately, to keep the baseline diff reviewable — reconciles the two and saves the next person a bisect.

It's an escape hatch with a shelf life. windowOptOutEdgeToEdgeEnforcement was introduced as a migration aid, and the tools:targetApi="35" suppression you needed is the tell. I'm not going to assert a removal timeline I can't verify from here, and it demonstrably works on API 37 today — but the day it stops being honoured, this exact set of baselines breaks again, in the same way, and that's the scenario this PR exists to handle. Worth a comment on the line pointing at whatever issue tracks the eventual migration:

Suggested change
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
<!-- Opt out of edge-to-edge enforcement so the sample renders comparably to the
pre-API-35 baselines. This attribute is a migration aid and will eventually
stop being honoured; when it does, these baselines need re-recording. -->
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>

Related, and the reason I'd not let this sit forever: Ext/Compose/src/main/AndroidManifest.xml still declares ComposableTestActivity with no android:theme, so consumers on an ActionBar theme targeting SDK 35+ still get the overlap. With Legacy opted out, the repo no longer has a test that would surface it. Follow-up issue rather than anything for this PR.

</style>

<style name="AppTheme.NoActionBar">
Expand Down
6 changes: 4 additions & 2 deletions bitrise.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,14 +118,16 @@ workflows:
dependencies, install Android tools, run your Android unit tests and save the
test report.
steps:
- avd-manager@1:
- avd-manager@2:
timeout: 240
inputs:
- api_level: '29'
- api_level: '37.0'
- start_command_flags: "-camera-back none -camera-front none -no-window -gpu
swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -partition-size
6144"
- profile: pixel_3a
- tag: google_apis_ps16k
Comment thread
DanielJette marked this conversation as resolved.
- abi: x86_64
title: 'Emulator: Launch'
- wait-for-android-emulator@1:
timeout: 300
Expand Down
Loading