记录一次使用了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左右。

相关推荐
旭日猎鹰34 分钟前
Flutter踩坑记录(三)-- 更改入口执行文件
flutter
旭日猎鹰34 分钟前
Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
flutter
️ 邪神34 分钟前
【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
flutter·ios·鸿蒙·reactnative·anroid
比格丽巴格丽抱12 小时前
flutter项目苹果编译运行打包上线
flutter·ios
SoaringHeart12 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter
AiFlutter17 小时前
Flutter通过 Coap发送组播
flutter
嘟嘟叽2 天前
初学 flutter 环境变量配置
flutter
iFlyCai2 天前
深入理解Flutter生命周期函数之StatefulWidget(一)
flutter·生命周期·dart·statefulwidget
sunly_2 天前
Flutter:photo_view图片预览功能
android·javascript·flutter
Summer不秃2 天前
Flutter中sqflite的使用案例
flutter