compileSdkVersion を N に更新した後、デバイスで APK を実行しようとしていますが、実行API 22
できません。
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
compileSdkVersion を N に更新した後、デバイスで APK を実行しようとしていますが、実行API 22
できません。
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
すぐに使用できるビルド ツールは、古いデバイスで N Developer Preview アプリを実行できないように設定されています。おそらく、これは Google が、プレビューから構築されたものを人々が出荷するのを防ごうとするずさんな方法です。このアプローチは、過去 2 回の開発者プレビューでも使用されました。そのため、Google は、下位互換性を正しく処理しているかどうかを確認するために、Android 5.0 (API レベル 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
andtargetSdkVersion
を 15 に設定していますが、独自の値に置き換えることができます。また、変更を有効にするには、プロジェクトを再構築またはクリーンアップする必要があります。
プラス面としては、結果として得られるアプリを古い Android デバイスにインストールして実行することができます (ただし、おそらくコマンドライン ビルドを使用する必要があります。Android Studio はこの手法を好まなかったと思います)。
マイナス面としては、N Developer Preview デバイスの一部の動作に影響を与える可能性があるため、targetSdkVersion
実際には ではありません。N
下位互換性テストに使用する特定のビルド タイプをセットアップし、そのビルド タイプに対してのみハック ザ マニフェスト トリックを実行することもできます。次に、公式の 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
バリアントを削除しました) :アプリを 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'
}
*/
}
3 回目の試行 (compileSdkVersion はまだバリアント固有ですが、以前にexperimental
定義されています) dev
//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 でバリアントをビルド] をクリックして、コンパイルするバリアントを選択するだけです。
Android-N バグ トラッカーに問題を報告し、詳細がわかり次第、この回答を更新します。
ソリューションをハッキングせずにそれを行うことはできません。
これは N-Preview の制限であり、次の構成のみを使用する必要があります。
android {
compileSdkVersion 'android-N'
buildToolsVersion 24.0.0 rc1
...
defaultConfig {
minSdkVersion 'N'
targetSdkVersion 'N'
...
}
...
}