Android N - 尽管 minSDK 设置为 14,但无法 运行 降低 API
Android N - Cannot run on lower API though minSDK set to 14
在将 compileSdkVersion 更新为 N 后,我正在尝试 运行 API 22
设备上的 APK,但无法这样做。
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
如果不破解解决方案,你无法做到。
这是 N-Preview 的限制,您必须仅使用此配置:
android {
compileSdkVersion 'android-N'
buildToolsVersion 24.0.0 rc1
...
defaultConfig {
minSdkVersion 'N'
targetSdkVersion 'N'
...
}
...
}
开箱即用的构建工具设置为阻止您在旧设备上 运行ning N Developer Preview 应用程序。据推测,这是 Google 试图阻止人们发布预览版内容的草率方式。在过去的两个开发者预览中也使用了这种方法。因此,Google 不希望您在 Android 5.0(API 级别 22)设备上测试您的 N Developer Preview 应用程序以查看您是否正确处理向后兼容性。
¯\_(ツ)_/¯
幸运的是,您可以破解一个解决方案:
android {
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 'N'
}
// based on
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 Developer Preview 设备上的某些行为。您可能想要设置用于向后兼容性测试的特定构建类型,并且只对该构建类型执行我的 hack-the-manifest 技巧。然后,您可以使用官方 N Developer Preview 设置测试两者,并在一个构建中执行一些向后兼容性测试。
我找到了一个可行的解决方案,但在此之前有一点历史。我所做的是尝试让我的应用程序有不同的变体,每个变体都有自己的 compileSdkVersion
这些是我 build.gradle
的片段
第一次尝试 (compileSdkVersion 是 variant specific):让你在 API 上安装应用程序等级>=ANDROID-N只
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
}
第二次尝试 (compileSdkVersion 仍然特定于变体,但我删除了 experimental
变体):让你仅在 API 级别 < ANDROID-N 上安装应用程序
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
/*
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
*/
}
第三次尝试 (compileSdkVersion 仍然特定于变体,但 experimental
已定义 before dev
)
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
dev {
compileSdkVersion 23
targetSdkVersion 23
}
}
令我大吃一惊的是,这个竟然奏效了!我不知道为什么,但确实如此。您所要做的就是在任何其他变体之前定义您的Android-N only变体,点击[=56=中的构建变体 ] Studio 和 select 你要编译的那一个。
我将在 Android-N 错误跟踪器中提交问题,并在获得更多信息时更新此答案。
在将 compileSdkVersion 更新为 N 后,我正在尝试 运行 API 22
设备上的 APK,但无法这样做。
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 'N'
}
如果不破解解决方案,你无法做到。
这是 N-Preview 的限制,您必须仅使用此配置:
android {
compileSdkVersion 'android-N'
buildToolsVersion 24.0.0 rc1
...
defaultConfig {
minSdkVersion 'N'
targetSdkVersion 'N'
...
}
...
}
开箱即用的构建工具设置为阻止您在旧设备上 运行ning N Developer Preview 应用程序。据推测,这是 Google 试图阻止人们发布预览版内容的草率方式。在过去的两个开发者预览中也使用了这种方法。因此,Google 不希望您在 Android 5.0(API 级别 22)设备上测试您的 N Developer Preview 应用程序以查看您是否正确处理向后兼容性。
¯\_(ツ)_/¯
幸运的是,您可以破解一个解决方案:
android {
compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 'N'
}
// based on
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 Developer Preview 设备上的某些行为。您可能想要设置用于向后兼容性测试的特定构建类型,并且只对该构建类型执行我的 hack-the-manifest 技巧。然后,您可以使用官方 N Developer Preview 设置测试两者,并在一个构建中执行一些向后兼容性测试。
我找到了一个可行的解决方案,但在此之前有一点历史。我所做的是尝试让我的应用程序有不同的变体,每个变体都有自己的 compileSdkVersion
这些是我 build.gradle
的片段第一次尝试 (compileSdkVersion 是 variant specific):让你在 API 上安装应用程序等级>=ANDROID-N只
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
}
第二次尝试 (compileSdkVersion 仍然特定于变体,但我删除了 experimental
变体):让你仅在 API 级别 < ANDROID-N 上安装应用程序
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
dev {
compileSdkVersion 23
targetSdkVersion 23
}
/*
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
*/
}
第三次尝试 (compileSdkVersion 仍然特定于变体,但 experimental
已定义 before dev
)
//compileSdkVersion 'android-N'
buildToolsVersion '24.0.0 rc1'
productFlavors {
experimental {
compileSdkVersion 'android-N'
minSdkVersion 'N'
targetSdkVersion 'N'
}
dev {
compileSdkVersion 23
targetSdkVersion 23
}
}
令我大吃一惊的是,这个竟然奏效了!我不知道为什么,但确实如此。您所要做的就是在任何其他变体之前定义您的Android-N only变体,点击[=56=中的构建变体 ] Studio 和 select 你要编译的那一个。
我将在 Android-N 错误跟踪器中提交问题,并在获得更多信息时更新此答案。