On This Page
1Overview2NFR Categories and Standards
3NFR Measurement Tooling4Anti-Patterns to Avoid
5References

Overview

Mobile NFRs differ from backend NFRs in one critical dimension: the measurement environment is hostile and heterogeneous. A backend service runs in a controlled data centre on known hardware. A mobile application runs on thousands of device models, across six major Android versions, across variable network conditions from gigabit Wi-Fi to 2G cellular, in contexts ranging from a banker reviewing a transaction at a desk to a field worker scanning documents in direct sunlight on a cracked screen.

NFRs must be specified with this hostile environment in mind. "The app shall be fast" is not an NFR. "Cold start shall complete in under 2.0 seconds on the 25th-percentile Android device (3-year-old mid-range) measured by Firebase Performance Monitoring across the production user base" is an NFR.

NFR Categories and Standards

Performance

Cold start (process not in memory): under 2.0 seconds on median device. Warm start: under 200 milliseconds. Hot start: under 100 milliseconds. Sustained frame rate: 60fps with no jank frames exceeding 16.67ms. Time to interactive on critical screens: under 1.5 seconds. Network payload per session: defined per app vertical (financial apps typically under 500KB per session on cellular).

Reliability

Crash-free users rate: above 99.5% measured by Firebase Crashlytics across the production install base. ANR (Application Not Responding) rate on Android: below 0.2%. Force-close rate: below 0.1%. Successful API call rate: above 99.0% (failures isolated at the Repository layer with retry).

Availability

The mobile application itself is always available (it is on-device). The NFR is the graceful degradation under network unavailability — the application must remain usable for read operations using cached data when network is unavailable, with clear staleness indicators.

Security

OWASP MASVS Level 1 minimum for all applications. Level 2 mandatory for financial services, healthcare, and government. Mandatory controls: hardware-backed credential storage, OAuth 2.0 + PKCE, TLS 1.2 minimum, certificate pinning for regulated apps, no PII in logs.

Accessibility

WCAG 2.2 Level AA compliance for all screens. All interactive elements must have accessible labels. Dynamic Type / font scaling must be supported across all 12 size categories. Touch target minimum: 48×48dp Android, 44×44pt iOS. Colour contrast ratio: 4.5:1 for normal text, 3:1 for large text.

Maintainability

Test coverage: Use Cases above 90%, ViewModels above 80%. Code duplication below 5% (measured by SonarQube). Technical debt ratio below 10%. Build time under 5 minutes for a full clean build (enforced by Gradle build caching and modularisation).

Battery and Resource Efficiency

Background battery usage below 2% per hour when app is backgrounded with no active work. Memory baseline below 150MB on the median device. Wake lock acquisitions: zero unless actively processing user-requested background work (WorkManager on Android, BGTaskScheduler on iOS).

NFR Measurement Tooling

NFR Category Primary Tool Secondary Tool Gate
Performance Firebase Performance Jetpack Macrobenchmark / Instruments CI regression alert
Reliability Firebase Crashlytics Google Play Android Vitals 99.5% crash-free SLA
Security OWASP Dependency Check Detekt Security / SwiftLint CI block on P1/P2 CVE
Accessibility Accessibility Scanner Accessibility Inspector (Xcode) Pre-release audit
Coverage JaCoCo / Xcode Coverage SonarQube PR gate
Build Time Gradle Build Scan 5-minute ceiling

Anti-Patterns to Avoid

⚠ 1. NFRs as Aspirations

Performance and reliability requirements written as "the app should be fast and stable" with no measurement methodology or threshold.

Hover to see the fix ↻
↺ Correct Approach

Every NFR has a numeric threshold, a measurement tool, a measurement frequency, and a responsible owner. NFRs are reviewed in sprint retrospectives, not only in post-incident reviews.

⚠ 2. Testing NFRs Only at Release

Running performance benchmarks and accessibility audits only before the App Store submission, discovering regressions with no time to fix them.

Hover to see the fix ↻
↺ Correct Approach

Performance benchmarks run in CI on every PR. Accessibility checks run on every UI component. Crash-free rate monitored continuously in production dashboards.

Flowchart

%%{init:{'theme':'base','themeVariables':{'fontSize':'14px','fontFamily':'IBM Plex Sans, system-ui, sans-serif','primaryColor':'#DBEAFE','primaryTextColor':'#1e3a5f','primaryBorderColor':'#2563EB','lineColor':'#374151','clusterBkg':'#F9FAFB','clusterBorder':'#D1D5DB','edgeLabelBackground':'#FFFFFF'},'flowchart':{'curve':'orthogonal','padding':30,'nodeSpacing':65,'rankSpacing':75,'useMaxWidth':true}}}%% flowchart TD subgraph PERF["⚡ Performance NFRs — CI Enforced"] direction LR CS["<b>Cold Start</b><br/>P50: ≤ 2.0s · P95: ≤ 3.5s<br/>Jetpack Macrobenchmark · Instruments"] FPS["<b>Frame Rate</b><br/>60fps sustained<br/>Zero jank frames &gt; 16.67ms"] MEM["<b>Memory</b><br/>≤ 150MB RSS at home screen<br/>LeakCanary · Instruments"] end subgraph REL["🛡 Reliability NFRs — Release Gates"] direction LR CFU["<b>Crash-Free Users</b><br/>≥ 99.5% on 28-day rolling<br/>Firebase Crashlytics"] ANR["<b>ANR Rate (Android)</b><br/>≤ 0.2% active install base<br/>Google Play Android Vitals"] API["<b>API Success Rate</b><br/>≥ 99.0% successful calls<br/>Repository error tracking"] end subgraph ACC["♿ Accessibility NFRs — Legal Requirement"] direction LR WCAG["<b>WCAG 2.2 AA</b><br/>All customer-facing screens<br/>Accessibility Scanner · Inspector"] DT["<b>Dynamic Type</b><br/>12 size categories supported<br/>Test AX1 through AX5"] TT["<b>Touch Targets</b><br/>48×48dp Android · 44×44pt iOS<br/>No clipping at any size"] end subgraph SEC_NFR["🔒 Security NFRs — Mandatory"] direction LR MASVS_N["<b>OWASP MASVS</b><br/>Level 1: All apps<br/>Level 2: Finance · Health · Gov"] PKCE_N["<b>OAuth 2.0 + PKCE</b><br/>No client_secret in binary<br/>Access token: memory only"] end PERF --> REL --> ACC --> SEC_NFR style PERF fill:#DBEAFE,stroke:#2563EB,stroke-width:2px style REL fill:#DCFCE7,stroke:#16A34A,stroke-width:2px style ACC fill:#FEF9C3,stroke:#CA8A04,stroke-width:2px style SEC_NFR fill:#FEE2E2,stroke:#DC2626,stroke-width:2px style CS fill:#BFDBFE,stroke:#2563EB,color:#1e3a5f style FPS fill:#BFDBFE,stroke:#2563EB,color:#1e3a5f style MEM fill:#BFDBFE,stroke:#2563EB,color:#1e3a5f style CFU fill:#BBF7D0,stroke:#16A34A,color:#14532D style ANR fill:#BBF7D0,stroke:#16A34A,color:#14532D style API fill:#BBF7D0,stroke:#16A34A,color:#14532D style WCAG fill:#FDE68A,stroke:#CA8A04,color:#713f12 style DT fill:#FDE68A,stroke:#CA8A04,color:#713f12 style TT fill:#FDE68A,stroke:#CA8A04,color:#713f12 style MASVS_N fill:#FCA5A5,stroke:#DC2626,color:#7f1d1d style PKCE_N fill:#FCA5A5,stroke:#DC2626,color:#7f1d1d

References

  1. ISO/IEC 25010:2011 — Systems and Software Quality Requirements and Evaluation (SQuaRE).
  2. Google — Android Vitals. play.google.com/console/about/vitals
  3. W3C — Web Content Accessibility Guidelines 2.2. w3.org/TR/WCAG22
  4. OWASP — Mobile Application Security Verification Standard v2.0.
  5. Apple — MetricKit Documentation. developer.apple.com/documentation/metrickit
Mobile Engineering Reference
← Mobile Development