android-MNC项目不会在API级别'android-MNC'之前的设备上运行

时间:2015-06-09 14:10:55

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

在Google I / O主题演讲和关于Android M功能的连续讨论之后不久,我开始使用新的SDK功能,例如运行时权限。对于it is necessary to set compileSdkVersion以及targetSdkVersionandroid-mnc。 在安装了Android M开发人员预览版的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'
}

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

Available devices dialogue in the foreground, gradle build file in the background

targetSdkVersion降低为21并没有什么不同。由于许可请求调用尚未在M(NC)SDK之前提供,因此无法更改compileSdkVersion

尝试在pre-M设备上运行该应用程序始终失败并显示错误INSTALL_FAILED_OLDER_SDK

INSTALL_FAILED_OLDER_SDK

1 个答案:

答案 0 :(得分:4)

Quoting myself

  

对于M Developer Preview,compileSdkVersion的{​​{1}}值会导致构建过程将MNC置于生成的清单中的android-MNCminSdkVersion

     

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

     

所以,这是一个android闭包,它可以构建一个针对MNC编译的app模块,但是可以在API Level 15+设备上运行:

targetSdkVersion
  

这需要一个非常“穴居人”的方法解决问题,读取生成的清单,用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的项目,例如活动的类名,这将失败。它还将MNCminSdkVersion设置为相同的值。一个更复杂的脚本将取代这些个人属性 - 证明这一点是留给读者的练习。同样,更强大的脚本会从targetSdkVersion中读取所需的值并应用它们。并且,安全意识版本仅适用于可调试的变体,从而有助于减少试图运送执行此覆盖的发布版本的流口水白痴的影响。这仅仅是一个概念的证明,没有实现所有可能的花里胡哨。

     

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