Googleの予定では今月中にAndroid Mがリリースされますね。
そこでさっそく試してみたのですが、ビルドの設定ではまったので問題と対策を書いておきます。
問題
Android M対応にあたってbuild.gradleを以下のように設定すると思います。
android {
compileSdkVersion "android-MNC"
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 22
}
...
}
しかし、この設定でビルドをして、Android Mより前のOS端末にインストールすると、
次のエラーが出てインストールができません。minSdkVersionに14を指定しているのでAndroid 4.0.3以上の端末にインストールできるはずなのですが...
Failure [INSTALL_FAILED_OLDER_SDK]
そこで、APKの中にあるAndoridManifest.xmlを見ると、minSdkVersionとtargetSdkVersionがMNC(Android Mのコードネーム)に置き替えられてしまっていました。
<uses-sdk
android:minSdkVersion="MNC"
android:targetSdkVersion="MNC">
これではAndroid MNCより前のOS端末にはインストールできません。
調べるとAndroidのissueに上がっていました。
解決策
解決策としては、先ほどのissueにも書いてあるのですが、コンパイル後のAndroidManifest.xmlの中身を書き替えることで対応します。
次の例ではminSdkVersionとtargetSdkVersionをそれぞれ置き替えています。
android {
...
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestOutFile = output.processManifest.manifestOutputFile
def newFileContents = manifestOutFile.getText('UTF-8').replace("minSdkVersion=\"MNC\"", "minSdkVersion=\"14\"").replace("targetSdkVersion=\"MNC\"", "targetSdkVersion=\"22\"")
manifestOutFile.write(newFileContents, 'UTF-8')
}
}
}
}
こうすることでAndroid Mに対応しながら、それより前のOS端末にもインストールすることができます。これはあくまでこの問題が解決するまでの一時的な対応のため修正されることを期待しています!
まだまだAndroid Mについての実際にやってみた情報は少ないので他にも注意が必要そうです。