3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

もしあなたが急にAndroidアプリを業務で作るはめになった場合の選択肢(2025年版)

Last updated at Posted at 2025-09-24

この記事について

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年時点での変化点

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年の推奨

業務でいきなり担当になった場合

  1. Android専用 → Android Native(Kotlin + Compose)
  2. iOS版も必要 → Kotlin Multiplatform(Compose含む)
  3. チームが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なのか

  1. 宣言的UI: 状態に応じてUIが自動更新
  2. コード量削減: XMLとKotlinの往復が不要
  3. プレビュー機能: Android Studioで即座に確認
  4. パフォーマンス: 効率的な再描画
  5. 型安全: コンパイル時エラー検出

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の内部テスト機能を活用:

  1. 内部テスト : 開発チーム向け(最大100人)
  2. クローズドテスト : ベータテスター向け
  3. オープンテスト : 一般公開前テスト

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")
}

学習リソース

必須ドキュメント

  1. Android Developers Guide

  2. Jetpack Compose Tutorial

  3. Android Architecture Guide

おすすめ学習順序

  1. Kotlin基礎 (1週間)
  2. Android基礎概念 (1週間)
  3. Jetpack Compose (2週間)
  4. Architecture Components (1週間)
  5. 実際のアプリ開発 (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アプリ開発は以前より学習しやすくなっているので、安心してチャレンジしてください。

何より大事なこと

  • 公式ドキュメントを読む習慣をつける
  • 小さいアプリから始めて徐々に機能を増やす
  • コミュニティに参加して最新情報をキャッチアップする
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?