Flutter Android端用--split-per-abi时build number莫名增量异常
我在Flutter跨平台项目(iOS+Android)中遇到了一个诡异的问题:使用Package Info Plus获取应用版本和Build Number时,iOS端显示完全正常,但Android端在使用--split-per-abi构建分架构APK时,Build Number会被自动加上固定增量,通用APK则无此问题。
代码实现
用于显示版本的Widget:
class AppVersionWidget extends StatelessWidget { const AppVersionWidget({super.key}); @override Widget build(BuildContext context) => FutureBuilder<String>( future: _getAppVersion(), builder: (context, snapshot) => snapshot.hasData ? Text( 'v${snapshot.data}', style: context.textTheme.bodySmall!.apply( color: context.customColorScheme?.whiteFixed, ), textAlign: TextAlign.center, ) : const SizedBox.shrink(), ); Future<String> _getAppVersion() async { final packageInfo = await PackageInfo.fromPlatform(); final appVersion = packageInfo.version; final buildVersion = packageInfo.buildNumber; return '$appVersion ($buildVersion)'; } }
异常现象
- iOS端:版本
1.0.0、Build Number123时,显示1.0.0 (123),完全正常。 - Android分架构APK:同样配置下显示
1.0.0 (2123),Build Number被自动增加2000;用Kotlin原生代码${BuildConfig.VERSION_CODE}获取时,数值会被增加4000。 - Android通用APK:Build Number显示正常,但APK体积过大,不适合测试场景。
调试验证
在build.gradle中添加调试代码:
println "Debug Output: Version Code = ${flutterVersionCode}" println "Debug Output: Version Name = ${flutterVersionName}"
构建过程输出结果正确:
Debug Output: Version Code = 123 Debug Output: Version Name = 1.0.0
构建方式对比
异常场景(分架构APK):
> flutter build apk --split-per-abi --build-number=1 Debug Output: Version Code = 1 Debug Output: Version Name = 4.0.0 Running Gradle task 'assembleRelease'... 36.5s ✓ Built build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk (25.2MB). ✓ Built build/app/outputs/flutter-apk/app-arm64-v8a-release.apk (26.9MB). ✓ Built build/app/outputs/flutter-apk/app-x86_64-release.apk (28.2MB). > adb install build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
安装后Build Number显示异常。
正常场景(通用APK):
> flutter build apk --build-number=1 Debug Output: Version Code = 1 Debug Output: Version Name = 4.0.0 Running Gradle task 'assembleRelease'... 29.7s ✓ Built build/app/outputs/flutter-apk/app-release.apk (69.4MB). > adb install build/app/outputs/flutter-apk/app-release.apk
安装后显示完全正常。
解决方案
这是Flutter内置的分架构APK版本代码自动调整机制导致的:为避免Google Play上架时不同架构APK版本代码冲突,Flutter会给不同架构的APK版本代码加上固定偏移量(比如arm64-v8a加4000、armeabi-v7a加2000)。
方法1:手动覆盖版本代码(推荐)
在Android项目的android/app/build.gradle中,通过flutterVersionCodeOverride禁用自动调整,直接使用原始版本代码:
android { defaultConfig { // 强制使用传入的原始版本代码,禁用自动偏移 flutterVersionCodeOverride = flutterVersionCode.toInteger() } }
⚠️ 注意:如果需要上架Google Play,不同架构APK的版本代码必须唯一,此时可以手动给不同架构添加自定义偏移,确保版本代码整体递增。
方法2:获取原始版本代码用于显示
如果仅需在App内展示原始Build Number,可通过以下方式实现:
- 在
android/app/build.gradle中注入原始版本代码到Manifest:
flutter { source '../..' def originalVersionCode = flutterVersionCode.toInteger() manifestPlaceholders = [originalVersionCode: originalVersionCode] }
- 在
AndroidManifest.xml中添加meta-data:
<meta-data android:name="ORIGINAL_VERSION_CODE" android:value="${originalVersionCode}" />
- 在Flutter中通过
PackageInfo.fromPlatform()读取该meta-data值(需借助MethodChannel或原生桥接)。
方法3:全局禁用版本代码自动调整
在项目根目录的gradle.properties中添加配置:
flutter.disableVersionCodeCheck=true
此配置会完全关闭Flutter的版本代码自动调整逻辑,但需自行保证不同架构APK的版本代码唯一性,避免上架冲突。
内容的提问来源于stack exchange,提问作者TheQ

