当前位置: 首页 > 面试题库 >

是否可以仅根据Android OS版本加载特定的代码行?

楚彦
2023-03-14
问题内容

是否有简单的代码行,仅在OS版本满足要求时才允许加载代码?

可以说我的目标操作系统为2.2,但对于Android
1.5,最小sdk为3,因此即使我的项目中的某些代码与1.5不兼容,由于目标操作系统为2.2,它仍将编译。无论如何,我想宣传一项功能,该功能要求代码不在1.5
SDK中,如果在1.5手机上加载该代码,则会导致崩溃。我可以做一个简单的事情吗?因此,我不必使整个应用程序对1.5个用户不可用?

 if (Android OS == >2.1){
            //Insert code here that requires 2.1 and up}
        else{
            //insert code that would appear is OS is <2.1}

问题答案:

是的,你可以这样做。实际上,有不止一种方法。(请注意:此答案的唯一Android特定部分是您查找平台版本的方式。)

假设该类在版本2.0及更高版本中X具有方法void y(),但以前没有。

调用该方法而不引入任何编译时相关性的一种方法是使用反射来定位方法并对其进行调用invoke。例如:

X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
    // (exception handling omitted ...)
    Method m = c.getClass().getDeclaredMethod("y");
    m.invoke(x);
}

另一种方法是为您的应用程序创建版本兼容性适配器API,如下所示:

/** Version compatibility adapter API */
interface Compat {
    void doY();
}

/** Adapter class for version 1 */
class CompatV1 {
    public void y(X x) {
       // do nothing
    }
}

/** Adapter class for version 2 */
class CompatV2 {
    public void y(X x) {
       x.y();
    }
}

// 
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
    compatClass = Class.forName("...CompatV1");
} else {
    compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();

// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.

// Invoke X.y() as follows:

X x = ...
compat.y(x);

第二个版本看起来有点重量级,但是它的优点是动态(慢速,非类型安全的)代码仅执行一次,并且版本特定的代码与其余代码隔离。在现实生活中,您可能会将许多方法放入适配器接口。

这种方法需要更多的思考,才能弄清楚如何设计兼容性API,以便将版本依赖性与其余代码完全隔离。您可能还必须修改适配器API,并为每个新的(不兼容的)主要版本创建新的适配器类。

最后,如果需要更改平台API以适应新的版本中 删除 的旧版本中使用的类或方法,则需要CompatV*使用不同的Android SDK
编译各种适配器类(例如,这些类)。这将使您的构建过程变得更加复杂。

有关此问题的其他“建议”,请阅读Android博客上的以下文章:

  • Android应用程序的向后兼容性
  • 如何也要吃(杯子)蛋糕。


 类似资料:
  • 问题内容: 如标题所述,我想基于仅在运行时可用的信息来动态加载(或不)动态加载Go软件包。 目的是允许用户通过添加新的本机脚本命令的自定义程序包扩展程序。当前,每次我添加新命令或禁止使用某些命令时,都需要编辑程序并重新编译,而如果我可以制作某种dll之类的文件,则可以创建一个“导入”脚本命令来搜索和加载命名命令库。 出于好奇,该程序是基于定制命令的脚本库,我将其用于各种用途。 我提前进行了一些搜索

  • 我想编写一个由文件路径参数化的宏。在编译时,它读取该文件并根据其内容发出Rust代码。这可能吗? 我发现但不清楚我如何在编译时使用它的结果,而不是将内容按原样拼接到生成的代码中。

  • 假设我想 通过克隆备份env, 然后将env的Python版本从3.7. x升级到3.10. x。 有可能吗?如果是,我应该如何进行?

  • 我们有一个web应用程序,我们想在“批处理”模式下运行,在这种模式下,我们不希望任何endpoint暴露(出于安全原因)。 这在SpringBoot可能吗?

  • 本文向大家介绍symfony3 5.根据特定的Symfony版本创建项目,包括了symfony3 5.根据特定的Symfony版本创建项目的使用技巧和注意事项,需要的朋友参考一下 示例 如果您的项目需要基于特定的Symfony版本,请使用新命令的可选第二个参数: 安装程序还支持称为lts的特殊版本,该特殊版本将安装可用的最新Symfony LTS版本: 阅读Symfony发布过程,以更好地理解为什

  • 我有不同的电影类别,但我希望戏剧帖子有不同于其他类型的布局。