如何在旧设备上使用Theme.Material启动应用程序

时间:2014-06-27 10:17:36

标签: android android-5.0-lollipop material-design

如何在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的设备,即使您的应用程序   没有做任何特定的事情。

来源:Reddit

1 个答案:

答案 0 :(得分:20)

如果您针对预览SDK(android-L)进行编译,则构建工具会将minSdkVersiontargetSdkVersion锁定到相同的API级别。这导致生成的应用程序无法安装在运行旧版Android的设备上,即使您的应用程序没有执行特定于L的任何操作。

默认情况下,Android Gradle Plugin版本0.11启用了新的Manifest Merger,它允许我们执行一些nifty内容。因此,您必须在AndroidManifest.xml文件中添加一个uses-sdk节点,该节点只指定tools:node属性。
此特定配置告知清单处理器使用uses-sdk节点中具有uses-sdk属性的属性替换优先级较低的清单(例如库清单)中的tools:node="replace"个节点的任何属性。由于Gradle还会将minSdkVersiontargetSdkVersion中的build.gradleuses-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> 文件看起来应该像这样:

android-21

现在您应该能够在minSdkVersion支持的任何设备上运行您的应用程序,同时利用支持库中的简洁新视图和实用程序!


接下来,我稍微修改了Android L平台,以隐藏它实际上是构建工具的预览平台这一事实。您可以从以下两个镜像中的任何一个下载它: mirror #1mirror #2

将存档解压缩到安装了Android SDK的平台目录中。您会注意到我已将其命名为21,并将API级别设置为L。不要在android-L中引用build.gradle21,而只需使用android { compileSdkVersion 21 buildToolsVersion '20.0.0' defaultConfig { applicationId 'net.eringle.android.ldemo' minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName '1.0' } ... }

{{1}}

现在,当您构建并尝试运行该应用程序时,您应该能够将其发送到较旧的平台设备而不会出现任何问题。玩得很开心,同时保持向后兼容性!


显然,上面提供的解决方法充其量只是黑客攻击。请注明这个issue,因为它似乎最接近问题的核心(如果Android团队甚至认为它是一个问题)。

所有积分都转到EddieRingle