Проект android-MNC не будет работать на устройствах до уровня API «android-MNC».

Вскоре после основного доклада Google I/O и последовательных разговоров о функциях Android M я начал экспериментировать с новыми функциями SDK, например, разрешениями во время выполнения. Для этого необходимо установить compileSdkVersion, а также с targetSdkVersion по android-mnc. При запуске проекта на Nexus 5 с установленной версией Android M Developer Preview Android Studio устанавливает приложение, и оно отлично работает на устройстве.

Если я установлю minSdkVersion, например, на 10, чтобы протестировать его на устройстве 2.3.6, или на 21, чтобы протестировать его на устройстве 5.0, он все равно будет работать на 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'
}

Как вы можете видеть на следующем снимке экрана, мое устройство уровня 21 показано как несовместимое, хотя я установил для minSdkVersion значение 10, а не заявленный уровень 22.

Диалог доступных устройств на переднем плане, файл сборки Gradle на заднем плане

Снижение targetSdkVersion до 21 не имеет значения. Изменение compileSdkVersion невозможно, так как вызовы запросов на разрешение не были доступны в пакетах SDK до M(NC).

Попытка запустить приложение на устройстве pre-M всегда заканчивается ошибкой INSTALL_FAILED_OLDER_SDK.

INSTALL_FAILED_OLDER_SDK


person PattaFeuFeu    schedule 09.06.2015    source источник
comment
возможный дубликат Android Studio: сбой [INSTALL_FAILED_OLDER_SDK]   -  person rds    schedule 03.07.2015


Ответы (1)


Цитирую себя:

В случае M Developer Preview значение compileSdkVersion для android-MNC приводит к тому, что процесс сборки помещает MNC в качестве minSdkVersion и targetSdkVersion в сгенерированном манифесте.

К счастью, манифесты представляют собой текстовые файлы.

Итак, вот закрытие Android, которое может создать модуль приложения, который компилируется с MNC, но будет работать на устройствах уровня API 15+:

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 находится где-то еще, например, в имени класса активности. Он также устанавливает одинаковое значение для minSdkVersion и targetSdkVersion. Более сложный сценарий заменит эти отдельные атрибуты, доказательство этого оставлено читателю в качестве упражнения. Точно так же более мощный сценарий считывал бы нужные значения из defaultConfig и применял их. И версия, ориентированная на безопасность, будет применять это только для отлаживаемых вариантов, тем самым помогая уменьшить влияние пускающего слюни идиота, пытающегося отправить сборку выпуска, которая выполняет это переопределение. Это просто доказательство концепции, а не реализация всех возможных наворотов.

Опять же, делать это и публиковать результаты в Play Store или где-либо еще — монументальный идиотизм. Используйте это только для тестирования.

person CommonsWare    schedule 09.06.2015
comment
Сначала казалось, что это не работает, но чистка проекта помогла. У меня это работает как на устройстве уровня 10, так и на устройстве уровня 21. Большое спасибо! - person PattaFeuFeu; 10.06.2015