如何解决Flutter应用在Android 16KB页面大小设备上的安装失败问题?
Flutter应用无法在16KB页面大小设备运行的修复方案
错误日志
Failure [INSTALL_FAILED_INVALID_APK: INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]
Error launching application on sdk gphone16k x86 64.
环境信息
- Flutter版本:3.19.4(后续升级至3.22.1、3.24.1仍报错)
- 平台:Android和iOS
- compileSdkVersion:34
- 使用Firebase
更新信息
升级到Flutter 3.24.1重新构建后错误依旧,运行官方检测脚本得到以下结果:
./build/app/outputs/flutter-apk/target/lib/mips/libpl_droidsonroids_gif.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libflutter.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libapp.so: \e[32m已对齐\e[0m (2**14) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libpl_droidsonroids_gif.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libbarhopper_v3.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libface_detector_v2_jni.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/armeabi-v7a/libtoolChecker.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/mips64/libpl_droidsonroids_gif.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/x86/libpl_droidsonroids_gif.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86/libbarhopper_v3.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86/libface_detector_v2_jni.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86/libtoolChecker.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libflutter.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libapp.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libpl_droidsonroids_gif.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libbarhopper_v3.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libface_detector_v2_jni.so: \e[32m已对齐\e[0m (2**14) ./build/app/outputs/flutter-apk/target/lib/arm64-v8a/libtoolChecker.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/armeabi/libpl_droidsonroids_gif.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86_64/libflutter.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/x86_64/libapp.so: \e[32m已对齐\e[0m (2**16) ./build/app/outputs/flutter-apk/target/lib/x86_64/libpl_droidsonroids_gif.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86_64/libbarhopper_v3.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86_64/libface_detector_v2_jni.so: \e[31m未对齐\e[0m (2**12) ./build/app/outputs/flutter-apk/target/lib/x86_64/libtoolChecker.so: \e[31m未对齐\e[0m (2**12)
修复步骤
1. 修复第三方Native库对齐问题
从检测结果看,多个第三方Native库(如libpl_droidsonroids_gif.so、libbarhopper_v3.so等)未按16KB页面大小对齐,这是核心问题:
pl_droidsonroids_gif相关库:更新依赖它的Flutter包(如flutter_gifimage)到最新版本,新版本通常会修复对齐问题。- 自定义/其他第三方Native库:
- 若为自行编译的库,修改CMake编译脚本,添加
-Wl,--page-size=16384链接参数,强制按16KB页面大小对齐。 - 若为第三方SDK提供的库,联系开发者获取对齐后的版本,或替换为兼容的替代方案。
- 若为自行编译的库,修改CMake编译脚本,添加
2. 配置AndroidManifest.xml启用自动对齐
在AndroidManifest.xml的<application>标签中添加以下属性,让系统自动处理Native库的对齐:
<application ... android:extractNativeLibs="true" android:hasCode="true">
3. 过滤不必要的CPU架构
在android/app/build.gradle中指定只构建目标架构,减少对齐问题的影响:
android { ... defaultConfig { ... ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } }
4. 手动对齐APK
构建APK后,使用Android SDK的zipalign工具手动对齐:
zipalign -v -p 4 app-release-unsigned.apk app-release-aligned.apk
之后重新签名对齐后的APK。
5. 更新Firebase依赖
运行flutter pub upgrade更新所有依赖,确保Firebase SDK为最新版本,排查是否存在依赖冲突导致的对齐问题。
内容的提问来源于stack exchange,提问作者shu07
相关产品推荐
相关产品推荐

