Я пытаюсь запустить APK на устройстве API 22
после обновления compileSdkVersion до N, но не смог этого сделать.
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
Я пытаюсь запустить 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'
...
}
...
}