17

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

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

ここに画像の説明を入力

4

3 に答える 3

17

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

プラス面としては、結果として得られるアプリを古い Android デバイスにインストールして実行することができます (ただし、おそらくコマンドライン ビルドを使用する必要があります。Android Studio はこの手法を好まなかったと思います)。

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

于 2016-03-10T23:49:45.993 に答える
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 バグ トラッカーに問題を報告し、詳細がわかり次第、この回答を更新します。

于 2016-03-11T20:18:19.867 に答える
-1

ソリューションをハッキングせずにそれを行うことはできません。
これは N-Preview の制限であり、次の構成のみ使用する必要があります。

android {
  compileSdkVersion 'android-N'
  buildToolsVersion 24.0.0 rc1
  ...

  defaultConfig {
     minSdkVersion 'N'
     targetSdkVersion 'N'
     ...
  }
  ...
}
于 2016-03-10T23:40:53.000 に答える