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

调用getLongVersionCode()报NoSuchMethodError,改用BuildConfig返回-1求助

解决Android版本号获取的两个问题

一、getLongVersionCode()崩溃的原因与修复

你碰到的NoSuchMethodError是因为getLongVersionCode()这个方法是Android 9.0(API 28)才新增的,而你的minSdkVersion设置为15,在API 28以下的设备上,系统的PackageInfo类根本没有这个方法,调用自然会崩溃。

要做兼容处理,我们可以根据系统版本判断分支,低版本用旧的versionCode字段(int类型),高版本用新方法:

private long getCurrentCode() {
    try {
        PackageInfo packageInfo = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            return packageInfo.getLongVersionCode();
        } else {
            // 低版本直接返回int类型的versionCode,会自动转成long
            return packageInfo.versionCode;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}

二、BuildConfig.VERSION_NAME返回-1的排查方向

正常来说,你的gradle里已经配置了versionName '2.0.66',BuildConfig.VERSION_NAME应该返回这个字符串,返回-1肯定是哪里出问题了,你可以按以下步骤排查:

  • 检查BuildConfig导入是否正确:如果是多模块项目,有可能不小心导入了其他模块的BuildConfig,确保导入的是当前应用模块的com.xxxxxx.yyyyy.BuildConfig
  • 同步并清理项目:在Android Studio里点击File > Sync Project with Gradle Files,然后执行Build > Clean Project和Build > Rebuild Project,也可以用命令行执行./gradlew clean build
  • 检查buildType/flavor配置:查看gradle里有没有在debug或者其他buildType、productFlavor里单独设置versionName "-1",覆盖了默认配置
  • 确认applicationId一致性:你的gradle里applicationId是com.xxxxxx.yyyyy,但崩溃日志里的包名是com.xxxxx.debug,可能debug环境下加了applicationIdSuffix,这时候要确认debug版本的versionName有没有被单独覆盖

内容的提问来源于stack exchange,提问作者Cyrus the Great

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:12:52