Android:能够为不受支持的 Android 版本安装应用程序

Android: able to install app for unsupported Android version

我们将停止对 Android 2.3(API 级别 9)设备的支持,因为我们的大多数用户的手机上都有较新的 Android 版本。我已将最低 SDK 版本更新为 api 级别 14。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
    }
}

不过,我仍然可以在 Android 2.3 设备上手动安装应用程序(不是通过商店)。这是预期的行为还是我做错了什么?我在其他地方找不到答案。

另一个奇怪的问题是 Lint 没有检测到正确的 api 级别。

listView.setFastScrollAlwaysVisible(true);

这会导致警告:调用需要 api 级别 11(当前最小值为 9)。 然而,我目前的最低限度是 14。所以这向我表明我做错了什么。我尝试清理并重建项目,重新启动 Android Studio。这一切都没有用。

谁能帮帮我?

编辑

根据 Sufians 的评论,我开始摆弄我的 gradle 文件,并得出以下解决方案。然而,一些问题仍然存在。 我的项目结构如下所示:

  • android.gradle (top-level build file which contains SDK versions)
  • main module (contains base code for other modules)
    • build.gradle (apply from: '../android.gradle')
  • sub module A (module specific changes)
    • build.gradle (has dependency on main module)
  • sub module B (module specific changes)
    • build.gradle (has dependency on main module)

我有一个包含 SDK 版本的顶级构建文件 android.gradle。然后我的模块包含 apply from: '../android.gradle' 的构建文件。如果我将 minSdkVersion 直接放在主模块中,警告就会消失。它应该是这样吗?或者我需要为每个子模块设置一个 minSdkVersion 吗?或者有其他方法可以让 SDK 版本保留在 android.gradle 文件中吗?

我个人从来没有为 android 开发过任何东西,但是在安装应用程序时,设备在安装 OS 版本不支持的 .apk 时从未抱怨过。
即使商店说它不受支持,我也总是能够将它安装为 .apk,所以我认为它不能真正被阻止。

是的,只要清单中指定的最低 API 级别低于设备的 API 级别,您就可以在设备上手动安装该应用程序。

当您将您的应用程序上传到商店时,商店不会向设备 Android 版本低于指定的最低 API 级别(API 级别)的用户展示您的应用程序9 在你的情况下)。

关于 Lint 警告,请确保清单文件中的 minimum/maximum SDK 版本与 build.gradle 文件中指定的版本相匹配。

并且您还可以通过检查代码中的 OS 版本来确保新的 API 不会在旧的 API 级别上执行。 http://developer.android.com/reference/android/os/Build.VERSION.html

好的...我终于意识到我的项目结构没有错。我唯一需要做的就是按下 'Sync Project with Gradle Files' 小按钮。之后所有错误都消失了。

我还得出结论,可以手动安装不受支持的应用程序。 但是 Google Play 商店应该会阻止用户安装或更新该应用程序。

If I put the minSdkVersion directly in de main module the warnings disappear. Is that the way it should be?

您的主模块的最小和目标 SDK(即在模块的 build.gradle 内)将是您的应用程序的。

项目的 build.gradle 不应包含任何此类信息。

or do I need to set an minSdkVersion for every submodule? Or is there another way so that the SDK versions can stay within the android.gradle file?

每个模块都定义了自己的最小SDK。如果您使用第三方 module/library,最好不要更改它,除非您知道自己在做什么。