  Formal contracts and assertions are effective methods to enhance software
quality by enforcing preconditions, postconditions, and invariants. Previous
research has demonstrated the value of contracts in traditional software
development contexts. However, the adoption and impact of contracts in the
context of mobile application development, particularly of Android
applications, remain unexplored.
  To address this, we present the first large-scale empirical study on the
presence and use of contracts in Android applications, written in Java or
Kotlin. We consider different types of contract elements divided into five
categories: conditional runtime exceptions, APIs, annotations, assertions, and
other. We analyzed 2,390 Android applications from the F-Droid repository and
processed more than 51,749 KLOC to determine 1) how and to what extent
contracts are used, 2) how contract usage evolves, and 3) whether contracts are
used safely in the context of program evolution and inheritance. Our findings
include: 1) although most applications do not specify contracts,
annotation-based approaches are the most popular among practitioners; 2)
applications that use contracts continue to use them in later versions, but the
number of methods increases at a higher rate than the number of contracts; and
3) there are many potentially unsafe specification changes when applications
evolve and in subtyping relationships, which indicates a lack of specification
stability. Our findings show that it would be desirable to have libraries that
standardize contract specifications in Java and Kotlin, and tools that aid
practitioners in writing stronger contracts and in detecting contract
violations in the context of program evolution and inheritance.
