【问题标题】:Proper way to test Android app on lower API level (Android Studio)在较低的 API 级别(Android Studio)测试 Android 应用程序的正确方法
【发布时间】:2023-03-03 17:49:01
【问题描述】:

我是 Android 新手(但对编程并不陌生),并且正在开发我的第一个严肃的 Android 应用程序。在我为 Marshmallow(API 级别 23)开发之前,一切都很顺利。我决定在另一台 API 级别 16 的设备上测试我的应用程序,现在编译器会抛出许多警告和错误,如下所示:

06-26 12:14:13.060 19473-19473/com.blueit.unico E/Trace: error opening trace file: No such file or directory (2)
06-26 12:14:13.100 19473-19473/com.blueit.unico W/dalvikvm: VFY: unable to resolve virtual method 482: Landroid/content/Context;.getSystemService (Ljava/lang/Class;)Ljava/lang/Object;
06-26 12:14:13.100 19473-19473/com.blueit.unico E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method com.blueit.unico.UnicoApplication.access$super
06-26 12:14:13.100 19473-19473/com.blueit.unico W/dalvikvm: VFY: unable to resolve check-cast 242 (Landroid/os/UserHandle;) in Lcom/blueit/unico/UnicoApplication;
06-26 12:14:13.100 19473-19473/com.blueit.unico W/dalvikvm: VFY: unable to resolve virtual method 536: Landroid/content/ContextWrapper;.getCodeCacheDir ()Ljava/io/File;

似乎是某种版本冲突。应用程序本身已部署,似乎工作正常(但现在非常基本)。我在网上做了一些研究,有人提到我需要在 build.gradle 文件中更改 targetSDKVersion。但是我真的需要手动编辑这个文件吗? Android Studio 不应该识别该设备具有较旧的 API 并针对该版本进行编译吗?我之前做过一些小测试应用程序,它们运行或不同的设备都没有问题,没有改变任何东西。

如果互联网上的人是对的,我真的需要手动编辑 build.gradle 文件,它看起来像这样:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.blueit.unico"
        minSdkVersion 11
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
}

然后新的问题出现了。我究竟需要改变什么?我很清楚 targetSdkVersion 和 compileSdkVersion 可能应该更改,但是这些行呢?

buildToolsVersion "23.0.3"

compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'

他们也应该改变吗?如果是,是什么版本?
提前谢谢你。

已解决: 在注意到所有错误和警告都来自 dalvikvmdoing some 研究了几个小时后,我得出结论,这是某种 dalvik 虚拟机验证和它们不是“真正的”错误和警告——只是我的应用程序使用新功能的信息(它确实如此)。不过,忽略数十个错误和警告感觉很奇怪。

【问题讨论】:

    标签: android compiler-errors build.gradle


    【解决方案1】:

    如果您无法访问旧设备,您仍然可以在 Android Stuido SDK 中下载旧图像并模拟旧设备。

    【讨论】:

      【解决方案2】:

      安装具有较低 android 版本的新模拟器(您可能想尝试 Genymotion)。还有支持库,将新功能移植到较低的api(类名以支持开头,请参阅文档)

      【讨论】:

      • 我有一个 API 级别 16 的物理设备,不需要模拟器。问题在于编译。也许我应该改写主题..
      【解决方案3】:

      Android Studio 确实可以识别尝试下载应用的设备是哪个操作系统版本。但问题是您的应用程序可能不针对旧版本,而仅针对 API 23。当您使用 API 23 时,API 23 中添加了一些新类,旧版本无法运行。因此,您还需要制作针对旧版本的应用版本,如果您需要一些来自 API 23 的类,您需要找到一种不同的方法来实现它。

      【讨论】:

      • 他的最小 api 版本是 11,我认为这意味着 gradle 会检查所有使用的 api 是否兼容回该版本?
      • 当我使用与我的最低 SDK 版本不兼容的功能时,我指望 Android Studio 会警告我。但这次没有。为什么不?也许是 IDE 中的一些设置?
      • 我认为 API 11 与 100% 的设备兼容。 @Janeks Bergs 检查您的目标 API 是什么以及您的最低 API 是什么。我认为这可能是问题所在,但我不确定。如果您的最低 API 为 11,目标为 23,则 AS 不会对此发出警告。
      • @leonz 好的,我开始明白了...所以 IDE 仅在与目标 SDK 不兼容时才向我发出警告,而不是我尝试部署的那个,对吧?
      • 我想是的,是的。尽管不要相信我的话,而是在 Google Developers 页面上查看它。此外,请始终尝试使用 API 尽可能低。如果您的目标 API 是 23,但您的应用没有使用任何高于 API 20 的类,那么您应该使用 API 20。
      【解决方案4】:

      您不需要更改目标 sdk 版本。 min sdk 版本定义了你的应用将支持的最低 api 版本,11 已经很低了。目标 sdk 版本是编译应用程序的版本,最小 sdk 版本只是告诉 android studio 不要让您使用该版本之前不可用的功能 - 除非您明确处理它。此外,您绝对不需要更改应用程序兼容库版本 - 它们可以使最新的 api 可用于旧版本。您提到您的应用程序运行良好 - 如果这是正确的,那么您无需执行任何操作!

      【讨论】:

      • 它工作正常,但我是否理解正确,每当使用“新”功能时,都会发生崩溃?我如何保证这不会发生?
      • 您理解正确,但当您尝试在 android studio 中构建项目时它会“崩溃”(因此它甚至不会让您创建一个使用比您所说的更新的功能的 apk你的最小 SDK)。附带说明一下,min sdk 实际上就是 min sdk。您甚至无法在 sdk 10 的设备上安装 min sdk 11 的应用程序。
      • 我还是一头雾水。所以 Android Studio 让我构建 apk 并将其部署到设备,即使它知道应用程序使用仅在较新的 SDK 中可用的功能?但这是导致崩溃的秘诀!
      • 反之。只有当它知道您的应用不使用 min sdk 版本中不可用的功能时,它才允许您构建。
      • 如您所见。只有在设备上部署应用程序时才会出现问题和错误消息。
      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2014-06-19
      • 2015-04-18
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多