记录一次使用了flutter-ffmpeg库的Flutter项目优化安卓端apk包大小的经历

项目中要把从硬件端获取到的图片转化成视频,需要使用到ffmpeg的功能,我们的项目是引用了flutter_ffmpeg: ^0.4.2这个版本的库,打包成apk后,大小将近100M,太浪费CDN的流量了,必须要优化一下。

一、有效优化1

1、删除没用的第三库引用 2、清理没用的图片资源 3、添加代码压缩和资源压缩 修改android -> app目录下的build.gradle文件:

arduino 复制代码
signingConfigs {
        release {
        	......
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            shrinkResources true
            minifyEnabled true
            proguardFiles "proguard-rules.pro"
        }
        debug{
            ......
        }
    }

同目录下创建proguard-rules文件:

kotlin 复制代码
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

二、有效优化2

通过腾讯云的jadx-gui工具分析apk的包内容,并对比各个主流的App的apk包:

主流的App都不包含x86 x86_64,而且这两部分的so占的体积也非常大,那就flutter项目中限制release下,只打包arm64-v8a和armeabi-v7a

修改android -> app目录下的build.gradle文件:

arduino 复制代码
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ndk {
                abiFilters 'armeabi-v7a' , 'arm64-v8a'
            }
            shrinkResources true
            minifyEnabled true
            proguardFiles "proguard-rules.pro"
        }
        debug{
            signingConfig signingConfigs.release
            shrinkResources false
            minifyEnabled false
        }
    }

打包后,apk的体积成功下降了三分之一

三、有效优化3

mobile-ffmpeg 是有提供了丰富的引用包的,可以在项目中按照功能的需要进行引入,flutter_ffmpeg是通过在项目中配置flutterFFmpegPackage这个参数来完成这个操作的 修改android目录下的build.gradle文件:

ini 复制代码
ext {
    flutterFFmpegPackage  =  "min-lts"
}

重新打包后,apk的体积又下降了近二分之一,很成功的优化,但是问题又出现了,生成视频的时候,报错了 旧的ffmpeg参数为:

dart 复制代码
'-f image2 -framerate 20 -i $oldPath -c:v libx264 -pix_fmt yuv420p -aspect $bili $tmpVideoPath'

经过一番查找,最后也解决了这个问题,改完后的参数为:

dart 复制代码
'-f image2 -framerate 20 -i "$oldPath" -b:v 2M -pix_fmt yuv420p -aspect $bili "$tmpVideoPath"'

猜想应该是min-lts这种包下不支持选择编码格式造成的

四、无效的优化,但是get到如何将arr文件引入项目

手动引入arr文件到项目中,尝试删除其中的so文件,运行项目,看功能是否运行正常,但是最终失败了,发现删除其中的任何库,都无法将图片生成视频。 但是get到了直接将arr文件引入项目的知识点:

1、下载arr文件,mobile-ffmpeg的库文件下载地址

2、在android目录下创建libs目录并将arr文件放入其中

3、修改android目录下的build.gradle文件:

scss 复制代码
rootProject.allprojects {
    repositories {
        mavenCentral()
        google()
        jcenter()

        flatDir {
            dirs project(':flutter_ffmpeg').file('libs')
        }
    }
}
dependencies {
    implementation(name: 'mobile-ffmpeg-min-gpl-4.4.LTS', ext: 'aar')
}

五、无效的优化,但是get到高版本Android API打包apk,包大小突增的问题

到目前为止:flutter_ffmpeg是已经废弃的了,之前库换成了ffmpeg_kit_flutter,由于ffmpeg_kit_flutter需要将Android API Level修改成24以上的版本,修改了android -> app目录下的build.gradle文件的minSdkVersion为24,修改项目代码,重新打包,打包后发现apk的大小变大了很多 通过查阅资料,发现高版本的Android API 会默认不去压缩一些资源:可阅读这篇文章《秒杀 Flutter 打包 Android APK 包体积突增 ≈2 倍的问题》

在 android/app/build.gradle 增加对应内容,配置项目还是按照旧的方式进行打包: 对于 AGP 8 以上,增加 packaging:

arduino 复制代码
android {
    packaging {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

其他版本增加 packagingOptions:

arduino 复制代码
android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

经过以上一系列的操作,成功将apk大小从将近100M降到了32M,其实如果项目面对的是比较年轻的人群的话,都可以不去兼容32位的安卓手机,如果只是打包64位的包的话,apk还能够降到15M左右。

相关推荐
里欧跑得慢22 分钟前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web
Lanren的编程日记4 小时前
Flutter 鸿蒙应用数据版本管理实战:版本记录+版本回退+版本对比,实现全链路数据版本控制
flutter·华为·harmonyos
MonkeyKing10 小时前
Flutter列表性能极致优化:从卡顿到丝滑
flutter·dart
IntMainJhy10 小时前
「Flutter三方库sqflite的鸿蒙化适配与实战指南:从入门到踩坑的本地数据库开发全记录」
数据库·flutter·华为·信息可视化·数据库开发·harmonyos
梦想不只是梦与想11 小时前
flutter中 safeArea组件
flutter·safearea
Hello__777713 小时前
开源鸿蒙 Flutter 实战|自定义头像组件全流程实现
flutter·华为·harmonyos
LIO13 小时前
Flutter——直击核心的极简指南
flutter
愚者Pro14 小时前
Flutter项目 lib/ 目录结构(大厂规范)
flutter
西西学代码14 小时前
Flutter---设备搜索动画效果(3)
flutter