Как запустить приложение с Theme.Material на старых устройствах

Как запустить приложение на pre-v21 устройствах?

compileSdkVersion  'android-L'
minSdkVersion 14
targetSdkVersion 'L'

Я использую только Theme.Material на v21. Я НЕ использую библиотеку поддержки v20, я использую com.android.support:support-v4:19.+

При запуске приложения из Android Studio пишет, что устройство несовместимо:

{compatible=NO, reason=minSdk(API 20, L preview) != deviceSdk(API 16)}

Откуда он берёт minSdk 20?

РЕДАКТИРОВАТЬ:

Причиной этого может быть (если подтверждено), что

Если вы компилируете предварительную версию SDK (android-L), инструменты сборки заблокируют minSdkVersion и targetSdkVersion на том же уровне API. Это приводит к тому, что созданное приложение невозможно установить на устройства с более ранними версиями Android, даже если ваше приложение не делает ничего конкретного для L.

Источник: Reddit


person David Corsalini    schedule 27.06.2014    source источник
comment
Можете ли вы создать отчет о зависимости? Из командной строки Gradle это будет gradle dependencies (или ./gradlew dependencies). Не уверен, как вы добираетесь до него из самой AS.   -  person CommonsWare    schedule 27.06.2014
comment
У меня возникли некоторые проблемы с созданием этого отчета, я буду продолжать попытки.   -  person David Corsalini    schedule 27.06.2014
comment
Я думаю, что я делаю что-то не так. Я запускаю скрипт из корневого каталога проекта, он создает отчет без конфигураций.   -  person David Corsalini    schedule 27.06.2014
comment
Попробуйте запустить его из модуля, а не из корня, и посмотрите, что получится.   -  person CommonsWare    schedule 27.06.2014


Ответы (1)


Если вы компилируете предварительную версию SDK (Android-L), инструменты сборки заблокируют minSdkVersion и targetSdkVersion на том же уровне API. Это приводит к тому, что созданное приложение невозможно установить на устройства с более ранними версиями Android, даже если ваше приложение не делает ничего конкретного для L.

В версии 0.11 Android Gradle Plugin по умолчанию включено новое слияние манифестов, что позволяет нам выполнять некоторые отличные вещи. Таким образом, вы должны добавить в свой AndroidManifest.xml файл узел uses-sdk, который просто указывает атрибут tools:node.
Эта конкретная конфигурация указывает обработчику манифеста заменить любые атрибуты из uses-sdk узлов в манифестах с более низким приоритетом (таких как библиотечные манифесты) на атрибуты в узле uses-sdk с атрибутом tools:node="replace". Поскольку Gradle также вставляет minSdkVersion и targetSdkVersion из вашего узла build.gradle в этот узел uses-sdk, это все, что вам действительно нужно добавить.

Итак, ваш файл AndroidManifest.xml должен выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="net.eringle.android.ldemo">

    <uses-sdk
        tools:node="replace" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Теперь вы сможете запускать свое приложение на любом устройстве, поддерживаемом вашей версией minSdkVersion, используя при этом новые удобные представления и утилиты в библиотеке поддержки!


Затем я немного модифицировал платформу Android L, чтобы скрыть от инструментов сборки тот факт, что это на самом деле платформа для предварительного просмотра. Вы можете скачать его с любого из этих двух зеркал: зеркало №1, зеркало №2.

Распакуйте архив в каталог платформ, где у вас установлен Android SDK. Вы заметите, что я назвал его android-21 и также установил уровень API на 21. Вместо ссылки на L или android-L в build.gradle просто используйте 21:

android {
    compileSdkVersion 21
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId 'net.eringle.android.ldemo'
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    ...
}

Теперь, когда вы создаете и пытаетесь запустить приложение, вы сможете без проблем отправить его на устройства с более старой платформой. Получайте удовольствие, играя с L, сохраняя при этом обратную совместимость!


Очевидно, что обходные пути, представленные выше, в лучшем случае являются хаками. Пометьте эту ошибку, так как он кажется наиболее близким к сути проблемы (если команда Android вообще считает это проблемой).

Все заслуги принадлежат Эдди Ринглу

person Egor Neliuba    schedule 27.06.2014
comment
@DavidCorsalini взгляните на этот пост на Reddit. - person Egor Neliuba; 27.06.2014
comment
Использование модифицированной платформы (андроид-21) работает. Если хотите, отредактируйте этот ответ или создайте новый, я приму его. - person David Corsalini; 27.06.2014
comment
@DavidCorsalini Я отредактировал ответ, как вы предложили. - person Egor Neliuba; 27.06.2014
comment
Модифицированная платформа у меня все равно не работает (андроид-21). Мне все еще не удалось найти цель 21, как было сказано при попытке с compileSdkVersion '19'. В чем может быть проблема? - person Sandra; 07.07.2014
comment
Переход в File->Project Structure и изменение Compile Sdk Version помогло мне. Так что решение работает. - person Sandra; 07.07.2014
comment
Я также должен отметить, что использование android-21 в качестве «Compile Sdk Version» не меняет цвет строки состояния, хотя android:colorPrimaryDark определен в теме материала. Чтобы увидеть эту функцию в действии, вы должны использовать L-устройство (или эмулятор) и скомпилировать sdk, установленный на android-L. - person Sandra; 10.07.2014
comment
См. мой ответ ниже для новой альтернативы версии 0.13 плагина Android Gradle. - person Joe; 08.10.2014