Я пытаюсь запустить 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'
...
}
...
}