この記事について
2021年に公開された前回の記事から4年が経過しました。
「急にAndroidアプリを作ることになった」皆さんのために、2025年時点での技術選択指針を整理します。
想定している読者
- Androidアプリ開発未経験だが、他の言語での開発経験がある
- 会社で急にAndroidアプリ担当になってしまった
- 最新のAndroidアプリ開発事情を知りたい
先に結論
2025年時点でAndroidアプリを新規開発する場合の選択肢をまとめておきます:
- 開発環境: Android Studio Narwhal 2025.1.3(安定版)
- 開発言語: Kotlin一択
- Min SDK: API Level 30以上(Android 11以上)
- UI: Jetpack Compose(もはや主流)
- アーキテクチャ: MVVM + Repository Pattern
- DI: Hilt(KSP対応版)
- ネットワーク: Ktor Client
- 非同期処理: Kotlin Coroutines
- データベース: Room + SQLite
詳細な理由は以下で説明します。
目次
- 2025年時点での変化点
- プラットフォーム選択:ネイティブ vs クロスプラットフォーム
- 開発環境
- サポート対象Androidバージョン
- 開発言語選択
- UI開発:XMLは終了、Composeが主流
- 基本ライブラリ構成
- ネットワーク通信
- バックグラウンド処理
- アーキテクチャ
- 依存性注入:Hilt + KSP
- データベース:Room + SQLite
- 分析・ログ
- テスト・デプロイ
- 避けるべきもの・注意点
- 2025年注目の新技術
- 学習リソース
- まとめ
2025年時点での変化点
2021年から大きく変わった点をピックアップします:
✅ 主流になったもの
- Jetpack Compose: XMLからComposeへの移行が完了
- Kotlin Multiplatform: 正式版となり実用レベルに
- Compose Multiplatform: iOS対応が安定版に(2025年5月)
- Hilt + KSP: ビルド速度が大幅改善
❌ 廃れていったもの
- XML Layout: 新規開発では非推奨レベル
- KAPT: KSPに置き換わり
- LiveData: StateFlowに置き換わり
- 古いMin SDK: Android 8未満はほぼ切り捨て
プラットフォーム選択:ネイティブ vs クロスプラットフォーム
2021年からの変化
2021年版では「初心者はネイティブから」を推奨していましたが、2025年現在は事情が変わりました。
現在の選択肢
1. Android Native(Kotlin + Compose)
こんな場合におすすめ
- Android専用アプリ
- Android固有機能を多用する
- パフォーマンスが最優先
// 2025年のAndroidコード例
@Composable
fun UserProfile(user: User) {
LazyColumn {
item {
Text(
text = user.name,
style = MaterialTheme.typography.headlineMedium
)
}
}
}
2. Kotlin Multiplatform Mobile(推奨度UP↗️)
2025年の大きな変化点
Kotlin Multiplatformが2023年11月に安定版となり、2025年5月にはCompose Multiplatform for iOSも安定版になりました。
こんな場合におすすめ
- iOS版も予定している
- ビジネスロジックを共有したい
- 既存AndroidチームがKotlinに慣れている
// 共通ビジネスロジック
class UserRepository {
suspend fun getUser(id: String): User {
// プラットフォーム共通の処理
}
}
// Compose UI(Android/iOS共通)
@Composable
fun UserCard(user: User) {
Card {
Text(user.name)
}
}
3. React Native
こんな場合におすすめ
- チームにWeb開発者が多い
- 既存のReactスキルを活かしたい
2025年の推奨
業務でいきなり担当になった場合
- Android専用 → Android Native(Kotlin + Compose)
- iOS版も必要 → Kotlin Multiplatform(Compose含む)
- チームがWeb系 → React Native
開発環境
IDE選択
Android Studio Narwhal 2025.1.3を使いましょう。
2025年9月現在の安定版は:
- 安定版: Android Studio Narwhal 3 Feature Drop | 2025.1.3
- プレビュー版: Android Studio Octopus Canary(2025.2.x系)
インストールと設定
# macOSの場合、Homebrewでインストール可能
brew install --cask android-studio
注意点
- 「Canary版」は避ける(業務では安定版を推奨)
- JDK 17以上が必要(2025年要件)
- 初期設定でKotlin Multiplatformプラグインを有効化推奨
サポート対象Androidバージョン
2025年の推奨Min SDK
API Level 30(Android 11)以上を推奨します。
最新のAndroidバージョン分布(2025年8月)
Android版 | APIレベル | シェア |
---|---|---|
Android 16 | 36 | 2.7% |
Android 15 | 35 | 42.9% |
Android 14 | 34 | 18.1% |
Android 13 | 33 | 17.7% |
Android 12 | 31-32 | 12.1% |
Android 11 | 30 | 4.8% |
Android 10以下 | 29以下 | 1.7% |
推奨理由
- Android 15が最大シェア(42.9%)
- Android 11以上で約95%をカバー
- Google Playの要件(2025年8月以降はAPI 34が必須)
// build.gradle.kts (app level)
android {
compileSdk = 36 // Android 16
defaultConfig {
minSdk = 30 // Android 11(推奨)
targetSdk = 36
}
}
開発言語選択
Kotlin一択です
2025年現在、新規AndroidアプリでJavaを選ぶ理由はありません。🔗詳細
Kotlinを選ぶ理由
- Google公式推奨言語(2017年から)
- null安全機能
- コルーチンによる非同期処理
- Compose完全対応
- Multiplatform対応
- Ktorによるクロスプラットフォーム対応ネットワーク層
// 2025年のKotlinコード例
class UserViewModel : ViewModel() {
private val _uiState = MutableStateFlow(UiState.Loading)
val uiState = _uiState.asStateFlow()
fun loadUser(id: String) {
viewModelScope.launch {
try {
val user = repository.getUser(id)
_uiState.value = UiState.Success(user)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message)
}
}
}
}
Gradle:Kotlin DSL
2025年現在、GradleのGroovy記法からKotlin DSL(.kts)への移行が推奨されています。
Kotlin DSLを使う理由
- 型安全性: コンパイル時エラー検出
- IDE支援: 自動補完とリファクタリング
- 可読性: Kotlinと統一された記法
- 保守性: より良い構造化とモジュール化
UI開発:XMLは終了、Composeが主流
2025年の大きな変化
Jetpack ComposeがXMLに完全勝利しました。
なぜComposeなのか
- 宣言的UI: 状態に応じてUIが自動更新
- コード量削減: XMLとKotlinの往復が不要
- プレビュー機能: Android Studioで即座に確認
- パフォーマンス: 効率的な再描画
- 型安全: コンパイル時エラー検出
Compose基本例
@Composable
fun LoginScreen(
viewModel: LoginViewModel = hiltViewModel()
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
OutlinedTextField(
value = uiState.email,
onValueChange = viewModel::updateEmail,
label = { Text("メールアドレス") }
)
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = viewModel::login,
enabled = !uiState.isLoading
) {
if (uiState.isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(16.dp)
)
} else {
Text("ログイン")
}
}
}
}
Compose BOM(2025年最新)
// build.gradle.kts (app level)
implementation(platform("androidx.compose:compose-bom:2025.08.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
implementation("androidx.activity:activity-compose:1.9.1")
基本ライブラリ構成
AndroidX(必須)
Android Support Libraryは完全に廃止。AndroidXを使います。
implementation("androidx.core:core-ktx:1.13.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.4")
非同期処理:Kotlin Coroutines
Kotlin Coroutinesは、Androidアプリで非同期処理を簡潔かつ効率的に記述するためのGoogle推奨のフレームワークです。
// ViewModelScope
viewModelScope.launch {
val result = repository.fetchData()
_uiState.value = UiState.Success(result)
}
// Compose内での非同期処理
@Composable
fun UserProfile(userId: String) {
val user by produceState<User?>(initialValue = null, userId) {
value = repository.getUser(userId)
}
user?.let { UserCard(it) } ?: Loading()
}
ネットワーク通信
Ktor Client(Kotlin Multiplatform対応)
Ktor Clientは、Kotlin Multiplatformに対応したHTTPクライアントで、AndroidだけでなくiOSなど複数のプラットフォームで共通のネットワーク層を構築できます。
// APIクライアント
class UserApiClient @Inject constructor(
private val client: HttpClient
) {
suspend fun getUser(id: String): User {
return client.get("users/$id").body()
}
suspend fun createUser(user: CreateUserRequest): User {
return client.post("users") {
contentType(ContentType.Application.Json)
setBody(user)
}.body()
}
}
// Hiltでの設定
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideHttpClient(): HttpClient {
return HttpClient(Android) {
install(ContentNegotiation) {
json(Json {
ignoreUnknownKeys = true
isLenient = true
})
}
install(Logging) {
level = LogLevel.INFO
}
install(HttpTimeout) {
requestTimeoutMillis = 30000
connectTimeoutMillis = 10000
}
defaultRequest {
url("https://api.example.com/")
}
}
}
@Provides
@Singleton
fun provideUserApiClient(client: HttpClient): UserApiClient {
return UserApiClient(client)
}
}
バックグラウンド処理
WorkManager(変わらず推奨)
WorkManagerは、制約に基づいたバックグラウンド処理を確実に実行するためのAndroid Jetpackライブラリです。
class SyncWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
syncUserData()
Result.success()
} catch (e: Exception) {
Result.failure()
}
}
}
// スケジューリング
val syncWork = PeriodicWorkRequestBuilder<SyncWorker>(1, TimeUnit.HOURS)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(context).enqueue(syncWork)
アーキテクチャ
MVVM + Repository Pattern
MVVM (Model-View-ViewModel) と Repository Pattern は、UIからビジネスロジックとデータ層を分離し、テスト容易性と保守性を高めるためのアーキテクチャパターンです。
2025年でも変わらずGoogle推奨のアーキテクチャです。
// Repository
@Singleton
class UserRepository @Inject constructor(
private val apiClient: UserApiClient,
private val dao: UserDao
) {
fun getUser(id: String): Flow<User> {
return flow {
// ローカル先出し
dao.getUser(id)?.let { emit(it) }
// API更新
val user = apiClient.getUser(id)
dao.insertUser(user)
emit(user)
}
}
}
// ViewModel
@HiltViewModel
class UserViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
private val _uiState = MutableStateFlow(UserUiState())
val uiState = _uiState.asStateFlow()
fun loadUser(id: String) {
viewModelScope.launch {
repository.getUser(id)
.catch { exception ->
_uiState.update { it.copy(error = exception.message) }
}
.collect { user ->
_uiState.update { it.copy(user = user, isLoading = false) }
}
}
}
}
data class UserUiState(
val user: User? = null,
val isLoading: Boolean = true,
val error: String? = null
)
依存性注入:Hilt + KSP
2025年の重要な変化:KSP対応
HiltがKSP(Kotlin Symbol Processing)に対応し、ビルド速度が大幅に改善されました。
セットアップ
// build.gradle.kts (project level)
plugins {
id("com.google.devtools.ksp") version "2.0.20-1.0.25" apply false
id("com.google.dagger.hilt.android") version "2.56.2" apply false
}
// build.gradle.kts (app level)
plugins {
id("com.google.devtools.ksp")
id("com.google.dagger.hilt.android")
}
dependencies {
implementation("com.google.dagger:hilt-android:2.56.2")
ksp("com.google.dagger:hilt-android-compiler:2.56.2")
// Compose対応
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
}
基本的な使い方
@HiltAndroidApp
class MyApplication : Application()
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApp()
}
}
}
@Composable
fun UserScreen(
viewModel: UserViewModel = hiltViewModel()
) {
// ViewModelが自動注入される
}
データベース:Room + SQLite
Room設定(2025年版)
Roomは、SQLiteデータベースを抽象化し、より簡単にデータベース操作を行えるようにするJetpackライブラリで、型安全なデータベースアクセスを提供します。
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: String,
val name: String,
val email: String,
val createdAt: Long = System.currentTimeMillis()
)
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE id = :id")
suspend fun getUser(id: String): User?
@Query("SELECT * FROM users")
fun getAllUsers(): Flow<List<User>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
}
@Database(
entities = [User::class],
version = 1,
exportSchema = false
)
@TypeConverters(DateConverters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
// Hiltでの設定
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
return Room.databaseBuilder(
context,
AppDatabase::class.java,
"app_database"
).build()
}
@Provides
fun provideUserDao(database: AppDatabase) = database.userDao()
}
分析・ログ
Firebase Analytics(変わらず推奨)
// build.gradle.kts (app level)
implementation("com.google.firebase:firebase-analytics-ktx")
// 使用例
class AnalyticsHelper @Inject constructor() {
private val analytics = Firebase.analytics
fun logScreenView(screenName: String) {
analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {
param(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
}
}
fun logButtonClick(buttonName: String) {
analytics.logEvent("button_click") {
param("button_name", buttonName)
}
}
}
テスト・デプロイ
テスト配布
Google Play Consoleの内部テスト機能を活用:
- 内部テスト : 開発チーム向け(最大100人)
- クローズドテスト : ベータテスター向け
- オープンテスト : 一般公開前テスト
Google Play要件(2025年)
- Target SDK: API Level 34以上(Android 14)が必須
- App Bundle: APKではなくAAB形式推奨
- Play Integrityチェック: セキュリティ対策強化
避けるべきもの・注意点
ハードウェア機能
初回リリースでは以下を避けるかオプション扱いに:
- カメラ: デバイス依存が大きい
- Bluetooth: 接続周りが複雑
- 位置情報: プライバシー要件が厳格
- 生体認証: 実装ミスでセキュリティ問題
2025年注目の新技術
Compose Multiplatform(特にiOS対応)
2025年5月にCompose Multiplatform for iOSが安定版になりました。
// iOS/Android共通のCompose UI
@Composable
fun UserProfile(user: User) {
Column {
AsyncImage(
model = user.avatarUrl,
contentDescription = null
)
Text(
text = user.name,
style = MaterialTheme.typography.headlineMedium
)
}
}
Material Design 3
// Material 3テーマ
implementation("androidx.compose.material3:material3:1.4.0")
@Composable
fun MyApp() {
MaterialTheme(
colorScheme = dynamicColorScheme(LocalContext.current)
) {
// アプリのコンテンツ
}
}
パフォーマンス最適化:Baseline Profiles
// build.gradle.kts (app level)
dependencies {
implementation("androidx.profileinstaller:profileinstaller:1.4.1")
}
学習リソース
必須ドキュメント
-
Android Developers Guide
- https://developer.android.com/guide
- 最新情報とベストプラクティス
-
Jetpack Compose Tutorial
-
Android Architecture Guide
おすすめ学習順序
- Kotlin基礎 (1週間)
- Android基礎概念 (1週間)
- Jetpack Compose (2週間)
- Architecture Components (1週間)
- 実際のアプリ開発 (2-4週間)
まとめ
2025年のAndroidアプリ開発
確実に採用すべき技術スタック
- Kotlin + Jetpack Compose
- Hilt(KSP版)+ MVVM
- Ktor Client + Coroutines
- Room + SQLite
- Firebase Analytics
検討すべき選択肢
- Kotlin Multiplatform(iOS対応予定なら)
- Compose Multiplatform(UI共有したいなら)
避けるべきもの
- Java(新規開発)
- XML Layout(新規開発)
- KAPT(KSPがあるため)
- 古いMin SDK(Android 11未満)
最後に
Androidアプリ開発は2021年から大きく変化しました。特にJetpack ComposeとKotlin Multiplatformの普及により、開発体験が大幅に向上しています。
「急に担当になってしまった」という方も、今のAndroidアプリ開発は以前より学習しやすくなっているので、安心してチャレンジしてください。
何より大事なこと
- 公式ドキュメントを読む習慣をつける
- 小さいアプリから始めて徐々に機能を増やす
- コミュニティに参加して最新情報をキャッチアップする