Подтвердить что ты не робот

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

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

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

  defaultConfig {
     minSdkVersion 'N'
     targetSdkVersion 'N'
     ...
  }
  ...
}