【问题标题】:android-MNC project won’t run on devices prior to API level 'android-MNC'android-MNC 项目不会在 API 级别“android-MNC”之前的设备上运行
【发布时间】:2015-07-12 18:15:59
【问题描述】:

在 Google I/O 主题演讲和关于 Android M 功能的连续讨论之后不久,我开始尝试新的 SDK 功能,例如运行时权限。对于 it is necessary to set compileSdkVersion 以及 targetSdkVersionandroid-mnc。 在安装了 Android M Developer Preview 的 Nexus 5 上运行项目时,Android Studio 会安装该应用程序,并且它可以在设备上正常运行。

如果我将minSdkVersion 设置为例如 10 以在 2.3.6 设备上测试它或设置为 21 以在 5.0 设备上测试它,它仍然可以在 M-Nexus5 上运行,但不能在上述设备上运行低于 M 的 API 版本。

apply plugin: 'com.android.application'

android {
    buildToolsVersion "22.0.1"
    compileSdkVersion 'android-MNC'

    defaultConfig {
        applicationId "de.FOOBAR.permtestproject"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 23
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
}

正如您在以下屏幕截图中看到的那样,即使我将 minSdkVersion 设置为 10 而不是声称的 22 级别,我的 21 级设备仍显示为不兼容。

targetSdkVersion 降低到21 并没有什么不同。更改 compileSdkVersion 不是一种选择,因为权限请求调用在 M(NC) 之前的 SDK 中不可用。

尝试在 pre-M 设备上运行应用程序总是失败并出现错误 INSTALL_FAILED_OLDER_SDK

【问题讨论】:

标签: android android-studio android-6.0-marshmallow


【解决方案1】:

Quoting myself:

在 M Developer Preview 的情况下,compileSdkVersion 的值 android-MNC 会导致构建过程将 MNC 作为 minSdkVersiontargetSdkVersion 放入生成的清单中。

幸运的是,清单是文本文件。

所以,这里有一个 android 闭包,它可以构建一个针对 MNC 编译但将在 API 级别 15+ 设备上运行的应用模块:

android {
    compileSdkVersion 'android-MNC'
    buildToolsVersion "23.0.0 rc1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 15
    }

    // based on http://stackoverflow.com/a/27372806/115145

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.processManifest.doLast {
                def manifestOutFile = output.processManifest.manifestOutputFile
                def newFileContents = manifestOutFile.getText('UTF-8').replace("MNC", "15")
                manifestOutFile.write(newFileContents, 'UTF-8')
            }
        }
    }
}

这对问题采取了一种非常“穴居人”的方法,读入生成的清单,将所有出现的MNC 替换为15,然后将调整后的清单写回。这将在其他地方有 MNC 的项目上失败,比如活动的类名。它还将minSdkVersiontargetSdkVersion 设置为相同的值。一个更复杂的脚本将替换那些单独的属性——这点的证明留给读者作为练习。同样,更强大的脚本将从defaultConfig 中读取所需的值并应用它们。而且,具有安全意识的版本仅将其应用于可调试的变体,从而有助于减少流口水的白痴试图发布执行此覆盖的发布版本的影响。这只是一个概念证明,并没有实现所有可能的花里胡哨。

同样,这样做并将结果发布到 Play 商店或其他地方是非常愚蠢的。仅用于测试。

【讨论】:

  • 起初它似乎不起作用,但清理项目有帮助。我让它在 10 级设备和 21 级设备上都可以工作。非常感谢!
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2018-03-11
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多