People enjoy using apps and games which meet their performance and quality expectations. Excessive battery usage, slow render times, and crashes, on the other hand, can be a source of frustration. In fact, in an internal analysis of app reviews on Google Play, we noticed that half of 1-star reviews mentioned app stability. Developers who focus on app quality can see improvements in their rating, and ultimately their retention and monetization.
As part of our continued effort to deliver the best possible Google Play experience, we recently enhanced our search and discovery algorithms to reflect app quality. This results in higher quality apps being surfaced in the Play Store more than similar apps of lower quality (eg: apps that exhibit more frequent crashes). The change has had a positive impact on engagement — we’ve seen that people go on to use higher quality apps more and uninstall them less.
Developers focusing on performance can use the Play Console to help find and fix a number of quality issues. Android vitals identifies key performance issues, reported by opted-in devices which have your app installed, so you can address them. The pre-launch report shows you the result of testing your alpha or beta app on popular physical devices so you can catch issues before launching updates. Also, ratings and reviews can provide additional insights related to app quality, directly from people using your app. To see the positive effect this can have, find out how Busuu increased their rating from 4.1☆ to 4.5☆ by focusing on app performance.
Google Play strives to help people find and discover safe, high quality, useful, and relevant apps. By focusing on the quality and performance of your app, you’ll find more success on Google Play. For more tips and best practices to grow your app or game business, get the Playbook app.
Sanitizer tools have a very simple code coverage tool built in. SanitizerCoverage allows for code coverage at the call level, basic block level, or edge level. These can be used as a standalone instrumentation technique or in conjunction with any of the sanitizers, including AddressSanitizer and UndefinedBehaviorSanitizer. To use the new guard-based coverage, set fsanitize-coverage=trace-pc-guard. This causes the compiler to insert __sanitizer_cov_trace_pc_guard(&guard_variable) on every edge. Each edge has its own uint32_t guard_variable. In addition, a module constructor, __sanitizer_cov_trace_pc_guard_init(uint32_t* start, uint32_t* stop) is also generated. All the __sanitizer_cov_ functions should be provided by the user. You can follow the example on Tracing PCs with guards.
In addition to control flow tracing, SanitizerCoverage allows for data flow tracing. This is activated with fsanitize-coverage=trace-cmp and is implemented by instrumenting all switch and comparison instructions with __sanitizer_cov_trace_* functions. Similar functionality exists for integer division and GEP instructions, activated with fsanitize-coverage=trace-div and fsanitize-coverage=trace-gep respectively. This is an experimental interface, is not thread-safe, and could change at any time, however, it is available and functional in Android builds.
During a coverage sanitizer session, the coverage information is recorded in two files, a .sancov file, and a sancov.map file. The first contains all instrumented points in the program, and the other contains the execution trace represented as a sequence of indices into the first file. By default, these files are stored in the current working directory, with one created for each executable and shared object that ran during the execution.
ASan, UBSan, and SanitizerCoverage are just the beginning of LLVM sanitizer use in Android. More LLVM Sanitizers are being integrated into the Android build system. The sanitizers described here can be used as a code health and system stability mechanism and are even currently being used by Android Security to find and prevent security bugs!