默认情况下,构建工具设置为阻止您在旧设备上运行N开发者预览应用程序。据推测,这是谷歌试图防止人们基于预览构建的内容进行发布的一种懒散方式。这种方法也在过去的两个开发者预览版中使用过。因此,谷歌不希望您在Android 5.0(API级别22)设备上测试N开发者预览应用程序,以查看您是否正确处理了向后兼容性。
¯\_(ツ)_/¯
幸运的是,您可以通过黑科技解决:
android {
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 'N'
}
// based on https://dev59.com/kYXca4cB1Zd3GeqPHFyc#27372806
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestOutFile = output.processManifest.manifestOutputFile
def xml = new XmlParser().parse(manifestOutFile)
def usesSdk = xml.'uses-sdk'
usesSdk.replaceNode{
'uses-sdk'('android:minSdkVersion': '15',
'android:targetSdkVersion': '15')
}
def fw=new FileWriter(manifestOutFile.toString())
new XmlNodePrinter(new PrintWriter(fw)).print(xml)
}
}
}
}
这些工具需要的是 targetSdkVersion 'N'
,这就导致你无法在旧设备上运行应用。所以,这段 Groovy 代码允许构建工具从 targetSdkVersion 'N'
开始,然后在打包前将另一个 targetSdkVersion
值替换为生成的清单文件中。在这种情况下,我将 minSdkVersion
和 targetSdkVersion
设置为 15,但你可以替换成自己的值。此外,你需要重新构建或清理项目才能使更改生效。
好的方面是,最终生成的应用可以安装并在旧版 Android 设备上运行(尽管可能仅限于通过命令行构建;我认为 Android Studio 不喜欢这种技巧)。
不足之处是,你的 targetSdkVersion
实际上并不是 N
,这可能会影响一些 N 开发者预览设备上的行为。你可能想设置一个特定的构建类型,用于进行向后兼容性测试,并仅在该构建类型上使用我的修改清单文件技巧。然后,你可以在一个构建中同时进行正式的 N 开发者预览设置和某些向后兼容性测试。
compileSdkVersion
。 //compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
}
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
/*
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
*/
}
第三次尝试(compileSdkVersion仍然是特定于变量的,但在dev
之前定义了experimental
)
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
dev {
compileSdkVersion 23
targetSdkVersion 23
}
}
如果不进行黑客攻击,你是无法完成它的。
这是N-Preview的限制,你必须仅使用此配置:
android {
compileSdkVersion 'android-N'
buildToolsVersion 24.0.0 rc1
...
defaultConfig {
minSdkVersion 'N'
targetSdkVersion 'N'
...
}
...
}