For a new native Android app, Kotlin is the practical default. Google develops Android tools, samples, libraries, and training with a Kotlin-first approach, and Jetpack Compose uses Kotlin APIs for modern native interfaces.
Java still matters. It powers a large number of existing Android applications, works with the Android SDK, and interoperates with Kotlin. A team maintaining a stable Java app rarely needs a rewrite just to claim a newer stack.
The choice becomes less direct when a product needs Android and iOS. Flutter uses Dart, React Native commonly uses JavaScript or TypeScript, and .NET MAUI uses C#. These tools can share product code across platforms, but shared code does not remove platform testing, app-store work, accessibility, or device-specific behavior.

Android language and framework comparison
| Option | Best fit | Main tradeoff |
|---|---|---|
| Kotlin | New native Android apps and modernizing Java apps | Android-focused unless paired with a broader multiplatform approach |
| Java | Existing Java codebases and teams with deep Java experience | More verbose and receives less Kotlin-specific Android tooling |
| Dart with Flutter | Android and iOS products that can share most interface code | Requires Flutter expertise and platform-specific integration work |
| JavaScript or TypeScript with React Native | Cross-platform products with a strong React team | Native modules and upgrades can add complexity |
| C# with .NET MAUI | Cross-platform work in a Microsoft/.NET organization | Smaller mobile ecosystem than native Android or the largest cross-platform options |
| C++ | Games, media, graphics, and performance-sensitive native libraries | Too complex for most application screens and business logic |
Python and Lua can reach Android through specialist frameworks, but they are not standard choices for a production Android product. Choose them only when the use case or existing codebase gives a concrete reason.
Kotlin: the default for new native Android apps
Kotlin is concise, null-safe by design, and built to work with Java. It supports coroutines for asynchronous work and has first-class support across Android Studio and Jetpack libraries.
Kotlin is the clearest choice when:
- The product needs deep access to Android capabilities.
- Android quality matters more than sharing every line with iOS.
- The team plans to use Jetpack Compose.
- The app needs to adapt across phones, tablets, foldables, TVs, cars, or wearables.
- An existing Java app will be modernized screen by screen.
Jetpack Compose is Google’s recommended modern toolkit for native Android interfaces. It uses a declarative model: the UI reflects application state rather than relying on code that manually changes individual views. Existing View-based screens can coexist with Compose, so adoption does not have to be all at once.
Java: still supported and still useful
Java remains a valid Android language. The Android SDK supports it, mature applications depend on it, and many engineers know its tooling and object-oriented model well.
Keep Java when:
- The product already has a healthy Java codebase.
- The team can maintain it confidently.
- A rewrite would delay customer work without reducing meaningful risk.
- Important libraries or internal systems already use Java.
New features can be written in Kotlin while older Java code stays in place. That gradual path is usually safer than a full rewrite. The decision should follow maintenance cost, defect rate, hiring needs, and product priorities rather than language fashion.
Flutter and Dart: one product across several platforms
Flutter renders its own interface layer and uses Dart. It can support Android, iOS, web, and desktop from a shared project, though the amount of reusable code varies by product.
Flutter can fit when:
- Android and iOS need to launch together.
- The interface should look highly consistent across platforms.
- The team is comfortable owning Flutter as a long-term platform choice.
- The app does not depend heavily on unsupported native SDKs.
Check every critical integration before committing. Payments, maps, background tasks, Bluetooth, health data, notifications, analytics, and identity providers can require platform-specific work even in a cross-platform app.
React Native and TypeScript: a fit for React teams
React Native lets teams build mobile interfaces with React concepts and JavaScript or TypeScript. It is attractive when a company already has React engineers and wants to share product patterns, validation, networking, or business logic across platforms.
It is not a web page wrapped as an app. Teams still need to understand mobile navigation, native builds, release signing, permissions, device behavior, and app-store rules. Some integrations require native Kotlin, Java, Swift, or Objective-C modules.
C#, C++, Python, and other options
C# and .NET MAUI
.NET MAUI can fit organizations that already run on C# and Microsoft tooling. It supports shared work across Android, iOS, macOS, and Windows. Evaluate the required native integrations and the team’s mobile experience before choosing it.
C++ with the Android NDK
C++ is useful for performance-sensitive libraries, game engines, audio, video, computer vision, and code shared with another native platform. It is rarely the right language for a standard form, account, marketplace, or workflow app. Kotlin can own the application layer while C++ handles the narrow part that needs it.
Python and Lua
Frameworks can package Python or Lua code for Android, but they sit outside the mainstream Android path. That affects library support, hiring, debugging, platform updates, and long-term maintenance. Use them for a proven specialist need, not because the language feels easier at the prototype stage.
Native Android vs cross-platform
| Decision factor | Native Kotlin | Cross-platform framework |
|---|---|---|
| Android-specific capabilities | Direct access and strongest platform alignment | Usually available, sometimes through plugins or native modules |
| Shared Android/iOS code | Limited | Higher potential reuse |
| Platform-specific interface | Natural Android behavior | Can be consistent across platforms but still needs adaptation |
| Team fit | Strong for Android engineers | Strong when the team knows the chosen framework |
| Release and device testing | Android only | Both platforms still need full testing |
| Long-term dependency risk | Tied mainly to Android and Jetpack | Also tied to framework upgrades and plugin health |
Cross-platform development can reduce duplicated work, but it does not cut the whole project in half. Product discovery, backend systems, QA, analytics, release management, support, and native edge cases remain.
Questions to answer before choosing
- Is Android the main product, or must Android and iOS launch together?
- Which device features and third-party SDKs are essential?
- Does the app need background work, offline support, Bluetooth, media, or complex notifications?
- Which stack can the team maintain after launch?
- How much platform-specific interface behavior matters?
- Is there an existing codebase worth preserving?
- What is the upgrade and plugin risk over the next three years?
The language should follow the product and team. Choose Kotlin for a new native Android app unless the delivery model gives you a clear reason to use a cross-platform framework. Keep Java where it works, and modernize it in measured pieces.
See the app development stages before turning the language decision into a build plan, or compare mobile app frameworks if Android and iOS must share a codebase.
Further questions
What programming language does Android use?
Android supports both Kotlin and Java. Google takes a Kotlin-first approach to modern Android development, while Java remains supported and widely used in existing applications.
What is the best language for a new Android app?
Kotlin is the usual choice for a new native Android app. Flutter with Dart or React Native with JavaScript or TypeScript can fit products that need Android and iOS from one shared codebase.
Can Kotlin and Java be used in the same Android app?
Yes. Kotlin and Java are interoperable, so teams can add Kotlin to an existing Java application gradually instead of rewriting the whole product.