2

Google I/O 基調講演と Android M 機能に関する一連の講演の直後に、私は新しい SDK 機能 (ランタイム パーミッションなど) をいじり始めました。そのためには、とをに設定する必要があります。Android M Developer Preview がインストールされた Nexus 5 でプロジェクトを実行すると、Android Studio によってアプリケーションがインストールされ、デバイスで正常に動作します。compileSdkVersiontargetSdkVersionandroid-mnc

たとえば、2.3.6 デバイスでテストするために 10に設定しminSdkVersionたり、5.0 デバイスでテストするために 21 に設定したりすると、M-Nexus5 では機能しますが、M API よりも低い前述のデバイスでは機能しません。バージョン。

apply plugin: 'com.android.application'

android {
    buildToolsVersion "22.0.1"
    compileSdkVersion 'android-MNC'

    defaultConfig {
        applicationId "de.FOOBAR.permtestproject"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 23
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
}

次のスクリーンショットでわかるように、minSdkVersion を要求されたレベル 22 ではなく 10 に設定したにもかかわらず、レベル 21 デバイスは互換性がないと表示されます。

フォアグラウンドで使用可能なデバイス ダイアログ、バックグラウンドで gradle ビルド ファイル

targetSdkVersionto を下げて21も違いはありません。compileSdkVersionM(NC) 以前の SDK ではアクセス許可要求の呼び出しが利用できないため、 を変更することはできません。

M 以前のデバイスでアプリケーションを実行しようとすると、常にエラーで失敗しますINSTALL_FAILED_OLDER_SDK

INSTALL_FAILED_OLDER_SDK

4

1 に答える 1

4

自分自身の引用

M Developer Preview の場合、 のcompileSdkVersionandroid-MNCにより、ビルド プロセスは MNC をminSdkVersionおよびtargetSdkVersion生成されたマニフェストに配置します。

幸いなことに、マニフェストはテキスト ファイルです。

そのため、MNC に対してコンパイルされ、API レベル 15+ デバイスで実行されるアプリ モジュールをビルドできる Android クロージャーを次に示します。

android {
    compileSdkVersion 'android-MNC'
    buildToolsVersion "23.0.0 rc1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 15
    }

    // based on http://stackoverflow.com/a/27372806/115145

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.processManifest.doLast {
                def manifestOutFile = output.processManifest.manifestOutputFile
                def newFileContents = manifestOutFile.getText('UTF-8').replace("MNC", "15")
                manifestOutFile.write(newFileContents, 'UTF-8')
            }
        }
    }
}

MNCこれは、生成されたマニフェストを読み取り、出現するすべてのをに置き換え15、調整されたマニフェストを元に戻すという、非常に「穴居人の」アプローチを問題に対してとります。MNCこれは、アクティビティのクラス名など、別の場所にあるプロジェクトでは失敗します。また、 と の両方minSdkVersiontargetSdkVersion同じ値に設定します。より洗練されたスクリプトは、これらの個々の属性を置き換えます。これの証明は、読者の課題として残されています。同様に、より強力なスクリプトは、目的の値をdefaultConfigそしてそれらを適用します。また、これの安全性を意識した版では、デバッグ可能なバリアントにのみ適用されるため、このオーバーライドを実行するリリース ビルドを出荷しようとするよだれをたらしている愚か者の影響を軽減するのに役立ちます。これは単なる概念実証であり、可能なすべての機能を実装しているわけではありません。

繰り返しますが、これを行って結果を Play ストアやその他の場所に公開することは、非常にばかげています。これはテスト目的でのみ使用してください。

于 2015-06-09T14:19:04.593 に答える