You are on page 1of 69

Mobile App

Quality
Qual ty
The essential guide to improving your app’s
performance, stability and testing
2020 Instabug, All Rights Reserved.
About the author

Nezar Mansour

Nezar is a content creator at Instabug who specializes in baking and


eating cookies, creating trivia, and writing app quality resources.

He has written 70+ articles about app quality, performance, stability,


and testing.

Nezar spends his free time indulging in his favorite desserts or play-
ing games of all sorts from football to PlayStation.
Contents

I. Mobile app quality basics 5


1-What is mobile app quality? 6
2-Factors that affect mobile app quality 8
3-The cost of low-quality apps 12

II. Application performance 16


4-App performance monitoring basics 17
5-Monitoring and measuring app performance 20
6-Key app performance metrics 27
7-How to improve app performance 30

III. Mobile app stability 33


8-App stability basics 34
9-Top reasons for app crashes 38
10-How to fix the most common iOS crashes 42
11-How to fix the most common Android crashes 45

IV. Mobile app testing 49


12-Essential mobile app testing strategies 50
13-Improving your test coverage 56
14-Mobile app performance engineering and testing 60

V. Improve app quality with Instabug 64


I
Mobile app quality
basics
Chapter 1

What is mobile app quality?

The term quality is often thrown around to describe any sort of product or ser-
vice. In that sense, quality can mean a lot of things. If we’re considering quality
to be how fast or easy-to-use a mobile app is then it gets a bit complicated
because apps come in all shapes and sizes. Some apps attempt to do every-
thing you need, while others focus on a single function and try to do it well.

The way that we define app quality here is the fitness of the app for its in-
tended use. Factors that affect app quality include performance, stability, test-
ing, and usability, and these all come down to the end user experience. Some
performance and stability considerations include: Is it loading fast enough? Is

What is mobile app quality? 6


it draining the battery? Is it crashing constantly? Rigorous testing ensures that
an app performs well, is stable, and is usable. And finally, high quality apps
need to be user-friendly. Regardless of what the ultimate function of the app
is, users need to be able to interact with the app with ease. To be able to as-
sess mobile app quality, you can use a common set of quantifiable metrics to
compare apps against each other, or to compare how a single app’s quality
has changed over time.

With the abundance of mobile apps available, especially the number of apps
that claim to perform the same function, users are more sensitive to app qual-
ity as a differentiator when deciding which app to use. When users are select-
ing between five apps that all do the same thing, they probably won’t choose
to use the apps that crash, are slow, and are not regularly updated with bug
fixes and performance improvements.

What is mobile app quality? 7


Chapter 2

Factors that affect mobile app


quality

Mobile app quality can be broken down into four equally important areas de-
scribed below. In this book, we’ll focus on the first three: performance, sta-
bility, and testing.

1. Performance measures the technical aspects of your mobile app’s qual-


ity. Bad performance can make a mobile app unusable and users won’t hesi-
tate to delete it. Here are a few key aspects of performance:
• Speed: Performance relies greatly on how fast things are executed by
the mobile app. Speed in this instance has to do with screen transition

Factors that affect mobile app quality 8


speeds and how fast everything loads. If your app takes a longer than
usual amount of time to start, users will notice.
• UI performance: Since the UI is what your users will be interacting with,
it’s key that there are few to no hangs or other issues. If your app hangs
with every user command, it will feel slow and frustrating for your users.
• Network performance: One of the biggest factors affecting both speed
and performance is network calls. Most applications rely on multiple
services and network requirements. Any slow or failing network request
hurts the overall performance of your app and negatively impacts your
users’ experience.

2. Stability is in essence how reliable your app is. If an app is behaving the
way that it should, then it’s considered stable. App stability is commonly as-
sociated with crashes and errors. While it’s almost impossible to avoid any
crashes or errors, how often they occur is the measure of your app’s stability,
which in turn affects its quality.
• Crashes: The worst-case scenario of any user session is a crash. A crash
completely ends the user’s session and ruins their experience with your
app. Constant crashes are the biggest indicator of a poor quality app.
• Errors: Errors disrupt the user experience. If users experience too many
errors or too often, they will probably delete your app and download
one of your competitors instead.
• Resources: The most common cause of crashes and errors are resource
constraints. Apps are often developed in a vacuum, but in the wild, an
app would be running alongside a host of other apps. If an app con-
sumes too many resources, be it CPU usage, memory usage, or battery,

Factors that affect mobile app quality 9


this will negatively impact your app’s stability and users won’t hesitate
to delete it.

3. Testing is crucial in order to prevent unhandled errors and catch issues


before they get released into production. Integrating strong testing early on in
an app’s life cycle can save a lot of headaches and resources down the line.
• Functionality testing: Making sure your app is working as intended is
the bread-and-butter of testing. Functionality testing helps eliminate
any critical issues with the user journey and navigation flow of the app.
• Compatibility testing: Every user will have a different environment that
your app will run in. Compatibility testing helps make sure the app is
working as intended on the devices and in the different situations it was
intended for.
• Performance testing: Performance issues will disrupt the user experi-
ence and lower the quality of your app. Performance testing helps elim-
inate issues such as excessive battery consumption or resource use.

4. Usability refers to how the user interacts with your mobile application. If
a user finds it difficult to use your app, they are more likely to remove it and
leave a bad review. Usability is a rich topic that warrants its own book, but
when it comes to app quality, here are a few key aspects:
• User-friendliness: How easily your users are able to reach their goals
with your app. If your app is user friendly, that means your app is intui-
tive, easy to use, simple, and reliable for your target users. This can be
sometimes hard to quantify and can be very relative.

Factors that affect mobile app quality 10


• The flow of critical path: Every app has at least one core function. The
journey a user takes from launching an app to fulfilling this key purpose
is known as the critical path. This path will be where a vast majority of
your users will spend their time. How easy it is for users to get through
this critical path is an important measure of quality. This can be broken
down into how responsive, fast, smooth, and easy to follow the critical
path is.
• Onboarding: Apps don’t have a lot of time to impress new users. It’s very
important that users are taught simply and effectively how to achieve
their desired purpose with the app. This is called bringing users on-
board. Since the onboarding flow will be the first thing a new user will
interact with inside your app, it needs to be intuitive, easy to follow, and
effective. Effective might mean getting your users to your app’s “Aha!”
moment as fast as possible to demonstrate value, or it might mean get-
ting your users to invest time and effort into your app to encourage
stickiness. This will take some amount of trial, error, testing, and most
importantly getting first time users’ feedback to help guide your deci-
sion-making process.

Factors that affect mobile app quality 11


Chapter 3

The cost of low-quality apps

In an ideal world, every mobile team would want to make their app the highest
quality possible. In reality, we are faced with resource allocation constraints,
whether that is time, money, or engineering capacity. Compromising your
app’s quality in favor of something else comes with a lot of consequences.
Here are some of the key reasons why you should avoid releasing a low-qual-
ity app at all costs:
• 49% of users expect apps to start in two seconds or less
• 88% of app users will abandon apps based on bugs and glitches
• 51% would abandon an app completely if they experienced one or more
bugs per day

The cost of low-quality apps 12


• 94% of users uninstall mobile apps after 30 days from download. App
crashes cause 71% of those uninstalls.
• 80% of users notice glitches and bugs in apps
• 80% would give a poorly performing app three chances or less before
uninstalling it
• A whopping 53% of users uninstall or remove apps if they crash or do
not respond
• 36% of users will stop using an app due solely to heavy battery usage

A study of apps on the Play Store shows that 50% of one-star reviews men-
tioned app stability. Excessive battery usage, slow render times, and crashes
were among the key sources of frustration. Higher quality apps are more dis-
coverable in the Play Store than similar apps of lower quality. Higher quality
apps tend to have more users and less uninstalls.

Business impact
Mobile apps are not cheap to develop and maintain. And generating enough
user interest and daily active users (DAU) to increase revenue streams is
a huge challenge. Let’s take a look at what low app quality means for your
business bottom line.
• 65% of app users believe that companies don’t do enough to ensure
better user experience and fail to offer updated versions of apps with
fewer bugs
• 50% of app users are likely to be dissuaded from downloading an app
based on customer reviews that mention bugs and glitches
• 50% of adults under 50 always or almost always read online reviews

The cost of low-quality apps 13


when buying something for the first time
• 69% of users say that poor app experiences lower their opinions of the
company that created it

While an app is in development, the cost of not fixing a bug is multiplied


during the different phases of the software development lifecycle, accord-
ing to IBM:
• 100x cost in the maintenance phase
• 15x cost in the testing phase
• 6.5x cost in the implementation phase
• 1x cost in the design phase

After an app is released, the consequences of avoiding fixing app crashes


and bugs early on negatively impacts all areas of the business, including:
• Less revenue
• Higher Customer Acquisition Cost
• Poorer brand reputation

Benchmarks to meet
The reasons to avoid having a low quality app are clear, but since every app
is different, how do you know what metrics to measure? When it comes to
stability and performance there are a couple of standard industry bench-
marks that you should always aim to meet.
• 49% of users expect an app to respond in 2 seconds or less
• Based on an analysis of the top 100 apps, 39 apps start in under or
around 2 seconds, and 73 in under 3 seconds. Ideally, you should be

The cost of low-quality apps 14


targeting an app launch time of 1.5-2 seconds.
• The acceptable crash-free rate for mobile apps is 99% for users and
99.9% for sessions.

The cost of low-quality apps 15


II
Application
performance
Chapter 4

App performance monitoring


basics

What is Application Performance Monitoring (APM)?


At its core, Application Performance Monitoring (APM) is the monitoring and
sometimes management of key app performance indicators. The idea is to
help easily diagnose and assess different problems in relation to how an app
is performing. In an article back in 2012, Larry Dragich described APM as “The
translation of IT metrics into business meaning (value)”

Specifically, APM tools help monitor the end-user experience. This includes
metrics like how fast the application opens and how long it takes requests to
execute.

App performance monitoring basics 17


Why do you need APM?
With millions of apps on the various app stores, standing out amongst the
best takes significant technical effort. Apps that are buggy and constantly
crash will always be called out by users. Users are not afraid to let you know
what’s wrong with your app and give you a one-star rating. And with recent
changes to how app store ratings work, a new update that contains bugs will
drop an app’s rating immediately. App performance directly affects users’
satisfaction and experience, and this negatively impacts key business met-
rics like downloads, usage, retention, and revenue.

It’s important to have a mechanism for users to give you feedback. First, of-
fering a direct channel where you can collect private comments will prevent
users from posting their complaints on the app stores. Second, you’ll often
discover problems from these bug reports that don’t show up in other places.
Third, a robust bug reporting tool like Instabug will provide you with compre-
hensive data to help you quickly diagnose and fix problems.

But waiting for users to tell you what’s wrong can be very costly, especially
since user feedback can be vague. So while bug reporting is essential, the
best practice is to have an APM tool alongside your bug and crash reporting
tools. An APM tool will alert you about things like slow screen transitions, slow
network calls, and UI hangs that also negatively impact your end users’ expe-
rience. With an APM tool like Instabug’s, you can take a proactive approach
to discover and fix performance issues in your application before these prob-
lems become bug reports.

The best way to use APM is not to work backwards and fix issues that arise

App performance monitoring basics 18


late; ideally you’ll be working forwards to constantly monitor and continu-
ously improve your app’s performance. Instabug’s triple threat of APM, Crash
Reporting, and Bug Reporting tools will empower you to optimize your app’s
performance and deliver the high quality experience your users expect and
deserve.

APM components
According to Gartner Research there are three essential components of APM,
each with their own set of key metrics.
• End-user experience monitoring: tracks how your mobile app is behav-
ing from users’ perspective. This looks into aspects such as load times,
app slowness, or any errors.
• Application discovery, tracing, and diagnostics: assesses how the dif-
ferent components of your app are behaving from a diagnostic per-
spective. Determining whether particular logic is performing as desired
is important to understand how your app is performing overall.
• Application analytics: raw data that you can analyze, spot trends, and
learn insights to help inform decision making.

App performance monitoring basics 19


Chapter 5

Monitoring and measuring app


performance

Now that we know the importance of utilizing an APM tool to improve perfor-
mance, it’s time to look at what features you’ll need. To fully cover different
use cases and the three main components of APM, you’ll want an APM tool
that offers this essential set of features.

Crash and error reporting


The stability of an app affects its performance, and the biggest indicator of
app stability is how often your app is crashing or facing errors. You’ll need to
be alerted to app crashes in real time, and crash reports need to provide you

Monitoring and measuring app performance 20


with enough information to identify the severity of a problem, effectively diag-
nose issues, and act quickly to protect your app’s health.

Instabug’s crash reports offer comprehensive data to help developers fix problems fast

App launches
This is the first gate that your app users face. App launch monitoring shows
you how long users are waiting until the app loads and is responsive. A user’s
first impression is crucial and often sets the tone for the rest of their experi-
ence. If it starts with a long launch time, then you’ve already frustrated your
user before they’ve even got into your app, and they’re more likely to have a
negative overall impression.

You’ll need to monitor your app launches for each of your app versions to
have a complete picture of how your app is performing. You can also set a

Monitoring and measuring app performance 21


threshold for the app launch time you’re trying to achieve so that you can de-
termine if it’s poor, average, or good.

Instabug’s APM dashboard helps you spot trouble areas at a glance

UI hangs
You need to know if your users are experiencing any UI hangs, or if any part
of your app’s UI is unresponsive. If your app responds slowly, your users will
feel frustrated because they have high expectations. Users have been condi-
tioned to expect quick and accessible experiences, and if they face UI hangs,
it can cause them to abandon your app and hurt their impression of your
brand. UI hangs are assessed by comparing your app’s delay in responding to
a user input to the total amount of time they spend on a certain screen.

Instabug APM shows you a detailed distribution of UI hang occurrences to

Monitoring and measuring app performance 22


help you easily evaluate the performance of your app. You can also define
custom UI traces to monitor for more control over how your occurrences are
grouped. Filters and patterns help you quickly narrow down where an issue is
occurring and optimize accordingly.

Instabug’s APM dashboard shows you everything you need to know about your app’s UI

hangs

Network performance
While it is important to monitor service-side network performance, it doesn’t
represent the whole story. Tracking response times and errors from your us-
ers’ standpoint will also offer key insights about your app’s performance and
quality. Monitoring both will help you determine whether your app’s overall
network performance is poor, average, or good.
With Instabug’s SDK, you can track client/server-side network requests. To

Monitoring and measuring app performance 23


help you identify and act on issues faster, you’ll be alerted about common net-
work failures. For even more control and visibility, you can also track custom
URL patterns. And with different filtering options, you can easily spot trends
and pinpoint where problems are coming from.

Instabug’s APM tool monitors both server-side and client-side network performance

App traces
Another important aspect to measure is how long any client-side logic takes
to complete. An APM tool can automatically fetch app traces and determine
whether they are slow to execute. With Instabug, you can define custom ex-
ecution traces to track, and you can set target thresholds for your traces so
that you can easily spot where performance issues are occurring in your code
and not meeting your KPIs.

Monitoring and measuring app performance 24


Instabug’s APM tool shows you where your app is lagging and unresponsive

App apdex
With a lot of granular metrics like network calls, screens hangs, etc, it is hard
to tell how the overall app quality is doing. The app Apdex score takes several
variables into account and is a numerical representation of your app’s per-
formance. With this quick tell-all score, you’ll have a quantified signal of how
your app is doing. And it makes it much easier to align the team around one
KPI and communicate it to all stakeholders.

Instabug’s app Apdex score tells you whether your app’s overall user experi-
ence is Unacceptable, Poor, Fair, Good, or Excellent, and you can track it over
time and across versions. For more granular analysis, you can also see indi-
vidual Apdex scores for app launch, specific app traces, and specific network
requests.

Monitoring and measuring app performance 25


Instabug APM helps you easily understand how your app is performing

Monitoring and measuring app performance 26


Chapter 6

Key app performance metrics

More than ever, performance plays a key role in the monetary success of a
mobile app. Here, we’ll take a closer look at the key mobile app performance
metrics that you need to be tracking in order to optimize your app’s perfor-
mance and ultimately improve app quality. These metrics have the biggest
impact on the end-user experience, so it’s important to measure them and
understand what benchmarks to hit in order to meet and exceed users’ ex-
pectations.

App stability
One of the biggest indicators of an unusable app is how often it crashes.

Key app performance metrics 27


Users that encounter crashes are much more likely to uninstall an app than
any other reason. Using a crash reporting tool will alert you to any uptick in
errors and also help you catch issues early after a release before they be-
come widespread and catastrophic. App stability is measured in crashes per
session or user. The industry standards for crash-free rates to target are:
• Crash-free users > 99 %
• Crash-free sessions > 99.9 %

Wait times
An app doesn’t have to be completely unusable for it to be considered of
poor quality and worthy of being uninstalled. A huge part of an app’s perfor-
mance is assessing how long a user has to wait at launch, between screen
transitions, and after performing any requests. Let’s look at the different kinds
of wait times:
• App launch times: Speed is an essential part of app performance. Users
don’t like to wait and they especially don’t like slow apps. How fast your
app launches can set very important first impressions with your users
and goes a long way to retain them. App launch speed is very indica-
tive of the overall quality of your app and tracking it will help assess the
responsiveness of your app. Based on an analysis of the top 100 apps,
39 apps start in under or around 2 seconds, and 73 in under 3 seconds.
Ideally, you should be targeting an app launch time of 1.5 to 2 sec-
onds.
• Network response times: Network calls play a huge role in the speed
and responsiveness of your app. A study shows that to be competi-
tive, your app should respond to user requests within 1 second. It also

Key app performance metrics 28


indicates that many apps fail to meet that due to unreliable or slow ser-
vices. Usually, network performance is tracked on the server-side. And
while that is important, it only tells half of the story. Tracking client-side
network calls and their response times is also key when trying to fully
assess network performance.
• App trace completion times: Every app is built differently. To best un-
derstand your end users’ experience, you need to be able to assess
your client-side logic and see how long specific traces in your app take
to execute (2 seconds average). This will give you a deeper and more
granular picture of where your app is failing to meet users’ expectations
and ultimately help you to pinpoint and resolve issues faster.
• UI response times: No app performance metrics are complete without
an assessment of UI hangs. You need to constantly monitor the respon-
siveness of your app’s user interface for issues. Users can experience
UI hangs for various reasons and if there’s a longer than usual delay
(250ms on average) or a failure to respond to a user’s input, you need
to be aware of it in order to fix it as soon as possible before the negative
reports and comments come flooding in.

Using an APM tool


Instrumenting your app with an Application Performance Monitoring tool will
help you stay on top of how your app is doing in the wild and act proactively
to find problem areas in your app’s performance. With the Instabug SDK, you
can pair APM with Crash Reporting and Bug Reporting for a truly holistic view
so that you’ll be empowered to improve your overall app quality and deliver
an excellent experience for your users.

Key app performance metrics 29


Chapter 7

How to improve app performance

In addition to having the right tools in your app to monitor performance and
stability and collect user feedback, here are some basic tips for optimizing
your app’s speed and usability.

UI hangs and load times


• Image handling: Images are an integral part of any app, but they
take up a lot of memory and can subsequently slow down load-
ing time if not handled properly. Using lower quality images would
save on memory and load time, but at the cost of visual fidelity.

How to improve app performance 30


One way to work around this is image compression, which can save a
lot of time without sacrificing image quality. Second, not all devices are
the same size, so using vectors or resized images to fit different devices
can help you optimize for different screen sizes. Finally, caching is an-
other great way to cut down on loading times. By caching key images,
you can avoid having your app fetch them every time they’re needed.
• Reuse data templates to help your app load faster: Similar to image
caching, you can also utilize the same key data templates more than
once to avoid heavy loading times.
• Displaying loading states: While this doesn’t speed up actual loading
times, it does make a big difference to your users’ perceived wait. If
your user is just staring at a blank screen while your app loads, they can
perceive the loading time as longer than it actually is and since you’re
not giving them any information, they might even mistake it for a freeze
and abandon your app. Displaying loading states with colorful anima-
tions or helpful messages can go a long way to helping users tolerate
the wait.

App launch time


• Load essential items first: Text first, images later is a common prac-
tice when it comes to launching and loading core app processes. Some
things can be loaded asynchronously after the main components are
launched and the user can start interacting with the app. Choosing what
loads first and what can come second highly depends on the app, but
staging your component loading can help cut down launch times.
• Don’t leave users in the dark: Similar to loading states, an app

How to improve app performance 31


launching with a blank screen will give your users a negative perception
right off the bat. Instead, you can display a splash screen, an animation,
interesting content, and anything that will engage users’ attention while
they wait for your app to launch.

Network performance
• Offline mode: While this doesn’t affect network performance, it will help
you and your users in the event of network drops. If your users lose net-
work connection and your app doesn’t have an offline mode, their ex-
perience is completely interrupted, and when they regain connection,
you’ll have to reload everything again. Offline mode also allows your
users to continue using your app while not connected to the internet
and helps make the transition smoother when regaining network con-
nection.
• General network performance tips:
• Load data as you need it by splitting up assemblies or pre-loading/
pre-fetching data
• Make as few HTTP requests as possible. Although seemingly obvi-
ous, optimizing what each request does makes a huge difference
when you’re operating at a scale of millions of sessions.
• Using a content delivery network (CDN) will help accelerate APIs
and reduce latency for most of your app’s network requests
• Reduce your number of DNS lookups
• Avoid redirects because they involve new TCP connections, a TLS,
and then a DNS lookup, creating a lot of overhead

How to improve app performance 32


III
Mobile app stability
Chapter 8

App stability basics

According to a report by Qualitest, 88% of app users will abandon apps based
on bugs and glitches. One of the biggest challenges an app has to over-
come in order to be successful is stability. Making sure that your users have
a smooth and stable experience might not guarantee success, but an unsta-
ble app will definitely guarantee an app’s failure. Next, we’ll discuss mobile
app stability, how to measure it, and how to improve it.

What is mobile app stability?


Stability is in essence how reliable your app is. If an app is behaving the way

App stability basics 34


that it should then it’s considered stable. App stability is commonly associat-
ed with crashes. If your app crashed, it means that it suffered a fatal error, but
a single crash does not mean that your app is unstable. It’s virtually impossible
for an app never to crash given all of the variables in play. However, if your
app crashes often, then it is not considered stable.

When aiming for high app quality, it’s important to constantly measure and
monitor your app’s stability to make sure it isn’t failing your users.

How to measure mobile app stability


When it comes to measuring stability itself, there are a couple of different
ways to measure stability, or how often your app doesn’t crash. The most
common way to assess how often your app is not crashing is per session. This
is measured by the formula: (1-(Number of crash occurrences / total number
of sessions)) * 100. The resulting percentage is the calculation of your crash-
free sessions.

You could also measure the number of users that experienced a crash. Some-
times, a particular device could be causing a lot of crashed sessions, which
artificially lowers your stability score. The formula to calculate crashes by user
is: (1-(Number of users that experienced a crash / total number of users)) *
100.

You also want to consider recency. If your app was crashing over a year ago
and hasn’t faced any errors since then, it doesn’t make much sense to look
at absolute numbers. Adding time variables will help paint a more accurate

App stability basics 35


picture. If you have a huge number of sessions and users, then you might
want to measure stability daily. This will help you catch upticks in issues quick-
ly instead of after they snowball. The fewer sessions and users you have, you
could consider measuring weekly or even monthly. The equations will look
like this instead:
• (1-(Number of crash occurrences past 24 hours / total number of ses-
sions past 24 hours)) * 100
• (1-(Number of crash occurrences past week / total number of sessions
a past week)) * 100

App stability benchmarks


After determining what your crash-free rate is, you can use that baseline as
a benchmark for your app stability. Whatever your baseline is, you’ll want to
improve on it over time. If you want to compare your app’s stability to the
broader industry, in 2017, Qualitrix published an acceptable target of crash-
free rates for mobile apps:
• App crash-free users > 99 %
• App crash-free sessions > 99.9 %

If most apps are targeting these rates, you won’t want your app to fall below.
However, your goal should always be to improve against yourself and get the
best stability possible based on your own prior data.

Can crash-free rates be misleading?


Crash-free rates can tell you a lot about how your app is performing, but they

App stability basics 36


don’t always give you the whole picture. One crash might not upset a power
user since they’re more likely to be forgiving and assume that it’s a random
crash and an unusual event. A new user, on the other hand, won’t be as gen-
erous. The bigger problem occurs when a single user experiences multiple
crashes, especially in a row. The frequency makes it impossible to ignore.

This is why it’s important to have comprehensive crash reports with rich data
that can guide you to make smarter decisions. Instabug’s severity metric, for
example, ranks crashes from least to most severe based on different factors
including affected users. For the complete picture of your app’s quality, you’ll
want to pair Crash Reporting with tools like Application Performance Monitor-
ing so that you can be alerted about factors like long wait times and sluggish
responsiveness and also Bug Reporting so you can collect crucial user feed-
back.

App stability basics 37


Chapter 9

Top reasons for app crashes

In this chapter we’ll dive into the most common causes for mobile app crash-
es. Make sure to cover these basics for a stable, high quality app.

Resource management
It’s expected that developers want to build the best looking apps with hy-
per-fast performance. Sometimes the pursuit of that means severe resource
mismanagement.

One example is using up too much memory as a direct result of running too

Top reasons for app crashes 38


many threads. Another common mistake is developers assuming all of the de-
vice’s memory is devoted just to their app. In reality, most of it is already used
up by other apps. Ultimately, when the device running your app is using up
all of its memory and your app needs more, a crash will occur.

The same goes for CPU usage. Managing how processing intensive your app
is in order to avoid consuming too much CPU power is key to keeping your
app from crashing.

Network issues
A perk of the job can sometimes be a curse in disguise. When developing
your mobile app, you’re probably enjoying doing so with the comfort of high-
speed internet and WiFi. The reality of the situation is that most users will not
have such stable connectivity while using your app. A lot of users will be reli-
ant on mobile network data. That means that your users will likely experience
constant connection speed changes as well as frequent drops in connection.

If your app is dependent on a large portion of network resources, then con-


nection drops and slow internet will cause a lot of disturbances in your app.
These network issues need to be handled in development in order to avoid
crashes and stalls.

Error handling
Not every error should spell doom for your mobile app. Unexpected behav-
ior and errors are bound to happen, and sometimes they can be anticipated.

Top reasons for app crashes 39


Users will behave in unexpected ways, and no matter how stable your app is,
they can cause it to hang or crash. Unforeseen issues with your app can be
caused by unexpected user behavior. Users might enter an invalid parame-
ter in a field or stop a file transfer abruptly. So it’s important to always keep in
mind that unexpected circumstances can occur and you should handle errors
and issues accordingly.

Device differences
Not all devices are created equal -- not just across operating systems, but
even between different generations of the same device. Device specs im-
prove at an exponential pace, and a device from two years ago might not be
able to handle the resources required by your app today. Testing on a wide
range and age of devices and OEMs will go a long way to making sure your
app doesn’t experience unforeseen issues.

Testing
Today’s agile, iterative processes mean that developers are constantly up-
dating their apps with fixes to improve performance or updates that add new
features. Developers are in an ongoing cycle of shipping things and this cycle
comes with a lot of complexity. A single app is touched by multiple external
libraries and APIs as well as capabilities that serve different internal business
needs. With so many inputs, the chances of issues and crashes occurring
increases. Testing every separate component isn’t enough. You need to test
the entire app as a whole to make sure all components are functioning as
expected together.

Top reasons for app crashes 40


Without a doubt, the biggest and most important reason your mobile app
might crash has to do with the quality of testing. You need to subject your
mobile app to testing constantly and rigorously. It isn’t enough to just test your
app, it needs to be tested in different environments. This includes trying out
different devices, different orientations, resolutions, and networks. The more
you try to break your app internally and solve issues that appear, the less like-
ly they are to happen out in the wild. With proper testing, you can minimize
your app’s likelihood to crash.

Top reasons for app crashes 41


Chapter 10

How to fix the most common iOS


crashes

SIGSEGV
The most common crash users run into on iOS is SIGSEGV. It amounts to
about 50% of all crashes due to it being very generic. Broken down it is a
signal (SIG) sent to interrupt the code when a segmentation violation (SEGV)
occurs. This happens when your app attempts to access memory that has not
been allocated by the program (or memory that has recently been freed).

There are two common causes for the SIGSEGV crash. First, any variable that
has been deallocated then accessed from somewhere else will cause this
crash. Debug this issue by making sure the crash is consistent and try to

How to fix the most common iOS crashes 42


determine which object is being referenced after being deallocated.

Second, the crash also occurs in a low-memory situation where the device
frees objects to make room for system resources, which can make it difficult
to reproduce. Debug this by using a stack trace to go through the classes and
methods to find out the deallocated object that’s being referenced. A com-
mon cause is a dangling delegate or listener that has been deallocated.

SIGBUS
Similar to SIGSEGV, SIGBUS is also a signal (SIG) that indicates a bus error.
They are mixed up usually because they both attempt to access invalid mem-
ory. The main difference is that for SIGSEGV the logical address is invalid,
while for SIGBUS the physical address is invalid. This happens when the ad-
dress doesn’t exist entirely or when it has an invalid alignment.

This signal can be sent from most synchronous methods and often can be
found when the code attempts to access a lock.

EXC_CRASH (SIGABRT)
EXC_CRASH is an exception that basically means that the application termi-
nated in an abnormal way. SIGABRT is the most common cause of the EXC_
CRASH exception. It means that there is either an unhandled exception in the
code or that somewhere in the code abort() is being called.

This is a fairly straightforward crash to debug. The best way to go about

How to fix the most common iOS crashes 43


solving the issue is to get a stack trace of the crash and make sure it’s sym-
bolicated to be able to correctly pinpoint the unhandled exception.

EXC_CRASH (SIGKILL) 0x8badf00d


Another common cause of the EXC_CRASH exception is SIGKILL, also known
as the exception code 0x8badf00d. It indicates that due to a timeout, iOS has
terminated the application. This could be due to the application taking too
long to launch, terminate, or respond to system events. The most common
cause of this kind of timeout is the app not handling a background task cor-
rectly.

There are a couple of ways to debug a 0x8badf00d depending on the is-


sue. First, aim to eliminate background tasks that could be causing a timeout.
However, there could be other reasons for an 0x8badf00d crash. Looking at
a full stack trace of the crash can help you pinpoint where the issue occurred,
backtrace when the issue occurred and what caused it. Another useful way
to help you debug is to check the network log of the crash. This will help you
quickly diagnose any network request that took too long to complete and
might’ve caused the crash.

NSInvalidArgumentException
NSInvalidArgumentException is accompanied with the error message: “un-
recognized selector sent to instance”. This is a good indicator of the issue, the
“unrecognized selector” in this situation are classes exchanging methods that
aren’t recognizable. This usually means that a method that isn’t recognized by

How to fix the most common iOS crashes 44


an object is being called.

A stack trace can help you pinpoint where the exception is being thrown and
possibly the cause behind it. In the most common cause, look for an unrecog-
nized selector. And make sure that your code isn’t referencing unrecognized
methods.

How to fix the most common iOS crashes 45


Chapter 11

How to fix the most common


Android crashes

java.lang.NullPointerException
This is definitely the most common Android crash. Chances are if you’ve ever
developed an Android app then you have run into this error. The most com-
mon cause behind NullPointerException is for data being referenced after
going out of scope or being garbage collected.

A common event in which this occurs is when the app goes to the back-
ground, it usually gets rid of some memory. This results in some references
being lost and when the Android onResume() method is called again it can
result in the NullPointException error.

How to fix the most common Android crashes 46


Use a stack trace to detect where the error occurred to be sure. And to avoid
the error you should aim to save your data when the onPause() method is
called in a more permanent place to avoid losing references. Simply pull them
back out when calling onResume(). Generally, look to handle any potential
null pointers that could cause the error.

java.lang.IllegalStateException
This is one of the more common Android crashes that you will likely have en-
countered if you’ve dealt with fragments. The actual error IllegalStateExcep-
tion can occur from a multitude of sources but at the core of it, the reason is
mismanagement of Activity states.

This happens when a time-consuming operation is being done in a back-


ground thread and a new Fragment has been created in the meantime and
was detached to the Activity before the background thread finished. This re-
sults in calling a detached Fragment, throwing such an exception.
To fix this issue you should cancel the background thread when pausing or
stopping the Fragment. Also, you can use the isAdded() method to check
whether the Fragment is attached and then to getResources() from activity.

java.lang.IndexOutOfBoundsException
IndexOutOfBoundsException is one of the most common RunTimeExcep-
tions that you can run into. If you encounter this error it means that an excep-
tion was thrown to indicate that an index of some sort, usually an array (but
could be a string or a vector), is out of range while using, for example, List.

How to fix the most common Android crashes 47


There are some common ways that this crash will occur, like using a negative
index with arrays, charAt, or substring functions; if beginIndex is less than 0,
or endIndex is greater than the length of the input string, or beginIndex is
larger than the endIndex. Another reason is when endIndex - beginIndex is
less than 0. But probably the most common reason is when the input array/
string/vector is empty.

Fixing this issue is relatively simple, it’s always best to check the stack trace
whenever the error occurs. Knowing what caused the crash is a key first step.
After that, it’s a matter of validating that this array/string/vector isn’t dealing
with any of the common issues listed above.

java.lang.IllegalArgumentException
Probably the most varied and general cause of crashes on the list is the Il-
legalArgumentException. Its definition is the most simple and it is that your
argument is illegal. That could mean a lot and that’s why the cause behind
an IllegalArgumentException is very varied. There are, however, a couple of
common causes.

One of the more common causes is trying to access UI elements directly from
a background thread. Another is if you are trying to use a recycled bitmap.
Another common cause is forgetting to add an Activity to the Manifest. This
won’t be caught by the compiler since they are RuntimeExceptions.

To help prevent this crash, focus on making sure castings are always correct.
A lot of errors won’t be caught by the compiler so you need to be smart when

How to fix the most common Android crashes 48


referencing resources since many UI methods accept both strings and inte-
gers.

java.lang.OutOfMemoryError
Last but not least on our list is one of the more frustrating crashes. Android
devices come in all shapes and memory sizes and it can often be the case
that you are dealing with limited resources. OutOfMemoryError occurs when
the OS needs to free up memory for high-priority operations and that is taken
from your app’s heap allocation. Memory management is becoming easier
with newer devices that have a lot more memory. However, not all of your
users will be on these devices.

As for the error itself, one of the biggest causes of memory leaks leading to
OutOfMemoryError is keeping a reference to an object for too long. This can
cause your app to use up a lot more memory than it needs to and hitting that
OS limit sooner than it should cause the crash. One of the more common cul-
prits is bitmaps since images can be too large in size. So be sure to recycle
any object you can whenever it is no longer necessary.

You can request more heap memory from the OS by adding to your manifest
file the attribute android:largeHeap=”true”. However, it’s not advised unless
absolutely necessary since this is still a soft request and could be denied.

How to fix the most common Android crashes 49


IV
Mobile app testing
Chapter 12

Essential mobile app testing


strategies

While mobile app testing is absolutely crucial to app quality, it’s a challenging
endeavor and requires a lot of resources and dedication from your team. Ac-
cording to the World Quality Report 2018/19, QA captured more than a quarter
(26%) of IT budgets in 2018. If you ask QA, they will likely tell you that isn’t
nearly enough and they require a lot more resources.

Here are some of the top mobile app testing strategies to help you release
with confidence and make the most out of your QA resources.

Essential mobile app testing strategies 51


QA involvement early in development
There is a common misconception that testing and QA come at the end of
the development lifecycle. In fact, QA and testing should be involved from the
very beginning of the design process. While designing what the final product
will look like, it’s important to keep in mind the test cases that will be used.

The best way to do this is to stop treating QA as its own isolated entity when
the app is ready to be sent to QA. Instead, you should integrate QA into every
process from the beginning so all teams are aligned as to what needs to be
tested and how. This approach will ensure that your QA team knows their test
cases as well as business and functional requirements that need to be met.

OS testing and support


Even though most devices in the mobile market use iOS and Android, it’s im-
portant to pre-plan what OSes your app will support and, more importantly,
which versions. Testing an app on a single OS is easy but when you have a
global audience, testing on multiple versions becomes a more difficult task.
Study your market well and carefully plan which versions you will be support-
ing. This will help the QA team plan test cases and functionality for supported
platforms and versions.

Know where your target audience is


After figuring out what you will be supporting, who your app is aimed at and
what it does can be the biggest determining factors in what devices you’ll
need to test. One of the basic things to consider that makes a huge difference

Essential mobile app testing strategies 52


in device coverage is the release countries. Not all apps can support a global
audience and many serve a specific purpose in a specific region.

Bitbar’s research into the most common mobile devices per country show-
cases just how much geography makes a difference. For example, in the US
market, the top 20 mobile devices totaling 73.43% of the total devices, consist
of only iPhones and Samsung Galaxy phones. This means that if you are plan-
ning on releasing an app to the US market you should prioritize testing on:
• All iPhone variants from the iPhone 6 to the most recent iPhone 11
• All Samsung Galaxy variants from the S7 to the most recent

Looking at India, another huge market for mobile devices, the top 20 devices
tell a different story. They are only 32.16% of the total mobile devices and only
one iPhone is included, in the 19th spot. What dominates the Indian market
is the Chinese Xiaomi brand, not available in the US. If you are planning on
releasing an app to the Indian market you should prioritize testing on:
• Samsung Galaxy variants, especially the J series
• Xiaomi variants, especially the Redmi series

Financial status is another thing to keep in mind about the global audience.
Everyone has access to smartphones now, even in developing countries.
However, cheaper smartphones will likely have a larger share of quantity than
$800 smartphones.

Device testing
One of the toughest tasks facing QA teams is making sure an app is working

Essential mobile app testing strategies 53


well on all devices. After knowing which OS versions will be supported, it’s
important to look into which devices need to be tested. The more devices that
need to be tested, the longer the testing phase can take.

Emulators can be used to make device testing more cost-effective. By emulat-


ing a huge array of mobile devices simultaneously, you will be able to save a
lot of time and man-power on testing devices. This is also useful when physi-
cal devices are not readily available for testing.

This, however, isn’t a perfect solution. Emulators won’t perfectly replicate the
behavior of an actual physical device. And knowing how a device behaves
when not in a test vacuum is also essential since most users will already have
a lot of background processes hogging up memory.

Whenever possible, it’s important that you use emulators in tandem with phys-
ical device testing, especially for popular devices. Setting up a device testing
strategy early in the process to decide how exactly this will unfold can go a
long way to saving testing time.

Network connectivity testing


Apps nowadays almost always need a network connection, and not all peo-
ple have the same level of access to the internet. It’s easy for developers and
testers to assume that their high-speed office WiFi is the norm. But in reality,
most people have to deal with spotty connections and low-speed internet.

The QA team needs to make sure that the application is working on every

Essential mobile app testing strategies 54


network speed from 1G to LTE and WiFi. This also includes sudden changes
between networks, speeds, and even loss of connection, which are common
occurrences for users who, for example, move back and forth between home
WiFi, work WiFi, cellular data, and public networks often all within one day.

Battery testing
Battery life is one of the greatest concerns for users. If your app drains the
device battery quickly and noticeably, users will uninstall it. Various apps now-
adays use a lot of battery-intensive processes such as storing and sharing
heavy data, using geo-location, streaming video content, and general memo-
ry consuming processes.

QA testers need to run a lot of battery tests feature by feature to know which
parts of the app drains the battery the most. This is a huge concern from both
the business and QA perspective and needs to be planned for accordingly.

Security testing
The more data being sent back and forth with apps the more security be-
comes a primary concern. A study by IBM on the financial impact of data
breaches found that the cost of a data breach on average is more than $2.5
million.

Security breaches have become more common in news headlines and the
stats for mobile app security are abysmal. It’s critical that you plan security
testing early on and check for any data leakages, make sure web data isn’t

Essential mobile app testing strategies 55


vulnerable, and there are no security exploits.

Automated testing
Automated testing is one of the biggest future trends in mobile app testing.
Automated testing allows for test cases to be scripted and reused many times
over for iterations. They are also done in no time compared to manual test-
ing. This works particularly well for the very tedious repetitive test cases that
testers have to go through one by one. Automated testing saves a lot of QA
resources and manpower even though the initial investment might be heavy.

Look to integrate automated testing into your mobile app testing to maximize
your output and reduce time to delivery as much as possible. Note that you
should only integrate automated testing where applicable and not replace
manual testing completely. The technology is just not there yet for automated
tests to cover everything needed. Manual testing isn’t going away anytime
soon but an automated helping hand is useful.

Progressive rollout strategies


The decision to roll out your app over phases can make a huge difference.
You might not be able to catch all the bugs and issues present in your app
internally. This is why considering staged rollout strategies like a beta testing
program or starting with select regions first can help your app find its legs
before you release it to general availability. If anything slips by your QA team,
it can be detected by a handful of users instead of being received negatively
by your entire target audience.

Essential mobile app testing strategies 56


Chapter 13

Improving your test coverage

Figuring out the best ways to test and make sure that users get the best ex-
perience should always be a priority for mobile teams. But how do you mea-
sure how much of your app should be tested? And how do you test more of
your app without delaying your release? This guide is designed to help you
maximize test coverage for your mobile app using some commonly adopted
strategies.

What is test coverage?


Test coverage is the measure of how much of your app you tested with a set
of test cases. This could also include the number of devices or OS versions

Improving your test coverage 57


that you covered. The more you cover, the higher the test coverage. The
calculation for test coverage is: Test coverage = (Number of coverage items
tested / Total number of coverage items) * 100

Aiming for 100% test coverage would be ideal, but that isn’t entirely possible.
Testing every possible aspect of your app, and testing on every device and
OS version supported, would set your release back indefinitely. There is no
“correct” percentage of test coverage you’re supposed to hit since every app
is different, but 70% is considered a good number to aim for.
Now that we’ve defined what test coverage is, let’s look at the ways to im-
prove it.

Planning and targets


When approaching any form of testing, it’s always very important to plan
ahead. A well-structured plan will keep in mind a couple of important aspects:
• Capabilities of your mobile team
• Time constraints
• Planning as early as the design phase of the software development life-
cycle
• Setting a reasonably ambitious target test coverage goal that suits your
app and team

Critical components
As we’ve already mentioned, you’re not going to be able to hit 100% test
coverage of your app. While planning and setting a realistic goal in mind, you

Improving your test coverage 58


need to make some tradeoffs. To maximize test coverage, you can choose to
focus on your app’s most used components, or the areas that the majority of
your users will experience. These critical features are an essential part of your
app, so make sure they are prioritized if you are put in a position where you
have to choose.

Code coverage
Code coverage is a measure of how much of your code is executed during
testing. Compared to test coverage, code coverage is a measure of how much
of your app’s feature set is covered with tests. Code coverage is usually seen
as the alternative to test coverage but they both serve different purposes.
Trying to maximize both is again ideal, but resource consuming. It’s important
to work with developers to pinpoint how you can increase code coverage
as much as possible. By increasing your code coverage, it will in tandem in-
crease your test coverage by assuring the quality of code underneath. The
goal isn’t to use one or the other, but to try to increase code coverage as
much as possible in service of test coverage.

Device and OS coverage


As we have already highlighted, test coverage is just making sure a set of test
cases work, but making sure they perform on a variety of devices and OS ver-
sions. For both Android and iOS devices, there is a huge range of behaviors
and device capabilities. Planning which devices and OS versions need testing
will save a lot of time and increase your test coverage as well. Consider using
emulators and similar tools as they will help you test various devices simulta-

Improving your test coverage 59


neously and save a lot of time and resources. It’s also important to know your
target audience and what devices and OS versions they will be more likely to
use.

Test automation
Test automation is becoming an indispensable part of testing and QA. There
are plenty of repetitive tests that can be performed with automation and per-
formed quickly as opposed to manual testers repeatedly doing them. This
depends on your test requirements, but utilizing test automation properly will
help you increase test coverage while saving you a lot of time. It’s important
to remember that test automation should not be considered an all-encom-
passing replacement to manual testing, but as an assisting tool to cover more
repetitive and mundane test cases whenever possible.

Manual testing
When focusing on increasing test coverage, it could come at the cost of the
quality of tests themselves. We can never overstate the importance of getting
your app tested “in the wild”. Apps behave differently when they’re fighting
for RAM with other apps on a weak device, or struggling with spotty network
connectivity, and so it’s important to test your app in a variety of environments.
Depending on your testing and release plan, this can be done with alpha and
beta releases, rigorously testing on real devices, and dogfooding your app
with colleagues. Instrumenting your app with an SDK like Instabug that auto-
matically captures crashes, makes bugs super easy to report, and sends you
a plethora of background data will dramatically accelerate your testing and
debugging processes.

Improving your test coverage 60


Chapter 14

Mobile app performance


engineering and testing

Innovations like 5G and AI are transforming the world of mobile app testing.
However, while those technologies have yet to reach mass adoption, soft-
ware performance engineering is becoming the norm.

For mobile teams big and small, it’s important to know the differences be-
tween performance engineering and performance testing. In this article, we
will take a high level look at both categories and highlight the differences be-
tween each. We’ll also discuss why companies are making the shift and how
to make the best out of both.

Mobile app performance engineering and testing 61


Mobile app performance testing
In order to assess a mobile app’s performance, the best approach is software
performance testing. To break it down, the metrics that a mobile app’s perfor-
mance is tested against are:
• Stability: Is the app capable of carrying various loads?
• Scalability: What is the max amount of users that the application can
handle at the same time?
• Speed: How fast can the app reply?

Performance tests usually come in the form of scripts that check for bottle-
necks in the application. In the software development lifecycle, there are var-
ious phases: gathering requirements, architecture and design, development,
testing, and release. Software performance testing has input in two of the
phases: requirements and testing. The testing phase itself breaks down into
smaller sections that follow a similar pattern to the overall app development
lifecycle.

Mobile App Performance Engineering


Unlike performance testing, which is executed and done, performance engi-
neering is more of a culture that systematically applies techniques to meet
software performance requirements. While performance testing is applied in
two phases of the software development lifecycle, performance engineer-
ing is part of every phase. This mindset prioritizes performance and includes:
• Defining nonfunctional requirements in the requirement gathering
phase
• Designing and analyzing architecture for improved performance

Mobile app performance engineering and testing 62


• Applying coding standards and unit performance in the development
phase
• Performance testing in the testing phase
• Monitoring releases, while optimizing and managing capacity to get the
best performance

Performance engineering doesn’t stop at testing and suggesting improve-


ments for performance. It’s a proactive cross-functional effort where teams
work together to build a system that is in line with performance standards.
This active engagement involves employing performance optimization tech-
niques at every phase of development. Instead of reacting to an issue, teams
have already aligned to prevent the issue from occurring. And validation tests
make sure app performance is up to the standards set.

Making the shift


Since performance testing is included within performance engineering, they
aren’t mutually exclusive. Adopting performance engineering ensures that
mobile apps and their systems are designed and assessed from the start to
have the best performance.

Performance testing is mainly aimed at identifying issues and bugs in perfor-


mance through running test scripts and analyzing set metrics. Performance
engineering involves designing and observing the entire app and system to
identify any aspect that can be optimized further for performance. This con-
tributes to business objectives and generates competitive advantage by opti-
mizing scalability and achieving parity with industry standards or better.

Mobile app performance engineering and testing 63


Get the best performance with the right tools
Performance engineering and testing both need the right tools to get the best
output. Taking it to the next level and shifting to a performance engineering
culture means monitoring and improving app quality at all stages. Instabug
is a comprehensive solution for real-time contextual insights across the entire
app lifecycle. With application performance monitoring and comprehensive
bug and crash reports, your team can release and iterate with confidence.

Mobile app performance engineering and testing 64


V
Improve app quality
with Instabug
Getting users to download your app is a big enough challenge, but getting
them to stay is an even bigger one. If users experience any crashes, delays,
or bugs, they’re likely to delete your app altogether. If your app is unstable
or slow, it won’t be successful. In this section, we will cover how you can use
Instabug to improve your app quality and make your users happy.

App performance monitoring


The best way to go about improving your app’s performance is to first monitor
it. An Application Performance Monitoring (APM) tool like Instabug will allow
you to keep track of important app performance metrics.

Monitoring app performance helps you take a proactive approach towards


improving quality instead of waiting for a crash or error to occur or hearing
negative feedback from users. You’ll be able to identify possible bottleneck
situations and keep your app running as fast as possible. By staying on top of
monitoring, you can allocate and adjust resources to keep your app perform-
ing to the best of its capabilities.

Crash reporting
Probably the biggest indicator of your app’s performance is its stability. An
app crashing too often is a surefire way to lose users for good. Since crashes
specifically are fatal errors and completely stop the user from using the app,
they can become a huge issue quickly. It’s important to measure your app’s
stability score and to keep constant track of it. One of the best ways to moni-
tor your app’s health is to have a strong crash reporting tool like Instabug.

Improve app quality with Instabug 66


Instabug’s detailed crash reports help you figure out the root cause of an issue
quickly so that you can resolve the problem more effectively. When a crash
occurs, and crashes are an inevitable occurrence, you need to know about it
well before negative reviews are posted. With Instabug, you’ll be alerted to
your app’s crashes in real-time so you can act fast and fix them before they
impact more of your users.

Bug reporting
It is impossible to avoid bugs altogether. Similar to crashes, the best way to
handle them is to be able to quickly detect, diagnose, and fix them before
they affect a lot of users. Instabug’s bug reporting tool makes it as easy as
possible for your testers and users to report bugs and as easy as possible for
your developers to understand the problem and fix it. This is crucial for both
internal testing and for live apps.

And while APM and crash reporting are important to app quality, they’re miss-
ing a critical dimension: the voice of your users. With bug reporting, you com-
plete the picture by collecting real user feedback, from which you can learn
tons of valuable insights.

Instabug
For the best results, use Instabug’s APM, Crash Reporting, and Bug Report-
ing together to have a complete picture of your app’s quality, performance,
and stability. Each tool is essential on its own, and when combined, the sum
is even greater than its parts and you’ll have all the data and information you

Improve app quality with Instabug 67


need at your fingertips to deliver the fastest and most reliable experience for
your users, and outperform your competition.
Learn more at https://instabug.com/improve-app-quality-performance.

Improve app quality with Instabug 68


Instabug’s triple threat of APM, Crash Reporting, and Bug Reporting
tools will empower you to optimize your app’s performance and deliver
the high quality experience your users expect and deserve.

Learn More

Powered by:

You might also like