安卓:如何在不支持的安卓版本上安装应用程序

3

我们停止支持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(apply from:'../android.gradle')
子模块A(特定于模块的更改)
build.gradle(依赖于主模块)
子模块B(特定于模块的更改)
build.gradle(依赖于主模块)
我有一个名为android.gradle的顶级构建文件,其中包含SDK版本。然后,我的模块通过apply from: '../android.gradle'包含构建文件。如果我直接将minSdkVersion放在主模块中,则警告消息会消失。这是正确的方法吗?还是我需要为每个子模块设置minSdkVersion?或者是否还有另一种方法可以使SDK版本保留在android.gradle文件中?

1
你的清单上有什么? - JMR
我在清单文件中没有设置最低或目标SDK版本。 - Wirling
尝试使用“grep”查找您的项目中是否有定义数字9的内容。 - JMR
1
@Wirling,仍需再次检查您的主模块(通常命名为“app”)中的build.gradle文件以及同一模块中的清单文件。 - Sufian
你的编译SDK版本是什么? - New Coder
编译SDK版本23 - Wirling
4个回答

2

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

此外,我得出结论,手动安装不受支持的应用程序是可能的。 然而,Google Play商店应该防止用户安装或更新应用程序。


Android Studio会在打开的文件顶部显示此选项,每当在build.gradle中或其周围进行更改时。奇怪的是你没有早些注意到。 - Sufian

1
我个人从未为Android开发过任何东西,但在安装应用程序时,设备在安装不受操作系统版本支持的.apk时从未抱怨过。即使商店说它不受支持,我仍然可以将其安装为.apk,因此我认为它实际上无法被阻止。

那样的话应用程序就会崩溃。 - JMR
我知道Google Play商店会阻止用户安装不兼容的应用程序。大多数情况下,它甚至不会显示该应用程序。但是,这可能仅在我正确设置了最低版本的情况下才有效,而我现在并不确定。 - Wirling
1
@ketkev 你可能正在使用其中一个xposed模块或其他一些黑客工具。这些情况是例外,OP不是在谈论它们。 - Sufian
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Wirling
@wirling jup,但是手动安装应用程序可能会不太稳定/崩溃。 - user4271268
显示剩余2条评论

0

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

当您将应用程序上传到商店时,商店不会向具有低于指定最小API级别(在您的情况下为API级别9)的设备的用户显示您的应用程序。

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

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


0
如果我直接将minSdkVersion放在主模块中,警告就会消失。这是正确的做法吗?
您的主模块的最小和目标SDK(即模块的build.gradle内部)将是您的应用程序的SDK。
项目的build.gradle不应包含任何此类信息。
我需要为每个子模块设置一个minSdkVersion吗?还是有其他方法可以使SDK版本保持在android.gradle文件中?
每个模块都定义了自己的最小SDK。如果您正在使用第三方模块/库,则最好不要更改它,除非您知道自己在做什么。

没有显示任何消息,这非常奇怪。我的其他同事可以证实这一点。 - Wirling
android.gradle 是我的项目顶层构建文件,其中包含 minSdkVersion。它被导入到所有其他子模块的 build.gradle 中。我们在项目位置没有 build.gradle 文件(或者也许 android.gradle 命名不正确?)。但是我们的项目有很多模块和 gradle 文件,这使得它非常复杂。 - Wirling
在我看来,这似乎是一个错误。AS总是创建build.gradle而不是android.gradle。我已经从Eclipse导入了项目,也在AS中创建了新项目,从未见过android.gradle。每个模块都应该有自己的minSdkVersion(在其自己的build.gradle中)。将其编写在项目的根目录中可能会在将来引起混淆(如果有人尝试使用SDK版本进行冒险)。 - Sufian
1
@Wirling,你做错了。在所有版本中使用相同的minSdkVersion是错误的,可能会在未来让某些人感到困惑。如果它最初是为了更新compileSdktargetSdk而设置的快捷方式,请参考如何使用gradle为所有模块定义通用的Android属性 - Sufian
谢谢提供链接。我认为我需要改变一些东西。我不知道定义共同属性的正确方式。 - Wirling
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接