API Level:その概要、APIバージョン、targetSdk

著者: IT Sectr 公開日: 2026-02-08 読了時間: 12 分

API Level Androidは、Androidプラットフォームの特定のリリースに一意に対応する整数識別子です。OSの各バージョンには固有の番号があります:Android 14 = API 34、Android 15 = API 35。開発者はbuild.gradleの3つのパラメータ(minSdkVersion、targetSdkVersion、compileSdkVersion)を管理し、互換性と新機能へのアクセスを制御します。Android Developersによると、適切なAPI Levelの選択はセキュリティとユーザーカバレッジにとって重要です。

重要ポイント

  • API Level — Android APIバージョンの整数識別子、API 1(Android 1.0)からAPI 36(Android 16)まで
  • minSdkVersion — アプリをインストールするための最小Androidバージョン、ユーザーカバレッジを決定
  • targetSdkVersion — アプリがテストされたバージョン。そのバージョンの動作変更を含む
  • compileSdkVersion — コンパイルに使用するSDKバージョン。targetSdk以上である必要があり、新しいAPIへのアクセスを提供
  • Google PlayはtargetSdkVersionが現在のAPI Levelから1年以内であることを要求

API Level Androidとは?

API Level Androidは、Android Framework APIの各パブリックリリースに割り当てられる整数識別子です。最初のリリースAndroid 1.0はAPI Level 1、Android 1.5はAPI Level 3、Android 2.2はAPI Level 8、Android 4.0はAPI Level 14、Android 8.0はAPI Level 26、Android 12はAPI Level 31、Android 14はAPI Level 34、Android 15はAPI Level 35、Android 16(2025年)はAPI Level 36でした。新しいAPI Levelごとに、新しいクラス、メソッド、定数、権限が追加され、既存の動作が変更される場合があります。

API Levelはリリースごとに厳密に1ずつ増加するわけではありません。たとえば、Android 4.4W(Wear)はAPI 20、Android 5.0はAPI 21です。ギャップは内部のイテレーションとWear OSデバイスに関連しています。開発者にとって重要なのは、バージョン名(KitKat、Lollipop、Tiramisu)ではなく、そのAPI Levelです。互換性チェックにはコード内でAPI Levelが使用されます。

API Levelの主な目的は後方互換性です。API 34に対してコンパイルされたアプリは、API 34以下のデバイスでも実行できます(チェックなしで新しいAPIを使用しない場合)。Android Runtime(ART)はシステムレベルでAPI呼び出しをチェックし、アプリのtargetSdkVersionに応じて動作変更を適用します。

AndroidがAPI Levelを処理する方法

アプリのインストール時に、PackageManagerはデバイスのAPI LevelがAndroidManifest.xmlのminSdkVersion以上であることをチェックします。条件が満たされない場合、インストールは「App not installed」というメッセージでブロックされます。実行中、Android Runtimeはより高いAPI Levelを必要とするAPI呼び出しを監視し、メソッドが現在のバージョンに存在しない場合はNoSuchMethodErrorまたはUnsatisfiedLinkErrorを生成します。

コンポーネントAPI Level処理における役割
PackageManagerインストール時にminSdkVersionをチェック
Android Runtime(ART)実行時にAPI互換性チェックを実行
Google Play StoreデバイスのAPI Levelでアプリをフィルタリング
SDK Manager必要なAPI Levelでのコンパイル用プラットフォームをダウンロード
lintminSdkを超えるAPIの使用について警告する静的アナライザー

minSdk、targetSdk、compileSdk:各パラメータの違いと役割

build.gradleファイル(Module: app)で、開発者は3つのAPI Levelパラメータを指定します:minSdkVersion、targetSdkVersion、compileSdkVersion。これらを混同することは、初心者のAndroid開発者によくある間違いの1つです。各パラメータは互換性の異なる側面を担当し、それらの値は一貫している必要があります。

minSdkVersion

minSdkVersionは、アプリをインストールして実行できる最小のAPI Levelです。minSdkより低いAPI Levelのデバイスは、Google Playでアプリを表示できず、インストールもできません。値はターゲットオーディエンスに基づいて選択されます:minSdk 21(Android 5.0)はデバイスの97%をカバー、minSdk 26(Android 8.0)は約85%、minSdk 31(Android 12)は約55%(Android Studio Distribution Dashboard、2026年のデータ)。minSdkが低いほどカバレッジは広がりますが、より多くの後方互換性コードが必要になります。

targetSdkVersion

targetSdkVersionは、アプリがテストされたAPI Levelです。AndroidはtargetSdkを使用して動作変更を適用します:アプリがtargetSdk 33を指定すると、システムはAPI 33で導入されたすべての動作変更を有効にします。targetSdkが31の場合、システムはAPI 32-33の変更を適用せず、古い動作との互換性を維持します。これはセキュリティにとって最も重要なパラメータです:Google PlayはtargetSdkが現在のAPI Levelから1年以内であることを要求します。

compileSdkVersion

compileSdkVersionは、コードのコンパイルに使用するAndroid SDKのバージョンです。コンパイル時にどのAPIが利用可能かを決定します。compileSdkはtargetSdk以上である必要があり、理想的には最新の安定したAPI Levelと等しくする必要があります。compileSdkを上げても実行時の動作には影響しません。コンパイラが新しいAPIを利用できるようになるだけです。compileSdkを上げた後は、非推奨APIと新しい権限要件についてコードを確認する必要があります。

kotlin
// build.gradle.kts — API Level設定の例
plugins {
    id("com.android.application") version "8.7.0"
    id("org.jetbrains.kotlin.android") version "2.1.0"
}

android {
    namespace = "com.example.myapp"
    compileSdk = 36  // Android 16

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 26      // Android 8.0
        targetSdk = 36    // Android 16
        versionCode = 1
        versionName = "1.0.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = "17"
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.15.0")
    implementation("androidx.appcompat:appcompat:1.7.0")
    implementation("androidx.activity:activity-ktx:1.9.3")
}

build.gradle.ktsの例では、compileSdk = 36(執筆時点で最新)、targetSdk = 36、minSdk = 26(Android 8.0)です。compileSdk 36はすべてのAndroid 16 APIへのアクセスを提供します。targetSdk 36はすべてのAndroid 16の動作変更を有効にします。minSdk 26は約85%のデバイスをカバーします。AndroidX Activity KTXとAppCompatは、フラグメントとテーマの後方互換性を提供します。

AndroidManifest.xml

minSdkおよびtargetSdkパラメータはAndroidManifest.xmlでも指定できますが、最近のプロジェクトではbuild.gradleを使用します。Gradleの値がマニフェストを上書きします。マニフェストでは、Gradleビルド構成を使用しないライブラリやモジュールのために、を指定すると便利な場合があります。

動作変更:targetSdkがアプリの動作に与える影響

動作変更は、targetSdkが特定のAPI Level以上のアプリにのみ適用されるAndroidシステムの動作変更です。新しいAndroidリリースごとに、既存のアプリを破壊する可能性のある動作変更が導入されます。これはAndroidの重要なセキュリティメカニズムです:古いアプリは以前と同じように動作し続け、新しいアプリは最新のルールに従います。

バージョン別の主な動作変更

Android 10(API 29)— Scoped Storage:targetSdk 29+のアプリは、共有ファイルシステムに直接アクセスできず、MediaStore、SAF、または独自のストレージを介してのみアクセスできます。Android 11(API 30)— Package Visibility:パッケージフィルター。アプリは操作するインストール済みパッケージのみを表示します。Android 12(API 31)— Foreground Service Notification:すべてのフォアグラウンドサービスは、開始後10秒以内に通知を表示する必要があります。Android 13(API 33)— POST_NOTIFICATIONS:プッシュ通知の実行時権限。Android 14(API 34)— Foreground Service Types:マニフェストでのフォアグラウンドサービス種別の必須宣言。

kotlin
// Android 13(API 33)の動作変更処理:POST_NOTIFICATIONS
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat

class NotificationHelper {

    fun requestNotificationPermission(activity: MainActivity) {
        // POST_NOTIFICATIONS権限はAPI 33+でのみ機能
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
            return  // API 33未満では権限は不要
        }

        when {
            ContextCompat.checkSelfPermission(
                activity,
                Manifest.permission.POST_NOTIFICATIONS
            ) == PackageManager.PERMISSION_GRANTED -> {
                // 権限は既に付与されています。通知を送信できます
                showNotification(activity)
            }

            activity.shouldShowRequestPermissionRationale(
                Manifest.permission.POST_NOTIFICATIONS
            ) -> {
                // 権限が必要な理由の説明を表示
                activity.showRationale()
            }

            else -> {
                // 権限をリクエスト
                activity.requestPermissionLauncher.launch(
                    Manifest.permission.POST_NOTIFICATIONS
                )
            }
        }
    }

    private fun showNotification(context: Context) {
        // 通知を作成して表示
        val notification = android.app.Notification.Builder(context, "default_channel")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("通知")
            .setContentText("新しいメッセージ")
            .build()
        val manager = context.getSystemService(Context.NOTIFICATION_SERVICE)
            as android.app.NotificationManager
        manager.notify(1, notification)
    }
}

// ActivityにrequestPermissionLauncherを登録
class MainActivity : ComponentActivity() {
    val requestPermissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted: Boolean ->
        if (isGranted) {
            // 権限が付与されました
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

KotlinでのPOST_NOTIFICATIONS処理の例:Build.VERSION.SDK_INT >= TIRAMISUを確認し、ActivityResultContracts.RequestPermissionを介して実行時権限を要求し、コールバックで結果を処理します。この権限がないと、targetSdk 33+のアプリはプッシュ通知を表示できません。API 33未満では権限は不要です。チェックコードが利用不可のAPI呼び出しを防止します。

Scoped Storage(Android 10+)

Scoped Storageは最も重要な動作変更の1つです。API 29(targetSdk 29+)以降、アプリはPictures、Downloads、Music、Documentsディレクトリに直接ファイルアクセスできません。代わりに、メディアにはMediaStore、任意のファイルにはSAF(Storage Access Framework)、独自のストレージにはgetExternalFilesDir()が使用されます。例外はMANAGE_EXTERNAL_STORAGE権限を持つアプリで、Google Playの承認が必要です。

API LevelとtargetSdkに関するGoogle Playの要件

Google Playは、アプリ公開のためにtargetSdkVersionの必須要件を設定しています。2024年8月以降、Google PlayはtargetSdkVersion >= API 33(Android 13)を要求しています。毎年しきい値が上がり、新しいアプリとアップデートは、現在のメジャーAPI Levelから1年以内のtargetSdkを指定する必要があります。要件に違反すると、公開がブロックされ、アプリがストアから削除されます。

Google Playが要件を厳格化する理由

主な理由はセキュリティです。新しいAndroid API Levelごとに、攻撃ベクトルを閉じる動作変更が導入されます:Scoped Storage(API 29)はファイルの盗難を防止、POST_NOTIFICATIONS(API 33)はスパム通知から保護、Foreground Service Types(API 34)は隠れたバックグラウンドサービスを制限します。targetSdkが低いアプリはこれらの保護を受けられず、ユーザーにとって脅威となります。Google Playは最新デバイスで時代遅れのアプリを許可できません。

要件への準拠確認

Google Play ConsoleはAPK/AABのアップロード時にtargetSdkVersionをチェックします。targetSdkが必要なレベルより低い場合、コンソールは「Your app currently targets API level X and must target at least API level Y」というメッセージで公開をブロックします。開発者はbuild.gradleを更新し、アプリを再コンパイルし、動作変更をテストして再アップロードする必要があります。AAB形式はすべての新規公開に推奨されています(2021年8月から必須)。

日付最小targetSdkAndroidバージョン
2022年8月31Android 12
2023年8月33Android 13
2024年8月33Android 13
2025年8月34Android 14
2026年8月(予定)35Android 15

コード内のAPI Level確認:Build.VERSION.SDK_INT

Build.VERSION.SDK_INTは、アプリが実行されているデバイスのAPI Levelを含む静的な整数定数です。これは実行時のAndroidバージョンチェックの主要なツールです。Build.VERSION_CODESには、各API Levelの名前付き定数が含まれています:VERSION_CODES.TIRAMISU(33)、VERSION_CODES.UPSIDE_DOWN_CAKE(34)、VERSION_CODES.VANILLA_ICE_CREAM(35)。if(SDK_INT >= VERSION_CODES.TIRAMISU)による比較が標準的なパターンです。

kotlin
// AndroidコードでのAPI Levelチェックの例
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.graphics.drawable.AdaptiveIconDrawable

class ApiLevelHelper {

    // 1. 基本的なAPI Levelチェック
    fun isAtLeastTiramisu(): Boolean {
        return VERSION.SDK_INT >= VERSION_CODES.TIRAMISU  // 33
    }

    // 2. チェック付きの適応型API呼び出し
    fun getAdaptiveIcon(drawable: android.graphics.drawable.Drawable):
            android.graphics.drawable.Drawable? {
        // AdaptiveIconDrawableはAPI 26(Android 8)でのみ利用可能
        if (VERSION.SDK_INT >= VERSION_CODES.O) {
            return AdaptiveIconDrawable(drawable, null)
        }
        return drawable  // 古いデバイス用のフォールバック
    }

    // 3. POST_NOTIFICATIONS権限のチェック(API 33+のみ)
    fun canRequestNotificationPermission(): Boolean {
        return VERSION.SDK_INT >= VERSION_CODES.TIRAMISU
    }

    // 4. API Levelによる画像プロバイダーの選択
    fun getImagePickerProvider(): String {
        return when {
            VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE -> {
                // API 34+はPhotoPickerを使用
                "photo_picker"
            }
            VERSION.SDK_INT >= VERSION_CODES.KITKAT -> {
                // API 19+はIntent ACTION_OPEN_DOCUMENTを使用
                "open_document"
            }
            else -> {
                // Legacy:ACTION_GET_CONTENT(全バージョン)
                "get_content"
            }
        }
    }

    // 5. @TargetApiによるJavaスタイルのチェック(後方互換性用)
    @Suppress("DEPRECATION")
    fun checkLegacyStorage(): Boolean {
        // Scoped Storageの動作はSDK_INTではなくtargetSdkに依存
        return VERSION.SDK_INT < VERSION_CODES.Q  // Android 10
    }

    // 6. 分析用のビルド情報
    fun getDeviceApiInfo(): Map<String, Any> {
        return mapOf(
            "sdk_int" to VERSION.SDK_INT,
            "release" to VERSION.RELEASE,
            "codename" to VERSION.CODENAME,
            "incremental" to VERSION.INCREMENTAL,
            "preview_sdk" to VERSION.PREVIEW_SDK_INT
        )
    }
}

// テスト
fun main() {
    val helper = ApiLevelHelper()
    println("API Level: ${VERSION.SDK_INT}")
    println("Is Tiramisu+: ${helper.isAtLeastTiramisu()}")
}

ApiLevelHelperクラスは、API Levelチェックのすべての主要パターンを示しています:SDK_INT >= VERSION_CODESを使用したisAtLeastTiramisu、古いバージョン用のフォールバック付きgetAdaptiveIcon、whenマルチブランチを使用したgetImagePickerProvider、分析用のgetDeviceApiInfo。重要なルールは、SDK_INTをチェックせずに新しいAPIを呼び出さないことです。そうしないと、古いデバイスでNoSuchMethodErrorでアプリがクラッシュします。

ANT(Android New API)とlint

Android Studioには静的アナライザーのlintが含まれており、minSdkVersionを超えるAPIの使用について警告します。SDK_INTのチェックなしでメソッドが呼び出された場合、lintはエラーとして強調表示します:「Call requires API level 34(current min is 26)」。解決策:メソッドに@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)を追加するか、SDK_INTのifチェックを行います。@TargetApiは非推奨のアノテーションであり、@RequiresApiが推奨されます。

API LevelとAndroidバージョンの対応表

API Level表は開発者向けのリファレンスツールです。デバイスのAPI Levelがわかれば、Androidバージョンと利用可能な機能を判断できます。表には、API Level 1(2008年)からAPI Level 36(2025年)までのすべての主要なAndroidリリースがリストされています。コードネーム(Cupcake、Donut、Tiramisu、VanillaIceCream)はGoogle内部およびVERSION_CODESで使用されています。

API LevelAndroidバージョンコードネーム
11.02008
31.5Cupcake2009
82.2Froyo2010
144.0Ice Cream Sandwich2011
194.4KitKat2013
215.0Lollipop2014
236.0Marshmallow2015
268.0Oreo2017
289Pie2018
2910Quince Tart (10)2019
3011Red Velvet Cake2020
3112Snow Cone2021
3313Tiramisu2022
3414Upside Down Cake2023
3515Vanilla Ice Cream2024
3616Baklava2025

表:動作変更のしきい値API Level

次の表は、targetSdkを上げたときに後方互換性を壊す動作変更を導入する主要なAPI Levelを示しています:

API Level動作変更アプリへの影響
29Scoped StoragePictures/Downloads/Musicへの直接ファイルアクセス不可
30Package VisibilityqueryIntentActivities()は操作するパッケージのみを表示
31Foreground Service Notification10秒以内の必須通知
33POST_NOTIFICATIONS通知の実行時権限
34Foreground Service Typesマニフェストでのフォアグラウンドサービス種別宣言
35Privacy Sandbox広告識別子の制限

よくある質問

AndroidのAPI Levelとは?

API Level Androidは、Android APIバージョンの整数識別子です。各リリースには固有の番号があります:Android 13 = API 33、Android 14 = API 34、Android 15 = API 35、Android 16 = API 36。開発者はbuild.gradleでminSdkVersion、targetSdkVersion、compileSdkVersionを指定して互換性を管理します。API Levelは利用可能なクラス、メソッド、動作変更を決定します。

minSdkとtargetSdk、compileSdkの違いは?

minSdkVersion — アプリをインストールするための最小Androidバージョン。targetSdkVersion — アプリがテストされたバージョンで、動作変更を含む。compileSdkVersion — コードをコンパイルするためのSDKバージョン。minSdkが最も低く、targetSdkは可能な限り最新、compileSdkは少なくともtargetSdk以上である必要があります。3つともbuild.gradleで指定します。

targetSdkをデバイスのAndroidバージョンより低く設定するとどうなりますか?

targetSdkVersionがデバイスのAPI Levelより低い場合、AndroidはtargetSdk以降に導入された動作変更を無効にします。たとえば、Android 14(API 34)でtargetSdk = 28の場合、Scoped Storage、POST_NOTIFICATIONS、Foreground Service Typesは適用されません。Google Playはユーザーの安全のため、targetSdkVersionが現在のAPI Levelから1年以内であることを要求します。

デバイスのAPI Levelを確認する方法は?

デバイスのAPI Levelは、定数Build.VERSION.SDK_INT(例:Android 14の場合は34)で利用できます。比較には、Build.VERSION_CODESの名前付き定数を使用します:if(SDK_INT >= VERSION_CODES.TIRAMISU)。Build.VERSION.RELEASEはバージョン文字列("14")を返します。SDK_INTの値はクラスのロード時にキャッシュされ、任意のスレッドからアクセスできます。

Google Playはなぜ毎年新しいtargetSdkを要求するのですか?

Google Playは、セキュリティの動作変更を実装するために毎年targetSdkVersion要件を引き上げています。新しいAPI Levelごとに、Scoped Storage、POST_NOTIFICATIONS、Privacy Sandboxなどの保護が導入されます。targetSdkが低いアプリはこれらの保護を回避し、ユーザーにリスクをもたらします。この要件により、ストア内のすべてのアプリが最新のルールでテストされていることが保証されます。

まとめ

  • API Level — Android APIバージョン(1-36)の整数識別子。アプリの互換性管理に使用
  • minSdkVersionはインストールの最小API Levelを設定、targetSdkVersionは動作変更を含むバージョン、compileSdkVersionはコンパイル用バージョン
  • 動作変更(Scoped Storage、POST_NOTIFICATIONS、Foreground Service Types)は、targetSdkが対応するAPI Level以上の場合のみ適用
  • Google PlayはtargetSdkが1年以内であることを要求し、違反するとアプリの公開をブロック
  • Build.VERSION.SDK_INT — フォールバック付きで新しいAPIを安全に呼び出すためのデバイスAPI Levelの実行時チェック
  • lintはAndroid StudioでminSdkを超えるAPIの使用について警告し、メソッドには@RequiresApiを推奨
  • API 34+の動作変更には必須のフォアグラウンドサービス種別が含まれ、API 35+には広告識別子制限付きのPrivacy Sandboxが含まれる

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください