如果您针对预览版 SDK (android-L) 进行编译,构建工具将锁定minSdkVersion
并锁定targetSdkVersion
到相同的 API 级别。这导致生成的应用程序无法安装在运行旧版本 Android 的设备上,即使您的应用程序没有执行任何特定于 L 的操作。
Android Gradle 插件 0.11 版默认开启了一个新的 Manifest Merger,它允许我们做一些漂亮的事情。所以你必须在你的AndroidManifest.xml
文件中添加一个简单地指定tools:node
属性的 uses-sdk 节点。
此特定配置告诉清单处理器将来自uses-sdk
较低优先级清单(例如库清单)中节点的任何属性替换为具有该属性的uses-sdk
节点中的tools:node="replace"
属性。由于 Gradle 也将minSdkVersion
和targetSdkVersion
from yourbuild.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
orandroid-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 团队甚至认为这是一个问题)。
所有的学分都归于 EddieRingle