feat: add skipSettingsAppInstall capability to skip installing the Settings helper app#1077
Conversation
…ttings helper app Some environments (e.g. managed device farms / prebuilt device images) already provision the Appium Settings helper app, so re-installing it on every session is redundant and can be undesirable. Add an opt-in boolean capability `skipSettingsAppInstall` that skips the `pushSettingsApp` step in `initDevice`. Defaults to false, so existing behavior is unchanged. When enabled, features that depend on the Settings app (locale/language, IME handling, geolocation mocking, window animation control, unlock) may be unavailable, which is logged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Thanks — and I think the The setup this targets is a managed device farm: the host provisions
So That's the gap |
| if (skipSettingsAppInstall) { | ||
| this.log.info( | ||
| `'skipSettingsAppInstall' is set. Skipping installation of the Appium Settings helper app. ` + | ||
| `Capabilities and features that depend on it (locale/language, IME/keyboard handling, ` + |
There was a problem hiding this comment.
Lets not enumerate features as the list may change
There was a problem hiding this comment.
Done — dropped the enumerated feature list; the new log message no longer names specific features.
| this.log.info( | ||
| `'skipSettingsAppInstall' is set. Skipping installation of the Appium Settings helper app. ` + | ||
| `Capabilities and features that depend on it (locale/language, IME/keyboard handling, ` + | ||
| `geolocation mocking, window animation control, unlock) may be unavailable.`, |
There was a problem hiding this comment.
should we also alter the below code? Some of it is going to fail if Settings app is not installed
There was a problem hiding this comment.
Good catch. Addressed by requiring the app to be present when the cap is set: it now checks adb.isAppInstalled(SETTINGS_HELPER_ID) and throws a clear error if it's missing, so the setMockLocationApp / ensureDeviceLocale / keyboard setup below are guaranteed a present Settings app instead of failing opaquely.
|
What about tweaking this to "skipSettingsAppReinstall"? |
… to be present Address review feedback. Instead of silently skipping when the Settings helper app may be absent, rename the capability to skipSettingsAppReinstall and, when set, verify the app is already installed via adb.isAppInstalled and throw a clear error if it is not - rather than (re)installing it. Device init and mock-location setup below depend on the app being present, so this fails fast instead of letting those steps break opaquely. Also drops the enumerated feature list from the log message, and adds unit tests for the present/absent cases.
|
@KazuCocoa adopted, thanks — renamed the capability to |
KazuCocoa
left a comment
There was a problem hiding this comment.
lg, thank you!
We'll merge after fixing the conflict
|
@KazuCocoa @mykola-mokhnach I have resolved the conflicts now. |
## [13.4.0](v13.3.4...v13.4.0) (2026-07-15) ### Features * add skipSettingsAppInstall capability to skip installing the Settings helper app ([#1077](#1077)) ([fba4a2c](fba4a2c))
|
🎉 This PR is included in version 13.4.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Problem
initDeviceunconditionally installs the Appium Settings helper app viapushSettingsApp:Some environments already provision the Settings helper app as part of a managed device
image / device farm. In those setups, re-pushing it on every session is redundant work and
can be undesirable (extra installs, timing, or immutable-image constraints).
There is already
skipDeviceInitializationto skip the whole init block, but that is toocoarse — it also skips locale/logcat/geolocation setup. There is no way to keep device
initialization while skipping only the Settings app install.
Fix
Add an opt-in boolean capability
skipSettingsAppInstall. When set,initDeviceskips thepushSettingsAppcall and logs that Settings-app-dependent features may be unavailable. Allother initialization still runs.
false→ no behavior change for existing users.chromedriverGrantPermissions,skipDeviceInitialization).Changes
lib/constraints.ts: addskipSettingsAppInstall: { isBoolean: true }.lib/commands/device/common.ts: guard thepushSettingsAppcall with the new capability.Notes