项目中要把从硬件端获取到的图片转化成视频,需要使用到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左右。