Android N – 尽pipeminSDK设置为14,但无法在较低的API上运行

我试图在将compileSdkVersion更新为N之后在API 22设备上运行APK,但无法这样做。

 compileSdkVersion 'android-N' buildToolsVersion "24.0.0 rc1" defaultConfig { minSdkVersion 14 targetSdkVersion 'N' } 

在这里输入图像说明

Solutions Collecting From Web of "Android N – 尽pipeminSDK设置为14,但无法在较低的API上运行"

开箱即用,构build工具设置为阻止您在较旧的设备上运行N Developer Preview应用程序。 据推测,谷歌试图阻止人们运送预览版本的内容,这是一个马虎的方式。 过去两次开发者预览中也使用了这种方法。 因此,Google不希望您在Android 5.0(API Level 22)设备上testing您的N Developer Preview应用程序,以查看是否正确处理向后兼容性。

¯\ _(ツ)_ /¯

幸运的是,你可以在一个解决scheme:

 android { compileSdkVersion 'android-N' buildToolsVersion "24.0.0 rc1" defaultConfig { minSdkVersion 15 targetSdkVersion 'N' } // based on http://stackoverflow.com/a/27372806/115145 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代码块允许构build工具以targetSdkVersion 'N'开始,然后在打包之前将另一个targetSdkVersion值交换到生成的清单中。 在这种情况下,我将minSdkVersiontargetSdkVersion设置为15,但是您可以用自己的值replace。 此外,您将需要重build或清理项目以使更改生效。

从另一方面来说,可以在较旧的Android设备上安装并运行生成的应用(尽pipe可能只通过命令行构build;我认为Android Studio不喜欢这种技术)。

在负面的情况下,你的targetSdkVersion实际上不会是N ,这可能会影响N Developer Preview设备上的一些行为。 您可能需要设置一个特定的构buildtypes,用于向后兼容性testing,并且只对该构buildtypes执行我的hack-the-manifest技巧。 然后,您可以使用官方的N Developer Preview安装程序进行testing,并在一个版本中执行一些向后兼容性testing。

我find了一个可行的解决scheme,但在此之前,有一点历史。 我所做的是试图让我的应用程序的不同变种,每个变种将有自己的compileSdkVersion

这些是从我的build.gradle片段

第一次尝试 (compileSdkVersion是变体特定的)让您只在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 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唯一变体 ,单击Android Studio中的“ 构build变 体” ,然后select要编译的变体

我将在Android-N错误跟踪器中提出问题,并在获取更多信息时更新此答案。

如果不破解解决scheme, 就无法做到这一点。
这是N-Preview的限制,你只能使用这个configuration:

 android { compileSdkVersion 'android-N' buildToolsVersion 24.0.0 rc1 ... defaultConfig { minSdkVersion 'N' targetSdkVersion 'N' ... } ... }