web-dev-qa-db-ja.com

Android N-minSDKが14に設定されていても、下位のAPIでは実行できません

CompileSdkVersionをNに更新した後、API 22デバイスでAPKを実行しようとしていますが、実行できません。

compileSdkVersion 'Android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

enter image description here

17
mjosh

すぐに使えるビルドツールは、古いデバイスで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値を入れ替えることができます。この場合、minSdkVersiontargetSdkVersionを15に設定していますが、独自の値で置き換えることができます。また、変更を有効にするには、プロジェクトを再ビルドまたはクリーンアップする必要があります。

プラスの側面として、結果のアプリは古いAndroidデバイスにインストールして実行することができます(おそらくコマンドラインビルドを通じてのみ可能ですが、Androidスタジオはこのテクニックを好まなかった)。

マイナス面では、あなたのtargetSdkVersionは実際にはNではなく、N Developer Previewデバイスでのいくつかの動作に影響を与える可能性があります。下位互換性テストに使用する特定のビルドタイプをセットアップし、そのビルドタイプに対してのみマニフェストのトリックを実行することができます。その後、公式のN Developer Previewセットアップを使用して両方をテストし、1つのビルドで下位互換性テストのいくつかの測定を実行できます。

17
CommonsWare

私はうまくいく解決策を見つけましたが、その前に少し歴史があります。私がやったことは、アプリのさまざまなバリアントを作ろうとしていて、各バリアントには独自の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バグトラッカーに問題を報告し、詳細情報を入手したらこの回答を更新します。