On this page

Development Mode

Overview

The Development Mode is an optional operating mode that makes the application manager expose a private P2P D-Bus interface, which is used exclusively by the appman-controller tool. With this interface, developers can install and manage packages, start and stop applications, and inject intent requests from the command line without having to integrate any System UI logic.

Development mode is controlled by the flags/developmentMode configuration option and the corresponding --development-mode command-line flag. The possible values are:

ValueDescription
disabledDevelopment mode is off. No private D-Bus interface is created and the appman-controller tool cannot connect. This is the default.
systemDevelopment mode is enabled with full, unrestricted access. Any developer with access to the device can use appman-controller to control the application manager without restrictions.
applicationA restricted development mode intended for third-party application developers. Access is scoped to the packages and applications whose IDs are covered by a developer certificate that is set at runtime.

Enabling Development Mode

Set the mode in the configuration file:

flags:
  developmentMode: system

Or pass it on the command line:

appman --development-mode system

Note: Development mode should never be enabled on production devices. In either system or application mode, the private D-Bus interface can be used to install packages, start applications, and inject intents, which bypasses normal access controls.

System Mode

When developmentMode is set to system, the application manager grants the appman-controller tool unrestricted access to all D-Bus operations:

  • All packages and applications are visible and manageable.
  • Developer-signed packages (without a store signature) can be installed from any valid developer certificate issued by the configured Developer CA.
  • All installation tasks are visible and can be cancelled.
  • All appman-controller commands are available, including commands that are not scoped to a specific package or application, such as taking a screenshot of the entire display.
  • Intent requests can be injected for testing via inject-intent-request.

Application Mode

When developmentMode is set to application, access through the appman-controller tool is restricted to the packages and applications that are covered by a developer certificate loaded at runtime. This mode is designed for third-party developers who should only be able to manage their own packages on the device, without gaining access to system packages or other developers' packages.

Setting the Developer Certificate

Before using any package- or application-specific operations in application mode, a developer certificate must be set using appman-controller:

appman-controller set-developer-certificate developer.p12

The certificate is a PKCS#12 file that encodes the package IDs the developer is authorized to work with, stored in the subjectAltName X.509v3 extension as URI:qtam://packageid/... entries. For details on creating certificates, see Package Installation.

The current developer certificate persists across application manager restarts; it is saved in the application manager's data directory. Clearing it is done with:

appman-controller set-developer-certificate --clear

Access Restrictions

Once a developer certificate is set, the following restrictions apply when using the appman-controller tool via the development mode D-Bus interface:

  • Package and application visibility: Only packages and applications whose IDs match the developer certificate are listed or accessible. Packages and applications belonging to other developers or to the system are hidden.
  • Installation task visibility: Only installation tasks initiated through the development mode D-Bus interface are visible. System-initiated tasks are not accessible.
  • Developer-signed package installation: Installing a package that carries only a developer signature (without a store signature) requires the package ID to match the currently set developer certificate, and the developer signature itself must have been created with the same certificate.
  • System-wide operations: Operations that are not scoped to a specific package or application, such as taking a screenshot of the entire display, are not available. Application-specific variants of such operations remain accessible for matching applications.

Workflow Example

A typical application developer workflow using application mode:

On the development machine:

# Sign the package with the developer's own certificate
appman-packager dev-sign-package myapp.ampkg myapp.dev-signed.ampkg developer.p12

On the device:

# One time only: set the developer certificate in the running application manager
appman-controller set-developer-certificate developer.p12

# Install the developer-signed package
appman-controller install-package myapp.dev-signed.ampkg

# Start the application
appman-controller start-application com.example.myapp

# Testing: Inject an intent
appman-controller inject-intent-request com.example.myapp.action '{"key": "value"}'

Relation to Other Security Flags

Development mode interacts with the following related configuration options:

OptionInteraction
flags/noSecurityDisables all security checks including signature verification. Using this flag makes development mode unnecessary for package installation, but is even more permissive and should only be used in controlled local development environments.
flags/allowUnsignedPackagesAllows installation of completely unsigned packages. In application mode, this flag still requires a matching developer certificate when a package originates from a developer D-Bus client.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.