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

