新規アプリのリリースは2018年8月から、既存アプリのアップデートは2018年10月からtargetSdkVersionを26以上にする必要がある(*1)とのことでその対応の際に調べたことの備忘録。
今までbuild.gradle周りの理解がふんわりし過ぎていたので、一歩前進した。
調べたこと
minSdkVersion
アプリを実行することができる最小のAPIレベルの指定。
このSdkVersionより上のAndroidでは動きますよ、ということ。
端末のSdkVersionがこれより低い場合、アプリはそもそもインストールできない。
targetSdkVersion
アプリがターゲットとするAPIレベルの指定。設定しない場合は、minSdkVersionとイコールになる。
targetSdkVersionの指定が必要な理由は、AndroidがAPIレベルごとに動作や外観を変更される可能性があるためである。
targetSdkVersionを指定することで、仮にAndroidのAPIレベルがtargetSdkVersionよりも大きい場合でも、開発者が想定した動作・外観でアプリが動く。
AndroidのAPIレベルがtargetSdkVersionよりも低い場合は、AndroidのAPIレベルでの動作・外観が優先される。
buildToolsVersion
SDKビルドツールのバージョンの指定。アプリビルドの際のコンパイラのバージョンのこと。
コンパイラのバージョンなので、後述のcompileSdkVersionを上げた時は一緒に上げる必要がある。
Android Studio 3.0.0以降は必須ではなくなっていて、指定しない場合は使用しているpluginが必要とする内で一番高いバージョンが使われる。
compileSdkVersion
アプリをコンパイルする際のAPIバージョン。このAPIバージョンまでの機能をアプリ内で利用することができる。
例えばcompileSdkVersionを20に設定した上で、APIレベル21の機能を使おうとするとコンパイルエラーが起きる。
ちなみにcompileSdkVersionを21に設定していたとしても、APIレベル21の機能を使わない限りはAPIレベルが21未満の端末上でもアプリは動作する。
なのでminSdkVersin <= compileSdkVersion
かつcompileSdkVersionの機能をアプリ内で使う
場合は下記のように条件分岐で対応すると良いっぽい。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) {
// ここはLollipop(Android 5.0)以降で実行される。
} else {
// こっちはKitKat(Android 4.4)以前。
}
終わりに
以上の関係を踏まえると、
minSdkVersion <= targetSdkVersion <= compileSdkVersion <= buildToolsVersion
ということになる?