上传应用至Google Play后出现java.lang.NoSuchMethodError求助
Google Play预启动报告崩溃排查方案
崩溃堆栈信息
Fatal Exception: java.lang.NoSuchMethodError: No static method m$2(JJ)J in class Lj$/util/function/IntConsumer$-CC; or its super classes (declaration of 'j$.util.function.IntConsumer$-CC' appears in /data/app/androidx.test.tools.crawler-eRBTmbJC17tDrJVqQd45Aw==/base.apk!classes2.dex) at j$.time.Duration.ofSeconds(:3) at j$.time.temporal.ChronoUnit.<clinit>(:311) at j$.time.temporal.ChronoField.<clinit>(:7) at j$.time.format.DateTimeFormatterBuilder.<clinit>(:20) at j$.time.format.DateTimeFormatter.<clinit>() at j$.time.format.DateTimeFormatter.ofPattern()
崩溃触发代码
private static final DateTimeFormatter DB_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
项目配置详情
'com.android.tools.build:gradle:7.4.2' 'com.google.gms:google-services:4.3.15' Gradle 8.0.2 compileSdkVersion 33 minSdkVersion 21 targetSdkVersion 33
问题排查方向
- Java 8 API兼容缺失:minSdk=21对应Android 5.0,原生不支持
java.time包,依赖AndroidX提供的j$.time兼容实现,但可能因coreLibraryDesugaring未正确配置,导致部分方法未被转译。 - 预启动测试环境类加载冲突:堆栈中出现的
androidx.test.tools.crawler是Play预启动测试的爬虫工具,其类加载器可能优先加载了不完整的j$.util.function类,导致目标方法缺失。 - Gradle/AGP版本不兼容:AGP 7.4.2与Gradle 8.0.2的组合可能存在编译阶段的Java 8兼容配置漏洞,导致部分兼容方法未被正确打包。
- 静态初始化时机问题:
DateTimeFormatter作为静态常量在类加载时立即初始化,预启动爬虫可能在应用依赖库未完全加载完成时触发类加载,引发初始化异常。
复现方法建议
- 开启coreLibraryDesugaring测试:在模块build.gradle中添加配置:
然后在Android 5.0-6.0的真机/模拟器上运行应用,验证是否崩溃。android { compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' } - 模拟预启动测试环境:引入
androidx.test.tools.crawler依赖,编写Instrumented Test触发目标类的加载,模拟爬虫的执行逻辑。 - 临时禁用R8混淆:在build.gradle中关闭R8(
minifyEnabled false),打包测试包上传至Play内部测试,查看预启动报告是否仍出现崩溃,排查混淆是否导致方法被误删。 - 修改初始化方式:将静态常量改为懒加载模式,避免类加载时立即初始化:
替换原有使用方式后测试。private static DateTimeFormatter DB_DATE_TIME_FORMATTER; public static DateTimeFormatter getDbDateTimeFormatter() { if (DB_DATE_TIME_FORMATTER == null) { synchronized (YourClassName.class) { if (DB_DATE_TIME_FORMATTER == null) { DB_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); } } } return DB_DATE_TIME_FORMATTER; }
内容的提问来源于stack exchange,提问作者jrola
相关产品推荐
相关产品推荐

