Как запустить приложение с 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?

EDIT:

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

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

Источник: Reddit

Ответы

Ответ 1

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

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

Итак, ваш файл 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, используя при этом опрятные новые представления и утилит в поддержке lib!


Далее, я немного изменил платформу 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, сохраняя обратную совместимость!


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

Все кредиты передаются EddieRingle