【问题标题】:Android: able to install app for unsupported Android versionAndroid:能够为不受支持的 Android 版本安装应用程序
【发布时间】:2016-06-08 03:26:00
【问题描述】:

我们将放弃对 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(包含 SDK 版本的顶级构建文件)
  • 主模块(包含其他模块的基本代码)
    • build.gradle(应用自:'../android.gradle')
  • 子模块 A(模块特定更改)
    • build.gradle(依赖于主模块)
  • 子模块 B(模块特定更改)
    • build.gradle(依赖于主模块)

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

【问题讨论】:

  • 清单上有什么?
  • 我没有在清单中放置最低或目标 SDK 版本。
  • 尝试查找您的项目中是否有一些用“grep”定义 9 的东西...
  • @Wirling 仍然,再次检查您的主模块中的build.gradle(通常命名为app)并再次检查同一模块中的清单文件。
  • wat 是你编译的 sdk 人

标签: android android-gradle-plugin android-version android-api-levels android-min-sdk


【解决方案1】:

好吧...我终于意识到我的项目结构没有任何问题。我唯一需要做的就是按下“使用 Gradle 文件同步项目”的小按钮。之后,所有错误都消失了。

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

【讨论】:

  • Android Studio 会在打开的文件顶部显示该选项,只要在 build.gradle 中或附近进行更改。奇怪的是你没有及早注意到。
【解决方案2】:

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

【讨论】:

  • 这样应用可能会崩溃。
  • 好吧,我知道 Google Play 商店会阻止用户安装不兼容的应用程序。大多数时候甚至根本没有向您显示应用程序。但它可能只有在我正确设置我现在不确定的最低版本时才有效。
  • 如果没有指定 APK 的最低 API 级别,则无法安装。
  • @JMR 是的,它可能会崩溃,但大多数时候它工作正常。当用户大部分时间手动安装 .apk 时,他们是更“高级”的用户。
  • @ketkev 您可能正在使用其中一个 xposed 模块或其他一些黑客。这种情况是例外,OP 没有在谈论它们。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    如果我将 minSdkVersion 直接放在主模块中,则警告 消失。应该是这样吗?

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

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

    或者我需要设置一个 每个子模块的 minSdkVersion?或者有没有其他方法可以让 SDK 版本可以保留在 android.gradle 文件中吗?

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

    【讨论】:

    • SDK 版本位于 android.gradle 并包含在单独的模块中。我的项目的 build.gradle 文件不包含这些 SDK 版本。我只需要将我的项目与 Gradle 文件同步,现在它工作正常。显然它不是由清理或重建项目触发的。看看我的回答。
    • @Wirling 在您进行更改时没有显示同步 gradle 的消息吗?
    • 不,它没有显示消息,这很奇怪。我的其他同事可以确认这一点。
    • @Wirling 我仍然不明白android.gradle 文件是什么。你在说build.gradle吗?你在哪里定义minSdkVersion?在项目的build.gradle(位置~/build.gradle)或应用模块(位置~/app/build.gradle)内?
    • @Wirling 你做错了。对所有版本使用相同的 minSdkVersion 是错误的,并且将来可能会使某人感到困惑。如果它是作为更新compileSdktargetSdk 的快捷方式开始的,请查看How to define common android properties for all modules using gradle
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多