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

