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

相关推荐
江上清风山间明月11 小时前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
Zsnoin能1 天前
flutter国际化、主题配置、视频播放器UI、扫码功能、水波纹问题
flutter
早起的年轻人1 天前
Flutter CupertinoNavigationBar iOS 风格导航栏的组件
flutter·ios
HappyAcmen1 天前
关于Flutter前端面试题及其答案解析
前端·flutter
coooliang1 天前
Flutter 中的单例模式
javascript·flutter·单例模式
coooliang1 天前
Flutter项目中设置安卓启动页
android·flutter
JIngles1231 天前
flutter将utf-8编码的字节序列转换为中英文字符串
java·javascript·flutter
B.-1 天前
在 Flutter 中实现文件读写
开发语言·学习·flutter·android studio·xcode
freflying11192 天前
使用jenkins构建Android+Flutter项目依赖自动升级带来兼容性问题及Jenkins构建速度慢问题解决
android·flutter·jenkins
机器瓦力2 天前
Flutter应用开发:对象存储管理图片
flutter