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

Flutter Android端用--split-per-abi时build number莫名增量异常

Flutter Android分架构APK构建时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,可通过以下方式实现:

  1. 在android/app/build.gradle中注入原始版本代码到Manifest:
flutter {
    source '../..'
    def originalVersionCode = flutterVersionCode.toInteger()
    manifestPlaceholders = [originalVersionCode: originalVersionCode]
}
  1. 在AndroidManifest.xml中添加meta-data:
<meta-data
    android:name="ORIGINAL_VERSION_CODE"
    android:value="${originalVersionCode}" />
  1. 在Flutter中通过PackageInfo.fromPlatform()读取该meta-data值(需借助MethodChannel或原生桥接)。

方法3:全局禁用版本代码自动调整

在项目根目录的gradle.properties中添加配置:

flutter.disableVersionCodeCheck=true

此配置会完全关闭Flutter的版本代码自动调整逻辑,但需自行保证不同架构APK的版本代码唯一性,避免上架冲突。


内容的提问来源于stack exchange,提问作者TheQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:18:10