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

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

 compileSdkVersion 'android-N' buildToolsVersion "24.0.0 rc1" defaultConfig { minSdkVersion 14 targetSdkVersion 'N' } 

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

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

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

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

 android { compileSdkVersion 'android-N' buildToolsVersion 24.0.0 rc1 ... defaultConfig { minSdkVersion 'N' targetSdkVersion 'N' ... } ... }