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

时间:2016-03-10 23:35:58

标签: android android-7.0-nougat

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

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

enter image description here

3 个答案:

答案 0 :(得分: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)
            }
        }
    }
}

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

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

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

答案 1 :(得分:1)

我找到了一个有效的解决方案,但在此之前有一段历史。我所做的是尝试使用我的应用程序的不同变体,每个变体都有自己的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仍然是特定于变体的,但experimentaldev 之前定义为

//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中点击构建变体,然后选择您要编译的那个。

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

答案 2 :(得分:-1)

无法破解解决方案。< 这是N-Preview的限制,您必须仅使用此配置:

android {
  compileSdkVersion 'android-N'
  buildToolsVersion 24.0.0 rc1
  ...

  defaultConfig {
     minSdkVersion 'N'
     targetSdkVersion 'N'
     ...
  }
  ...
}