Android N - 虽然minSDK设置为14,但无法在较低的API上运行

mjo*_*osh 17 android android-7.0-nougat

我正在尝试API 22在将compileSdkVersion更新为N但无法执行此操作后在设备上运行APK .

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Com*_*are 17

开箱即用,构建工具设置为阻止您在旧设备上运行N Developer Preview应用程序.据推测,这是谷歌试图阻止人们发布预览内容的一种草率方式.在过去的两个开发人员预览中也使用了这种方法.因此,Google不希望您在Android 5.0(API Level 22)设备上测试N Developer Preview应用程序,以确定您是否正确处理向后兼容性.

¯\ _(ツ)_ /¯

幸运的是,你可以破解一个解决方案:

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些工具需要什么targetSdkVersion 'N',这就是破坏您在旧设备上运行应用程序的能力.因此,这个大块的Groovy代码允许构建工具开始targetSdkVersion 'N',然后targetSdkVersion在打包之前将另一个值交换到生成的清单中.在这种情况下,我将minSdkVersion和设置targetSdkVersion为15,但您可以用自己的值替换.此外,您还需要重建或清理项目才能使更改生效.

从好的方面来说,生成的应用程序可以在较旧的Android设备上安装和运行(尽管可能只通过命令行构建;我认为Android Studio不喜欢这种技术).

在负面,您targetSdkVersion实际上不会N,这可能会影响N Developer Preview设备上的某些行为.您可能希望设置用于向后兼容性测试的特定构建类型,并且仅对该构建类型执行hack-the-manifest技巧.然后,您可以使用官方N Developer Preview设置进行测试,并在一个版本中执行一些向后兼容性测试.