You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio模拟器中String#indent()方法缺失NoSuchMethodError问题

解决Android模拟器中String#indent()方法缺失的NoSuchMethodError问题

问题描述

在Android Studio模拟器上运行项目时触发NoSuchMethodError,提示String#indent(int)方法不存在。该代码在API 31-33的物理设备上运行正常,但在Pixel 4 API 34、Pixel 5 API 33的AVD中抛出异常:

FATAL EXCEPTION: main
Process: com.org.project, PID: 11295
java.lang.NoSuchMethodError: No virtual method indent(I)Ljava/lang/String; in class
Ljava/lang/String; or its super classes (declaration of 'java.lang.String' appears in
/apex/com.android.art/javalib/core-oj.jar)

项目已启用Core Library Desugaring以兼容Java 12+特性,且代码中自行实现了indent方法,但问题仅在模拟器中出现。

解决方案

1. 升级Desugar库并完善编译配置

当前使用的desugar_jdk_libs:2.1.3版本较旧,部分模拟器ART环境对旧版desugar支持不佳。建议升级到最新稳定版,并确保Kotlin编译配置与Desugaring适配:

修改build.gradle:

android {
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = '17'
        // 开启Kotlin对默认方法的兼容,确保Desugaring覆盖Kotlin代码
        freeCompilerArgs += ['-Xjvm-default=all']
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.2.0'
}

2. 添加ProGuard规则强制保留方法

模拟器的ART可能优先加载系统自带的String类,导致自定义/desugared的indent方法被忽略。在proguard-rules.pro中添加规则:

-keepclassmembers class java.lang.String {
    public java.lang.String indent(int);
}

3. 切换模拟器系统镜像类型

当前使用的google_apis镜像兼容性有限,尝试切换到Google Play版系统镜像(带Play Store标识),这类镜像的ART runtime对Desugaring支持更完善。

4. 冷启动模拟器清除快照缓存

模拟器快照可能缓存了旧的runtime状态,导致新配置不生效:

  • 关闭目标模拟器
  • 在AVD管理器中选择该模拟器,点击Cold Boot Now
  • 重新运行项目

5. 替换为不依赖Java 12的兼容实现(备选)

如果以上配置调整无效,可暂时替换自定义indent方法为纯Java 8兼容的实现,绕过Desugaring依赖:

public String indent(int n) {
    if (isEmpty()) {
        return "";
    }
    String[] lines = split("\n");
    StringBuilder result = new StringBuilder();
    String indentPrefix = n > 0 ? " ".repeat(n) : "";

    for (String line : lines) {
        if (n > 0) {
            result.append(indentPrefix).append(line);
        } else if (n == Integer.MIN_VALUE) {
            result.append(line.stripLeading());
        } else if (n < 0) {
            int trimCount = Math.min(-n, line.indexOfNonWhitespace());
            result.append(line.substring(trimCount));
        } else {
            result.append(line);
        }
        result.append("\n");
    }

    return result.length() > 0 ? result.substring(0, result.length() - 1) : result.toString();
}

内容的提问来源于stack exchange,提问作者Delark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:55:07