Android: можно установить приложение для неподдерживаемой версии Android

Мы отказываемся от поддержки устройств Android 2.3 (API уровня 9), поскольку у большинства наших пользователей на телефонах установлена ​​более новая версия Android. Я обновил минимальную версию SDK до уровня API 14.

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
    }
}

Однако я все еще могу установить приложение на устройства Android 2.3 вручную (не в магазине). Это ожидаемое поведение или я делаю что-то не так? Я не мог найти ответ где-то еще.

Еще одна странная проблема заключается в том, что Lint не определяет правильный уровень API.

listView.setFastScrollAlwaysVisible(true);

Это приводит к предупреждению: для вызова требуется уровень API 11 (текущий минимум равен 9). Однако мой текущий минимум сейчас 14. Так что это указывает мне, что я сделал что-то не так. Я попытался очистить и перестроить проект, перезапустив Android Studio. Все это не сработало.

Может кто-нибудь мне помочь?

Изменить

Основываясь на комментарии суфиев, я начал возиться со своими файлами gradle и пришел к следующему решению. Однако некоторые вопросы все еще остаются. Структура моего проекта выглядит так:

  • android.gradle (файл сборки верхнего уровня, содержащий версии SDK)
  • main module (contains base code for other modules)
    • build.gradle (apply from: '../android.gradle')
  • sub module A (module specific changes)
    • build.gradle (has dependency on main module)
  • sub module B (module specific changes)
    • build.gradle (has dependency on main module)

У меня есть файл сборки верхнего уровня android.gradle, который содержит версии SDK. Затем мои модули включают файл сборки apply from: '../android.gradle'. Если я помещу minSdkVersion непосредственно в основной модуль, предупреждения исчезнут. Так и должно быть? или мне нужно установить minSdkVersion для каждого подмодуля? Или есть другой способ, чтобы версии SDK могли оставаться в файле android.gradle?


comment
что у тебя было в манифесте?   -  person JMR    schedule 25.02.2016
comment
Я не указал минимальную или целевую версию SDK в манифесте.   -  person Wirling    schedule 25.02.2016
comment
попробуйте найти, есть ли в вашем проекте что-то, что определяет 9 с помощью grep, например...   -  person JMR    schedule 25.02.2016
comment
@Wirling еще раз, проверьте еще раз свой build.gradle в своем основном модуле (обычно с именем app) и снова проверьте файл манифеста в том же модуле.   -  person Sufian    schedule 25.02.2016
comment
Что такое ваш скомпилированный sdk человек   -  person New Coder    schedule 25.02.2016
comment
compileSdkVersion 23   -  person Wirling    schedule 25.02.2016


Ответы (4)


Хорошо... Наконец-то я понял, что в структуре моего проекта нет ничего плохого. Единственное, что мне нужно было сделать, это нажать маленькую кнопку «Синхронизировать проект с файлами Gradle». После этого все ошибки исчезают.

Также я пришел к выводу, что можно установить неподдерживаемые приложения вручную. Однако Google Play Store должен запретить пользователям устанавливать или обновлять приложение.

person Wirling    schedule 25.02.2016
comment
Android Studio показывает эту опцию в верхней части открытых файлов всякий раз, когда вносятся изменения в build.gradle или около него. Странно, что вы не заметили достаточно рано. - person Sufian; 25.06.2016

Лично я никогда ничего не разрабатывал для Android, но при установке приложений устройство никогда не жаловалось при установке .apk, который не поддерживался версией ОС.
даже когда в магазине было сказано, что он не поддерживается, я всегда могу установить его как .apk, поэтому я думаю, что его нельзя заблокировать.

person Community    schedule 25.02.2016
comment
таким образом приложение может вылететь. - person JMR; 25.02.2016
comment
Ну, я знаю, что Google Play Store запрещает пользователям устанавливать несовместимые приложения. В большинстве случаев приложение даже не показывается. Но это, вероятно, работает, только если я правильно установил минимальную версию, в чем я сейчас не уверен. - person Wirling; 25.02.2016
comment
Если минимальный уровень API APK не указан, его нельзя будет установить. - person Sufian; 25.02.2016
comment
@JMR да, это может привести к сбою, но в большинстве случаев работает нормально. и когда пользователь устанавливает .apk вручную, большую часть времени он является более продвинутым пользователем. - person ; 25.02.2016
comment
@ketkev, возможно, вы используете один из этих модулей xposed или какие-то другие хаки. Такие случаи являются исключениями, и ОП о них не говорит. - person Sufian; 25.02.2016
comment
Итак, если я правильно понимаю, ничто не мешает вам установить приложение вручную, но Google Play Store не позволяет пользователю устанавливать/обновлять приложение. Меня это устраивает. - person Wirling; 25.02.2016
comment
@wirling jup, но при ручной установке приложение может быть менее стабильным/вылетать - person ; 25.02.2016

Да, вы можете установить приложение вручную на свое устройство, если минимальный уровень API, указанный в вашем манифесте, меньше уровня API вашего устройства.

Когда вы загружаете свое приложение в магазин, магазин не будет показывать ваше приложение пользователям устройств с версией Android ниже указанного минимального уровня API (уровень API 9 в вашем случае).

Что касается предупреждений Lint, убедитесь, что минимальная/максимальная версии SDK в вашем файле манифеста совпадают с указанными в файле build.gradle.

и вы также можете убедиться, что новые API не выполняются на более старых уровнях API, проверив версию ОС в коде. http://developer.android.com/reference/android/os/Build.VERSION.html

person Mina Wissa    schedule 25.02.2016

Если я помещу minSdkVersion непосредственно в основной модуль, предупреждения исчезнут. Так и должно быть?

Минимальный и целевой SDK вашего основного модуля (т. е. внутри build.gradle модуля) будут соответствовать вашему приложению.

build.gradle проекта не должно содержать никакой этой информации.

или мне нужно установить minSdkVersion для каждого подмодуля? Или есть другой способ, чтобы версии SDK могли оставаться в файле android.gradle?

Каждый модуль определяет свой минимальный SDK. Если вы используете сторонний модуль/библиотеку, вам лучше не менять его, если вы не знаете, что делаете.

person Sufian    schedule 25.02.2016
comment
Версии SDK находятся в android.gradle и включены в отдельные модули. Файл build.gradle моего проекта не содержит этих версий SDK. Мне просто нужно было синхронизировать мой проект с файлами Gradle, и теперь он работает нормально. По-видимому, это не вызвано очисткой или перестройкой вашего проекта. Проверьте мой ответ. - person Wirling; 25.02.2016
comment
@Wirling, разве ваша студия не показывала сообщение для синхронизации gradle, когда вы вносили изменения? - person Sufian; 25.02.2016
comment
Нет, это не показало сообщение, что очень странно. Другие мои коллеги могут это подтвердить. - person Wirling; 25.02.2016
comment
@Wirling Я до сих пор не понимаю, что такое файл android.gradle. Ты говоришь о build.gradle? И где вы определяете minSdkVersion? Внутри build.gradle проекта (местоположение ~/build.gradle) или модуля приложения (местоположение ~/app/build.gradle)? - person Sufian; 25.02.2016
comment
android.gradle — это файл сборки верхнего уровня моих проектов, который содержит файл minSdkVersion. Он импортируется во все остальные подмодули build.gradle. У нас нет файла build.gradle в местоположении проекта (или, может быть, android.gradle назван неправильно?). Но в нашем проекте много модулей и файлов gradle, что делает его очень сложным. - person Wirling; 26.02.2016
comment
@Wirling мне кажется, что это ошибка. AS всегда создает build.gradle, а не android.gradle. Я импортировал проекты из Eclipse, а также создавал новые проекты в AS и никогда не видел android.gradle. И у каждого модуля должен быть свой minSdkVersion (внутри своего build.gradle). Написание его в корне проекта может создать путаницу в будущем (на случай, если кто-то попытается поэкспериментировать с версиями SDK). - person Sufian; 26.02.2016
comment
Я должен вернуться к моему предыдущему комментарию. Я упустил из виду тот факт, что у нас есть файл build.gradle для нашего проекта. Я думаю, что мы вручную создали файл android.gradle (содержащий версии SDK), чтобы мы могли импортировать его в другие модули, потому что модули имеют много общего (они используются для брендинга). Так что я думаю, что сейчас все в порядке, потому что каждый модуль использует minSdkVersion из android.gradle. - person Wirling; 26.02.2016
comment
@Wirling, ты делаешь это неправильно. Использование одного и того же minSdkVersion для всех версий неправильно и может кого-то запутать в будущем. Если это началось как ярлык для обновления compileSdk и targetSdk, посмотрите Как определить общие свойства Android для всех модулей с помощью gradle - person Sufian; 26.02.2016
comment
Спасибо за ссылку. Я думаю, что мне нужно изменить некоторые вещи вокруг. Я не знал, как правильно определить общие свойства. - person Wirling; 26.02.2016