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
相关产品推荐
相关产品推荐

