bateria
performance
mobile
otimizacao
ux
observabilidade

Battery Consumption in Apps: Comparison and Checklist

Battery Consumption in Apps: Comparison and Checklist

Battery consumption is one of the most decisive factors in user satisfaction in applications. Even when the app delivers value, if it aggressively drains energy, the perception of quality drops quickly. The user does not measure consumption just by percentage, but by sensation: if the cell phone heats up, if the charge ends early, if the system suggests limiting the app, all of this becomes a sign of a problem. Therefore, thinking about the battery is not a technical detail, it is a central part of the product.

This guide covers the topic from end to end. You will understand what really consumes energy, how to measure it, how to compare scenarios, how to identify culprits in the code, what trade offs to make, and how to create an optimization checklist that can be applied to any team. The focus is practical, with clear language, comparative tables and good practices that work in both native and hybrid apps.

Why drums are a product topic, not just a technical one

In mobile, battery means usage time and freedom. The more autonomy, the more the user explores features, the more they trust the app and the less chance of uninstallation. This directly impacts retention, in-store evaluation and conversion. Apps that drain battery not only lose users, they also generate costs for support and reputation.

In many cases, battery problems are mistaken for random bugs. The app becomes slow, the system kills processes, notifications stop arriving and the user blames the app. These failures are not always logical bugs, but symptoms of a poorly optimized app. Therefore, whoever leads the product needs to treat consumption as an indicator of quality, as well as crash rate and loading time.

What really consumes battery in an app

The battery is not drained for a single reason. In practice, it is a set of factors that add up: CPU, GPU, network, sensors, disk, location, screen and background processes. The combination of these elements creates a light or heavy app. An app can have little CPU usage, but keep the screen active and send requests every few seconds, and this still generates high consumption.

Below are the main villains:

  • CPU in constant use, especially in loops, intensive parsing and excessive encryption.
  • GPU and UI rendering with heavy animations and unnecessary effects.
  • Network active in a short interval, with frequent polling or unnecessary downloads.
  • High precision location on all the time.
  • Bluetooth, NFC and sensors running in the background without criteria.
  • Wake locks maintained for a long time, preventing the device from sleeping.
  • Constant disk writing, logs and cache without strategy.
  • Badly configured notifications, which wake up the app all the time.

The energy used by any component depends on the time of use and intensity. The same task may have a small impact if performed once an hour, but a huge impact if performed every 5 seconds. The focus should always be to reduce frequency, reduce duration and reduce the work performed.

Essential concepts for measuring consumption

To improve battery life, you need to measure it. Correct medication avoids guesswork and saves time. There are four concepts that help interpret results:

  1. Baseline: base state of the app without interaction. Standby consumption needs to be low. If the app consumes a lot even when stopped, there is a serious background problem.
  2. Burst: consumption peaks during specific tasks, such as upload, camera or maps. Peaks are acceptable, but cannot be long.
  3. Typical use: most common user flow. This is the metric that most impacts perception.
  4. Extreme use: stressful scenarios, such as using the app for 1 hour on a weak network, with video and GPS at the same time.

Without these points, you cannot compare versions or features. The ideal is to always test with the same script and on the same device or equivalent devices.

How to compare battery consumption between versions

Comparing battery consumption requires consistency. If you test on different days, with different brightness, different network and different apps running, the result is not valid. Therefore, establish a simple comparison protocol:

  • Same device and same system version.
  • Fixed brightness and standard volume.
  • Economy mode off.
  • Apps in the background closed.
  • Controlled network, preferably stable Wi-Fi.
  • Identical usage itinerary and timed.

With this protocol, you measure the percentage of battery consumed in a fixed time, for example 30 minutes. If version A consumes 5% and version B consumes 8%, the difference is relevant. The important thing is to repeat the test at least three times to reduce noise.

Practical battery indicators for product teams

You won't always be able to measure watt-hours, but there are simple indicators that help the team monitor progress:

  • Consumption per minute of active use: percentage spent per minute in a standard flow.
  • Standby consumption per hour: percentage spent when the app is not open.
  • Time until 20% battery: estimated time of continuous use until the battery drops to 20%.
  • System usage report: iOS and Android show consumption per app; Following this list indicates whether the app appears at the top.

These indicators allow you to set goals and monitor regression. If a new feature increases consumption, this becomes visible.

Comparative table of energy impact by type of resource

The table below summarizes the relative impact of common features across apps. The values ​​are not absolute, but they help to prioritize.

ResourceEnergy impactObservationTop tip
High precision GPSHighConsumes battery quicklyUse low precision when possible
Full screen videoHighGPU and constantly active screenReduce frame rate and automatic brightness
Audio streamingMediumSmaller than video, but constantSmart cache and adaptive bitrate
Frequent Network PollingMedium to highKeep radio activeMigrate to push and batching
Complex animationsMediumGPU and CPUSimplify transitions
Background synchronizationMediumDepends on data volumeSchedule and use backoff
Push notificationsBassIf configured correctlyAvoid waking up the app unnecessarily
Sensor readingVariableDepends on the sensorTurn off when not in use

This table does not replace actual testing, but provides a basis for discussing priorities.

Quick diagnostic checklist

Before messing with the code, do a quick diagnosis to find obvious problems. Use this checklist:

  • Does the app consume battery even when it is not open?
  • Are there background services running unnecessarily?
  • Does the app rank at the top of the system's consumption ranking?
  • Does the device heat up during simple flows?
  • Are there very frequent network requests without justification?
  • Does the app keep the screen active unnecessarily?
  • Is the location active all the time?
  • Are there excessive logs and constant writing to disk?

If you answer yes to several questions, there is a high chance of high consumption. From there, you choose the tools to investigate.

Tools to measure consumption on Android

On Android, there are native and external tools. The main ones:

  • Battery Historian: allows you to analyze consumption per process and identify wakelocks. Excellent for background debugging.
  • Android Studio Profiler: shows CPU, memory and network in real time. Helps correlate consumption and peaks.
  • adb dumpsys batterystats: generates detailed reports. It requires knowledge, but it is powerful.
  • System Settings: the consumption list per app is simple, but useful for validating the impact on the real user.

The combination of Battery Historian and profiler is usually sufficient for most cases.

Tools to measure consumption on iOS

On iOS, data access is more restricted, but there are still good options:

  • Instruments (Energy Log): shows energy, CPU and GPU with detailed timeline.
  • Xcode Metrics: analyzes network, CPU and energy usage in tests.
  • Battery report on iOS: the user sees the consumption per app, and you can compare it with similar apps.

The key on iOS is to optimize background tasks and avoid abusing location.

Optimization principles that always work

There are universal principles that reduce consumption. They serve as a general guide:

  1. Less frequency: everything that runs every second can run every minute or more.
  2. Less duration: any task should last as little time as possible.
  3. Less work: reduce data volume, image size and layout complexity.
  4. Less competition: parallel tasks can consume more than necessary.
  5. Fewer wakeups: the fewer times the app wakes up the system, the better.

These principles apply to the network, CPU and sensors. Always question the real need for the task.

Network optimization: the biggest hidden gain

The grid is one of the biggest energy drains. Each time the app activates the radio to send or receive data, the system exits saving mode. This means that small, frequent requests spend more than a large, well-grouped request.

Good practices:

  • Batching: grouping several requests into a single submission.
  • Caching: avoid downloading the same content repeatedly.
  • Delta sync: send only differences, not the complete object.
  • Retry with backoff: avoid looping attempts in a bad network.
  • Compression: reduce payload size.

A simple strategy that generates results is to reduce the synchronization frequency and increase the interval when the app is in the background.

Location optimization

Location is another villain. High precision GPS consumes a lot. Use low precision when the objective does not need exact coordinates. It is also important to turn off the location as soon as the objective is reached.

Examples of approach:

  • For delivery apps, use high precision only during delivery.
  • For news apps, use location only on first access.
  • For fitness apps, allow the user to choose the level of accuracy.

Another practice is to use geofencing instead of constant updates. The system optimizes consumption when the app uses appropriate APIs.

CPU and rendering optimization

CPU in constant use and a clear symptom of consumption. Bad loops, large JSON, excessive encryption, and heavy animations are common causes.

Recommendations:

  • Avoid polling loops. Swap for events.
  • Reduce complexity of parse and intermediate objects.
  • Turn off background animations.
  • Avoid unnecessary re-rendering in reactive frameworks.
  • Use lazy loading for large lists.

When the app renders efficiently, the user feels the device is cooler and more responsive.

Background tasks: the dangerous field

Background tasks are powerful, but they can destroy your battery if used carelessly. The ideal is to use the system's APIs, which already limit frequency and group executions.

On Android, use WorkManager and JobScheduler. On iOS, use BackgroundTasks and Silent Push. Avoid starting constant services, especially if the user does not see an immediate benefit.

A rule of thumb: if the user has not explicitly requested a task, it should not run in the background with high frequency.

Common case: chat and notifications

Chat apps tend to consume battery when using poorly configured persistent connections. The solution, almost always, is to use push notifications and only open a connection when the user is active.

To reduce consumption:

  • Use push notifications instead of polling.
  • Avoid keeping sockets active in the background.
  • Adjust the connection heartbeat.
  • Suspend updates when the app is in the background.

These measures reduce consumption without affecting the experience.

Common case: infinite feeds and social networks

Feeds with infinite scrolling generate consumption because they make constant requests, load large images and keep the processor active during scrolling.

Good practices:

  • Upload images in suitable sizes.
  • Use lightweight placeholders.
  • Prefetch only part of the content.
  • Limit animations on scroll.

This prevents the app from becoming an energy drain during long sessions.

Common case: video apps

Video is one of the heaviest loads. Even so, there are possible optimizations:

  • Dynamic bitrate adjustment.
  • Reduction in frame rate when the user does not interact.
  • Turn off extra visuals.
  • Allow offline downloading, reducing network usage.

These strategies help balance quality and battery life.

Optimization checklist per layer

Use this checklist to review your layered app. It helps you quickly identify high-impact areas.

Network

  • Are requests grouped into batches?
  • Is there an efficient cache?
  • Does the app prevent frequent polling?
  • Are payloads compressed?
  • Is there a retry with backoff?
  • Is background synchronization limited?

CPU and memory

  • Are there frequent loops or jobs without pausing?
  • Is there excessive JSON parsing?
  • Does the app avoid unnecessary recalculations?
  • Are large objects released correctly?
  • Does the app prevent leaks that force the system to work harder?

UI and GPU

  • Are animations really necessary?
  • Is there excessive re-rendering?
  • Are images optimized?
  • Are transitions simple?
  • Does the app avoid keeping the screen active unnecessarily?

Sensors and hardware

  • GPS is only used when necessary?
  • Is the camera only opened during use?
  • Are Bluetooth and NFC turned off when inactive?
  • Are secondary sensors being used unnecessarily?

Background

  • Are background tasks scheduled by the system?
  • Does the app prevent long wake locks?
  • Are silent notifications limited?
  • Does background sync respect appropriate times?

This checklist can be incorporated into feature review and QA.

Comparison: light app vs heavy app

The best way to understand the impact and compare. A lightweight app does not mean poor in resources, but rather intelligent in using the device. Below is a simple comparison:

AppearanceLightweight AppHeavy App
SyncBatch, larger intervalsConstant polling
LocationOn DemandAlways on
UISimple animationsComplex and constant animations
ImagesOptimized and responsiveLarge uncompressed images
BackgroundScheduled tasksAlways-on services
NetworkCache and deltaRepeat downloads
ExperienceNo heatingFrequent heating

This comparison is useful for educating stakeholders and justifying optimization priorities.

How to create battery consumption goals

Goals help the team stay focused. A simple way and define:

  • Maximum consumption for 30 minutes of typical use.
  • Maximum consumption per hour in the background.
  • Limit of wakelocks per hour.

These goals vary by category. A map app naturally costs more than a reading app. But even on maps, there are acceptable limits.

Integrating battery into the development cycle

To ensure continuous improvement, batteries need to enter the development cycle:

  • During ideation: evaluate the energy impact of the feature.
  • In design: avoid flows that keep the screen on unnecessarily.
  • In implementation: use efficient APIs and avoid polling.
  • In QA: run consumption script and compare with baseline.
  • No release: monitor user feedback about battery.

This reduces regression and prevents consumption from getting worse with each version.

How to deal with battery trade offs

It is not always possible to reduce battery power without loss. Some common trade offs:

  • Reduce image quality to save energy.
  • Increase sync interval and lose instant update.
  • Use low precision location and lose details.
  • Reduce animations and lose premium feel.

The role of the product is to decide which trade off makes sense. In many cases, the user prefers greater autonomy than visual details.

Final release checklist

Before releasing, use this final checklist:

  • The app does not appear at the top of the system consumption.
  • Consumption within 30 minutes of use is typical and acceptable.
  • Background consumption is low.
  • There are no long or excessive wakelocks.
  • The location is not active without use.
  • Network requests are grouped.
  • The app does not heat up during normal streaming.
  • Internal feedback does not indicate battery drain.

If this checklist is followed, the chance of real problems is greatly reduced.

How to measure consumption in the laboratory and in the field

Measuring the battery only in the laboratory is useful, but not sufficient. Actual user behavior includes unstable network, high brightness, multitasking, and dozens of apps in the background. The ideal is to combine controlled tests with signal collection in production. In the laboratory, you create repeatability; in the field, you validate whether the gain really appears in real life. The two together bring confidence to decide releases and avoid regression.

In the laboratory, use a standard device, with a calibrated battery and the same initial state. The test script needs to be detailed, with clear steps and measured time. In production, the focus should be on indirect signals: time of use, return rate, complaints, and the system's consumption ranking. Although you don't have exact watt-hours in production, the aggregate behavior speaks volumes. If the uninstall rate increases after a release, and several users complain about the battery, this becomes a warning sign.

One practice that works well is to create a small internal group with standard devices. Each release goes through this group and a simple roadmap. At the same time, the team observes support data and reviews in the store. This crossover reduces risk and accelerates learning.

Test methodology with script and results table

A good test script needs to reflect the real user flow. If the app is for delivery, the itinerary needs to include search, map, product selection, payment and tracking. If the app is content, it includes scrolling, video and sharing. Below is an example of a standard 30-minute itinerary:

  1. Open the app, log in and load the home page (5 min).\n2. Navigate through 3 main screens (5 min).\n3. Perform the product's core action (10 min).\n4. Perform a secondary action, such as sharing or saving (5 min).\n5. Leave the app in the background (5 min).

The objective is not just to measure total consumption, but to understand where the peaks are. Use a results table to compare versions:

| Version | Total consumption in 30 minutes | CPU spike | Weather in background | Observations |\n| --- | --- | --- | --- | --- |\n| 1.4.0 | 7% | 65% for 2 min | 5 min | Spikes when opening map |\n| 1.5.0 | 9% | 82% for 4 min | 5 min | New animations |\n| 1.5.1 | 6% | 55% for 2 min | 5 min | Optimized cache |\n+ With this table, it is clear whether a feature worsened consumption and which part needs adjustment. The team is able to make decisions based on data instead of opinion.

How to interpret Battery Historian and Energy Log

Diagnostic tools may seem complex, but they don't have to be. The main objective is to identify when the app prevents the device from sleeping, or when a feature is active for too long. In Battery Historian, the two most important lines are wakelocks and jobs. If there are many long wakelocks, the app is forcing the CPU to stay active. If there are many jobs in sequence, there may be excessive synchronization.

In the iOS Energy Log, observe the energy graph and CPU spikes. If the power line stays high even when the app is in the background, something is wrong. Another signal is network usage time. If the network is active in the background, it is worth reviewing the sync strategy.

Don't try to interpret everything at once. Start with two questions: does the app wake up the device unnecessarily? and the app is active in the background when it should be sleeping? Resolving this already generates great improvement.

Variables that influence consumption and confuse tests

There are variables that change the results without the app changing. If you don't control, you can draw wrong conclusions:

  • Screen brightness: and one of the biggest consumers. Adjust and fix.\n- Network: 4G and 3G use more than Wi-Fi.\n- Degraded battery: old devices consume faster.\n- Ambient temperature: heat reduces battery efficiency.\n- Apps in the background: interfere with total consumption.\n Before concluding that there has been regression, make sure that the tests were comparable.

Optimization in hybrid and cross-platform apps

In hybrid apps like React Native, Flutter and WebView, there are extra layers that can increase consumption. Inefficient use of bridging between JS and native can lead to high CPU. Another risk is the lack of care with re-rendering, which is more common in reactive frameworks.

Good practices for hybrids:\n

  • Avoid setState at high frequency.\n- Debounce in scroll and input events.\n- Reduce listeners that are active all the time.\n- Optimize images and reduce shadows and blur.\n- Use native components when the flow requires performance.\n Even in hybrid apps, the biggest gain usually comes from reducing network and background, not from UI micro-optimizations.

Impact of third-party SDKs and advertising

Third-party SDKs are a common cause of consumption. Analytics, ads, push, and anti-fraud SDKs can add background tasks, persistent connections, and invisible network calls to the team. If the app becomes heavy for no apparent reason, review the SDKs. Check which ones run periodic jobs and which ones keep services active.

A recommended practice is to isolate SDKs and measure consumption with and without them. If an SDK consumes too much, evaluate alternatives or adjust settings. In ads, reduce banner refreshes and prefer formats that do not require constant networking. In analytics, aggregate events in batches to reduce requests.

Production monitoring strategies

In production, you don't have complete access to power metrics, but you can monitor indirect signals. Some examples:\n

  • Uninstall rate after release.\n- Reviews mentioning battery or heating.\n- Average session time before abandonment.\n- Frequency of app opening.\n- Percentage of users with economy mode active.\n Match these signals with internal logs. If session time drops and support receives battery complaints, there is a strong indication of regression. These signals allow you to adjust quickly without waiting weeks.

Product checklist and communication with the user

Not all optimization is invisible. In some cases, the user needs to understand why a feature asks for location permission or why a task runs in the background. When the app explains it well, the user tolerates consumption better. Therefore, the product team must review:\n

  • Permission texts in clear language.\n- Warnings when a heavy task is active.\n- Options to limit consumption, such as economical mode.\n- Explanation of why the app uses location.\n This communication reduces complaints and improves the user's perception of control.

30-day action plan to reduce battery

If the app suffers from high consumption, an action plan helps organize the work. An example of a 30-day plan:\n

  • Week 1: measure baseline, identify top 3 causes, create test script.\n- Week 2: optimize network and background, reduce polling, implement cache.\n- Week 3: review use of location and sensors, adjust accuracy.\n- Week 4: optimize UI and images, reevaluate SDKs, compare results.\n At the end, repeat the script and compare it with the baseline. This creates a cycle of continuous improvement.

Questions to review PRs and new features

To avoid regression, include simple questions in each review:\n

  • Does this feature generate additional requests? At what frequency?\n- Does it depend on location or sensors? How precisely?\n- Does it run in the background? At what interval?\n- Does this feature add heavy animations?\n- Does it add new SDKs? What jobs do they perform?\n This preventive checklist prevents problems before they reach the user.

How the operating system saves energy

Understanding system policies helps you create more efficient apps. On Android, there are modes such as Doze and App Standby, which restrict background activities when the device is stopped or when the app is not used for a long time. On iOS, background tasks are limited and run in short windows. If the app tries to escape these rules, the system may limit or terminate processes, and this creates instability.

On Android, apps are placed in usage "buckets" (active, working set, frequent, rare). The more the user uses it, the more freedom the app has. If the app tries to run frequent jobs while it is in a less active bucket, the system may delay or block, which wastes battery life without real gain. Therefore, planning jobs based on user priority is essential.

On iOS, if the app tries to keep tasks constant in the background, the system may deprioritize or suspend the app. Instead of trying to avoid this, the correct strategy is to align the app with the expected behavior of the system.

Energy budget by functionality

A practical way to discuss batteries with stakeholders and create an energy budget by functionality. Think of it as a financial budget: each feature has an acceptable energy limit. This helps prioritize optimizations and prevents new functionality from compromising the entire app.

Example quote:\n

  • Feed and reading: low consumption.\n- Maps and routes: medium to high consumption.\n- Video and streaming: high consumption, but concentrated.\n- Background sync: low consumption, but continuous.\n When defining this budget, the team makes it clear that not all features can consume the same level of energy. This creates discipline and prevents consumption from escalating over time.

Common antipatterns that drain battery

Some errors are repeated in practically all apps. Identifying these anti-patterns accelerates improvement:\n

  • Polling every few seconds to update data.\n- Looping animations even without interaction.\n- Background jobs that run even when the user hasn't opened the app in days.\n- Simultaneous synchronization of several modules.\n- WebViews with heavy content that runs scripts without control.\n- Permanent debug logs in production.\n- Uploading photos without compression.\n- Reload complete data when only a part changes.\n Avoiding these errors brings immediate gains without major refactors.

Table of recommended synchronization intervals

When there is no clear business rule, use conservative ranges. The table below shows common suggestions:\n | Data type | Recommended range | Note |\n| --- | --- | --- |\n| News and editorial content | 30 to 60 min | Updates without impacting battery |\n| Non-critical financial data | 15 to 30 min | Adjust according to urgency |\n| Critical messages | Push with fallback | Avoid polling |\n| Location update | On Demand | High precision only in specific tasks |\n| Inventory Sync | 1 to 4 hours | Can be in the background |\n These ranges are just a starting point. The ideal is to use the lowest frequency that still preserves value for the user.

Battery, temperature and perceived performance

When consumption increases, the temperature of the device rises. This activates protection mechanisms, which reduce performance. The user notices slowness and associates it with the app, even if the problem originates from energy consumption. This chain effect is one of the biggest reasons to treat batteries as part of the user experience. A cold app tends to be perceived as fast, while an app that heats up generates negative perception, even if its screens are beautiful.

Therefore, when evaluating performance, don't just look at FPS and loading time. Also observe temperature and stability. If the app heats up during simple tasks, a sign of high CPU or excessive network usage.

Caching strategies to reduce energy

Cache is not just performance. It reduces network usage and, consequently, energy consumption. There are three types of cache that help:\n

  • In-memory cache: good for temporary data, but consumes RAM.\n- Disk cache: ideal for images and documents, with expiration.\n- Smart cache: stores most used data and invalidates based on version.\n The secret is to define clear policies. For example, images can have a 7-day expiration, profile data can have a short expiration, and listing data can only be updated when the user pulls refresh. These policies prevent unnecessary requests.

How to handle battery in apps with WebView

Apps with WebView can hide high consumption because scripts and animations run inside the built-in browser. To reduce consumption:\n

  • Disable video autoplay.\n- Limit animations and effects in CSS.\n- Avoid scripts that run in short intervals.\n- Only load what is necessary on the first screen.\n- Use Service Worker with caution, as it can keep work in the background.\n By controlling web content, you prevent the app from becoming a heavy browser.

Permission policies and impact on consumption

Permissions such as background location, notifications and Bluetooth access increase consumption potential. Ideally, ask for permission only when the user understands the value. If the app asks for permission on first access, the user may deny it, and you lose the chance to explain. When permission is requested at the right time, you increase the grant rate and reduce complaints.

This care also reduces consumption. Permissions activated without real use only create background tasks and drain battery power.

How to set up an internal benchmark

An internal benchmark compares your app to competitors. Use the same device and the same script. If the competitor consumes less, this helps justify investments in optimization. The benchmark also helps to calibrate goals. If your app consumes 10% in 30 minutes and your competitor consumes 6%, there is clear room for improvement.

Create a spreadsheet with data and update it every quarter. This becomes a product and strategy instrument, not just a technical one.

Battery-focused QA checklist

QA can help a lot in controlling consumption if you have a simple script:\n

  • Run typical usage script and record consumption.\n- Run app in the background for 1 hour and measure consumption.\n- Check if location is active without use.\n- Check if the app heats up during normal browsing.\n- Validate that notifications do not wake up the app unnecessarily.\n- Compare with previous version.\n This checklist prevents new versions from increasing consumption without the team noticing.

Quick FAQ about battery in apps

Why does my app consume battery even when closed? Usually due to background tasks, services or very frequent synchronization. Check wake locks and scheduled jobs.

How do you know if consumption is high for the category? Compare with similar apps on the same device. If yours appears above, there is a problem.

Push notifications use a lot of battery? In general, no, as long as they are well configured. The biggest expense comes from notifications that wake up the app repeatedly.

GPS always consumes a lot? Yes, especially at high precision. Use only when necessary.

Cache helps with battery? Yes, because it reduces network usage, which is a major energy consumer.

Does battery optimization harm performance? Not necessarily. In many cases, it improves performance because it reduces unnecessary work.

Conclusion

Battery consumption is not just a technical detail. And a central attribute of quality. An energy-efficient app delivers more value, increases user confidence and improves retention. The good news is that most of the improvements come from simple good practices: reducing task frequency, using cache, avoiding constant location and controlling the background.

With the checklist and principles in this guide, your team can diagnose, compare and improve battery consumption in a structured way. The result is a lighter, more reliable and more competitive app.

Also read