【问题标题】:Android N - Cannot run on lower API though minSDK set to 14Android N - 尽管 minSDK 设置为 14,但无法在较低的 API 上运行
【发布时间】:2016-06-26 01:32:56
【问题描述】:

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

compileSdkVersion 'android-N'
buildToolsVersion "24.0.0 rc1"

defaultConfig {
       minSdkVersion 14
       targetSdkVersion 'N'
}

【问题讨论】:

    标签: android android-7.0-nougat


    【解决方案1】:

    如果不破解解决方案,您无法做到
    这是 N-Preview 的限制,您必须仅使用此配置:

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

    【讨论】:

    • 好吧,我看不出这个答案以什么方式帮助我在 api 爱好者上运行项目而不是 N !?
    • @bongo 如果不破解程序,您将无法做到这一点。这是android团队选择的限制。我可以理解这无济于事,但这是重点。你做不到。
    【解决方案2】:

    我找到了一个可行的解决方案,但在此之前有一点历史。我所做的是尝试让我的应用程序有不同的变体,每个变体都有自己的compileSdkVersion

    这些是我的 build.gradle 中的 sn-ps

    第一次尝试 (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 级别上安装应用程序

        //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 Variants 并选择您要编译的那个。

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

    【讨论】:

      【解决方案3】:

      开箱即用,构建工具设置为阻止您在旧设备上运行 N Developer Preview 应用程序。据推测,这是谷歌试图阻止人们发布基于预览版的东西的一种草率方式。在过去的两个开发者预览版中也使用了这种方法。因此,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 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 Developer Preview 设备上的某些行为。您可能想要设置用于向后兼容性测试的特定构建类型,并且只对该构建类型执行我的 hack-the-manifest 技巧。然后,您可以使用官方的 N Developer Preview 设置进行测试,并在一个版本中执行一些向后兼容性测试。

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多