Android N — не может работать с более низким API, хотя для minSDK установлено значение 14

Я пытаюсь запустить APK на API 22 устройстве после обновления compileSdkVersion до N, но не могу этого сделать.

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

введите описание изображения здесь


person mjosh    schedule 10.03.2016    source источник


Ответы (3)


По умолчанию инструменты сборки настроены так, чтобы вы не могли запускать приложения N Developer Preview на старых устройствах. Предположительно, это небрежный способ Google попытаться помешать людям отправлять материалы, созданные на основе предварительного просмотра. Этот подход также использовался в последних двух предварительных версиях для разработчиков. Таким образом, Google не хочет, чтобы вы тестировали приложение N Developer Preview на своем устройстве Android 5.0 (уровень API 22), чтобы убедиться, что вы правильно работаете с обратной совместимостью.

¯\_(ツ)_/¯

К счастью, вы можете взломать решение:

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 и targetSdkVersion на 15, но вы можете заменить их своими значениями. Кроме того, вам нужно будет перестроить или очистить проект, чтобы изменения вступили в силу.

Положительным моментом является то, что получившееся приложение можно установить и запустить на более старом Android-устройстве (хотя, возможно, только через сборку из командной строки; я думаю, что Android Studio не понравилась эта техника).

С другой стороны, ваш targetSdkVersion на самом деле не будет N, что может повлиять на поведение на устройствах N Developer Preview. Возможно, вы захотите настроить конкретный тип сборки, который вы используете для тестирования обратной совместимости, и использовать мой трюк «взломать манифест» только для этого типа сборки. Затем вы можете протестировать как с помощью официальной установки N Developer Preview, так и выполнить некоторое тестирование обратной совместимости в одной сборке.

person CommonsWare    schedule 10.03.2016

Я нашел решение, которое работает, но перед этим немного истории. Что я делал, так это пытался иметь разные варианты моего приложения, и у каждого варианта был бы свой собственный 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'
        }
    }

Вторая попытка (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'
        }
        */
    }

Третья попытка (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 и обновить этот ответ, когда получу дополнительную информацию.

person Charles-Eugene Loubao    schedule 11.03.2016

Вы не можете сделать это без взлома решения.
Это ограничение N-Preview, и вы должны использовать только эту конфигурацию:

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

  defaultConfig {
     minSdkVersion 'N'
     targetSdkVersion 'N'
     ...
  }
  ...
}
person Gabriele Mariotti    schedule 10.03.2016
comment
Ну, я не понимаю, каким образом этот ответ поможет мне запустить проект на API-любовнике, чем N!? - person bongo; 26.05.2016
comment
@bongo Вы не можете сделать это, не взломав процедуру. Это ограничение, выбранное командой Android. Я понимаю, что это не помогает, но это точка. Вы не можете этого сделать. - person Gabriele Mariotti; 26.05.2016