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

Azure DevOps打包APK安装失败,如何保留extractNativeLibs=false并修复?

解决方案:调整流水线构建与签名环节,确保原生库不被压缩

当android:extractNativeLibs="false"时,系统要求APK中的原生库(.so文件)必须保持未压缩状态,否则会触发安装失败错误。你需要修改流水线中的两个关键任务,确保打包和签名过程中不对.so文件进行压缩:

1. 修改Flutter Build任务,添加gradle参数禁止压缩.so文件

在FlutterBuild@0任务中新增extraArgs参数,传递gradle配置规则,指定原生库不被压缩:

- task: Hey24sheep.flutter.flutter-build.FlutterBuild@0
  displayName: Build ${{ parameters.appSuffix }} App Bundle
  inputs:
    target: 'apk'
    projectDirectory: '$(Build.SourcesDirectory)'
    buildFlavour: '${{ parameters.appSuffix }}'
    entryPoint: ${{ parameters.flavorEntryPoint }}
    extraArgs: '--gradle-option="--no-compress=lib/**/*.so"' # 新增:禁止压缩.so文件

2. 修改AndroidSigning任务,添加apksigner参数确保未压缩状态

在AndroidSigning@3任务中新增apksignerArguments参数,明确告知签名工具保留.so文件的未压缩状态:

- task: AndroidSigning@3
  displayName: 'Signing and aligning APK file(s) **/*.apk'
  inputs:
    apkFiles: '**/*.apk'
    zipalign: true
    apksign: true
    apksignerKeystoreFile: ${{ parameters.keyStoreFile }}
    apksignerKeystorePassword: ${{ parameters.keyStorePassword }}
    apksignerKeystoreAlias: ${{ parameters.keyAlias }}
    apksignerKeyPassword: ${{ parameters.keyPassword }}
    apksignerArguments: '--no-compress lib/**/*.so' # 新增:签名时保留.so文件未压缩状态

修改后的完整流水线代码

steps:
  - task: android-manifest-version@1
    inputs:
      sourcePath: 'android/app/src/main/AndroidManifest.xml'
      versionCodeOption: 'buildid'
      versionCode: '$(Build.BuildId)'
      versionName: 
      printFile: true
  - task: Hey24sheep.flutter.flutter-build.FlutterBuild@0
    displayName: Build ${{ parameters.appSuffix }} App Bundle
    inputs:
      target: 'apk'
      projectDirectory: '$(Build.SourcesDirectory)'
      buildFlavour: '${{ parameters.appSuffix }}'
      entryPoint: ${{ parameters.flavorEntryPoint }}
      extraArgs: '--gradle-option="--no-compress=lib/**/*.so"'
  - task: DownloadSecureFile@1
    name: keystore
    displayName: Download keystore securely
    inputs:
      secureFile: ${{ parameters.keyStoreFile }}
  - task: AndroidSigning@3
    displayName: 'Signing and aligning APK file(s) **/*.apk'
    inputs:
      apkFiles: '**/*.apk'
      zipalign: true
      apksign: true
      apksignerKeystoreFile: ${{ parameters.keyStoreFile }}
      apksignerKeystorePassword: ${{ parameters.keyStorePassword }}
      apksignerKeystoreAlias: ${{ parameters.keyAlias }}
      apksignerKeyPassword: ${{ parameters.keyPassword }}
      apksignerArguments: '--no-compress lib/**/*.so'
  - task: CopyFiles@2
    displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
    inputs:
      SourceFolder: '$(system.defaultworkingdirectory)'
      Contents: '**/*.apk'
      TargetFolder: '$(build.artifactstagingdirectory)'
      FlattenFolders: true
    condition: succeededOrFailed()
  - task: PublishBuildArtifacts@1
    displayName: 'Publish Artifact: drop'
    inputs:
      PathtoPublish: '$(build.artifactstagingdirectory)'

原理说明

  • extractNativeLibs=false时,系统会直接从APK中加载原生库,无需解压到设备存储,因此要求.so文件必须保持未压缩状态。
  • Flutter Build环节的--no-compress参数告知gradle打包时不对lib目录下的.so文件进行压缩。
  • AndroidSigning环节的--no-compress参数确保签名工具不会对这些文件重新压缩,维持其未压缩状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:39:28