likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 9

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

一、有效优化1

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

signingConfigs {
        release {
        	......
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            shrinkResources true
            minifyEnabled true
            proguardFiles "proguard-rules.pro"
        }
        debug{
            ......
        }
    }

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

#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包:

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

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

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

    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文件:

ext {
    flutterFFmpegPackage  =  "min-lts"
}

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

'-f image2 -framerate 20 -i $oldPath -c:v libx264 -pix_fmt yuv420p -aspect $bili $tmpVideoPath'

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

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

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

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

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

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

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

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

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,包大小突增的问题

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

android {
    packaging {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

其他版本增加 packagingOptions:

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

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

转载自:https://juejin.cn/post/7354922285092831284
评论
请登录