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は、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に応じて動作変更を適用します。
アプリのインストール時に、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でのコンパイル用プラットフォームをダウンロード |
| lint | minSdkを超えるAPIの使用について警告する静的アナライザー |
build.gradleファイル(Module: app)で、開発者は3つのAPI Levelパラメータを指定します:minSdkVersion、targetSdkVersion、compileSdkVersion。これらを混同することは、初心者のAndroid開発者によくある間違いの1つです。各パラメータは互換性の異なる側面を担当し、それらの値は一貫している必要があります。
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は、アプリがテストされたAPI Levelです。AndroidはtargetSdkを使用して動作変更を適用します:アプリがtargetSdk 33を指定すると、システムはAPI 33で導入されたすべての動作変更を有効にします。targetSdkが31の場合、システムはAPI 32-33の変更を適用せず、古い動作との互換性を維持します。これはセキュリティにとって最も重要なパラメータです:Google PlayはtargetSdkが現在のAPI Levelから1年以内であることを要求します。
compileSdkVersionは、コードのコンパイルに使用するAndroid SDKのバージョンです。コンパイル時にどのAPIが利用可能かを決定します。compileSdkはtargetSdk以上である必要があり、理想的には最新の安定したAPI Levelと等しくする必要があります。compileSdkを上げても実行時の動作には影響しません。コンパイラが新しいAPIを利用できるようになるだけです。compileSdkを上げた後は、非推奨APIと新しい権限要件についてコードを確認する必要があります。
// 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は、フラグメントとテーマの後方互換性を提供します。
minSdkおよびtargetSdkパラメータはAndroidManifest.xmlでも指定できますが、最近のプロジェクトではbuild.gradleを使用します。Gradleの値がマニフェストを上書きします。マニフェストでは、Gradleビルド構成を使用しないライブラリやモジュールのために、
動作変更は、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:マニフェストでのフォアグラウンドサービス種別の必須宣言。
// 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は最も重要な動作変更の1つです。API 29(targetSdk 29+)以降、アプリはPictures、Downloads、Music、Documentsディレクトリに直接ファイルアクセスできません。代わりに、メディアにはMediaStore、任意のファイルにはSAF(Storage Access Framework)、独自のストレージにはgetExternalFilesDir()が使用されます。例外はMANAGE_EXTERNAL_STORAGE権限を持つアプリで、Google Playの承認が必要です。
Google Playは、アプリ公開のためにtargetSdkVersionの必須要件を設定しています。2024年8月以降、Google PlayはtargetSdkVersion >= API 33(Android 13)を要求しています。毎年しきい値が上がり、新しいアプリとアップデートは、現在のメジャーAPI Levelから1年以内のtargetSdkを指定する必要があります。要件に違反すると、公開がブロックされ、アプリがストアから削除されます。
主な理由はセキュリティです。新しい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月から必須)。
| 日付 | 最小targetSdk | Androidバージョン |
|---|---|---|
| 2022年8月 | 31 | Android 12 |
| 2023年8月 | 33 | Android 13 |
| 2024年8月 | 33 | Android 13 |
| 2025年8月 | 34 | Android 14 |
| 2026年8月(予定) | 35 | Android 15 |
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)による比較が標準的なパターンです。
// 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でアプリがクラッシュします。
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表は開発者向けのリファレンスツールです。デバイスのAPI Levelがわかれば、Androidバージョンと利用可能な機能を判断できます。表には、API Level 1(2008年)からAPI Level 36(2025年)までのすべての主要なAndroidリリースがリストされています。コードネーム(Cupcake、Donut、Tiramisu、VanillaIceCream)はGoogle内部およびVERSION_CODESで使用されています。
| API Level | Androidバージョン | コードネーム | 年 |
|---|---|---|---|
| 1 | 1.0 | — | 2008 |
| 3 | 1.5 | Cupcake | 2009 |
| 8 | 2.2 | Froyo | 2010 |
| 14 | 4.0 | Ice Cream Sandwich | 2011 |
| 19 | 4.4 | KitKat | 2013 |
| 21 | 5.0 | Lollipop | 2014 |
| 23 | 6.0 | Marshmallow | 2015 |
| 26 | 8.0 | Oreo | 2017 |
| 28 | 9 | Pie | 2018 |
| 29 | 10 | Quince Tart (10) | 2019 |
| 30 | 11 | Red Velvet Cake | 2020 |
| 31 | 12 | Snow Cone | 2021 |
| 33 | 13 | Tiramisu | 2022 |
| 34 | 14 | Upside Down Cake | 2023 |
| 35 | 15 | Vanilla Ice Cream | 2024 |
| 36 | 16 | Baklava | 2025 |
次の表は、targetSdkを上げたときに後方互換性を壊す動作変更を導入する主要なAPI Levelを示しています:
| API Level | 動作変更 | アプリへの影響 |
|---|---|---|
| 29 | Scoped Storage | Pictures/Downloads/Musicへの直接ファイルアクセス不可 |
| 30 | Package Visibility | queryIntentActivities()は操作するパッケージのみを表示 |
| 31 | Foreground Service Notification | 10秒以内の必須通知 |
| 33 | POST_NOTIFICATIONS | 通知の実行時権限 |
| 34 | Foreground Service Types | マニフェストでのフォアグラウンドサービス種別宣言 |
| 35 | Privacy Sandbox | 広告識別子の制限 |
よくある質問
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は利用可能なクラス、メソッド、動作変更を決定します。
minSdkVersion — アプリをインストールするための最小Androidバージョン。targetSdkVersion — アプリがテストされたバージョンで、動作変更を含む。compileSdkVersion — コードをコンパイルするためのSDKバージョン。minSdkが最も低く、targetSdkは可能な限り最新、compileSdkは少なくともtargetSdk以上である必要があります。3つともbuild.gradleで指定します。
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は、定数Build.VERSION.SDK_INT(例:Android 14の場合は34)で利用できます。比較には、Build.VERSION_CODESの名前付き定数を使用します:if(SDK_INT >= VERSION_CODES.TIRAMISU)。Build.VERSION.RELEASEはバージョン文字列("14")を返します。SDK_INTの値はクラスのロード時にキャッシュされ、任意のスレッドからアクセスできます。
Google Playは、セキュリティの動作変更を実装するために毎年targetSdkVersion要件を引き上げています。新しいAPI Levelごとに、Scoped Storage、POST_NOTIFICATIONS、Privacy Sandboxなどの保護が導入されます。targetSdkが低いアプリはこれらの保護を回避し、ユーザーにリスクをもたらします。この要件により、ストア内のすべてのアプリが最新のルールでテストされていることが保証されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。