CompileSdkVersionをNに更新した後、API 22
デバイスでAPKを実行しようとしていますが、実行できません。
compileSdkVersion 'Android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
すぐに使えるビルドツールは、古いデバイスでN Developer Previewアプリを実行できないように設定されています。おそらく、これはGoogleがずさんな方法で、プレビューから作成されたものを人々が出荷できないようにすることです。このアプローチは、過去2つの開発者プレビューでも使用されました。したがって、Googleでは、Android 5.0(API Level 22)デバイスでN Developer Previewアプリをテストして、下位互換性を正しく処理しているかどうかを確認することを望んでいません。
¯\ _(ツ)_ /¯
幸いなことに、ソリューションをハッキングすることができます。
Android {
compileSdkVersion 'Android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 'N'
}
// based on http://stackoverflow.com/a/27372806/115145
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestOutFile = output.processManifest.manifestOutputFile
def xml = new XmlParser().parse(manifestOutFile)
def usesSdk = xml.'uses-sdk'
usesSdk.replaceNode{
'uses-sdk'('Android:minSdkVersion': '15',
'Android:targetSdkVersion': '15')
}
def fw=new FileWriter(manifestOutFile.toString())
new XmlNodePrinter(new PrintWriter(fw)).print(xml)
}
}
}
}
ツールが要求するのはtargetSdkVersion 'N'
であり、それが古いデバイスでアプリを実行する機能を損なうものです。したがって、このGroovyコードの塊により、ビルドツールはtargetSdkVersion 'N'
で始まり、パッケージ化する前に、生成されたマニフェストに別のtargetSdkVersion
値を入れ替えることができます。この場合、minSdkVersion
とtargetSdkVersion
を15に設定していますが、独自の値で置き換えることができます。また、変更を有効にするには、プロジェクトを再ビルドまたはクリーンアップする必要があります。
プラスの側面として、結果のアプリは古いAndroidデバイスにインストールして実行することができます(おそらくコマンドラインビルドを通じてのみ可能ですが、Androidスタジオはこのテクニックを好まなかった)。
マイナス面では、あなたのtargetSdkVersion
は実際にはN
ではなく、N Developer Previewデバイスでのいくつかの動作に影響を与える可能性があります。下位互換性テストに使用する特定のビルドタイプをセットアップし、そのビルドタイプに対してのみマニフェストのトリックを実行することができます。その後、公式のN Developer Previewセットアップを使用して両方をテストし、1つのビルドで下位互換性テストのいくつかの測定を実行できます。
私はうまくいく解決策を見つけましたが、その前に少し歴史があります。私がやったことは、アプリのさまざまなバリアントを作ろうとしていて、各バリアントには独自のcompileSdkVersion
がありました
それらは私のbuild.gradleからのスニペットです
最初の試行(compileSdkVersionはバリアント固有):APIレベルでアプリをインストールできます> = Android- Nのみ
//compileSdkVersion 'Android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
experimental {
compileSdkVersion 'Android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
}
2回目の試行(compileSdkVersionはバリアント固有のままですが、experimental
バリアントを削除しました):Let youアプリをAPIレベルでインストールする<Android-Nのみ
//compileSdkVersion 'Android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
/*
experimental {
compileSdkVersion 'Android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
*/
}
回目の試行(compileSdkVersionは引き続きバリアント固有ですが、experimental
が定義されていますbeforedev
)
//compileSdkVersion 'Android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
experimental {
compileSdkVersion 'Android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
dev {
compileSdkVersion 23
targetSdkVersion 23
}
}
驚いたことに、これはうまくいきました!理由はわかりませんが、わかります。あなたがしなければならないすべては他のバリアントの前にAndroid-Nのみのバリアントを定義するで、=-Android StudioでBuild Variantsをクリックし、コンパイルしたいもの。
Android-Nバグトラッカーに問題を報告し、詳細情報を入手したらこの回答を更新します。