Flutter apk最简单的瘦身方式

经过评论区大神的留言,我发现我以前打包的想法是有很大的问题。 我以前是以为一个apk能够是包含几种主流CPU架构的动态库。其实最好的作法是:针对不一样架构打对应的apk,apk中也只包含一个架构类型的so。而后将这些apk都上传到应用商城,应用商城根据用户手机下发对应架构的apk。 java

如下内容主要是针对安卓App。想了解的Ios相关内容的出门左转找找....。 本篇文章实现瘦身主要方法就是:移除apk中不须要的CPU架构目录下的libflutter.so和libapp.so,使用分架构打包。已经掌握这个方法的也能够出门左转了...。android

Flutter打包

flutter build apk 这应该是咱们最简单的Android打包命令ios

经过这个命令咱们会打出一个入口为main.dart的release包。下面是个人一个简单项目打成release包后反编译看到的状况。shell

咱们看到apk的大小是24.4MB,里面的内存大户就是libflutter.so和libapp.so。并且他们竟然有三组。 其实就是编译的时候针对于 x86_64arm64-v8aarmeabi-v7a三种CPU架构打出了对应的二进制库。 下面是从网上搜到的

x86_64通常是模拟器和平板使用, arm64-v8a就是arm 64位,如今新手机应该都是了,不过Android好像L以后才支持64位吧,具体能够自行查询资料(我就不误导了)。 至于armeabi虽然不是如今主流CPU架构,可是高版本的都会对其进行兼容,因此致使主流的App若是只想发一个版本的上线,用它就行。 因此咱们发应用市场时彻底能够把x86_64arm64-v8a目录下的so文件给去掉(Google Play 好像要求得有arm64-v8a)。微信

可是咱们在开发时又要让他能在模拟器上跑起来,因此咱们能够配置个release和debug的不一样环境。架构

优化方案

配置android的build.gradle

这个方法虽然能达到效果可是不推荐,除非你确实想一个apk中包含几种架构的so。app

(文件的位置:flutter项目->andriod->app->build.gradle)工具

buildTypes {
        release {
           ...
            ndk{
                //以前看QQ微信等大佬都只用"armeabi"
                abiFilters "armeabi-v7a"
            }
        }
        debug {
	        ...
            ndk {
                //这里配置开发调试时的,根据我的须要增减小,x86建议加上否则部分模拟器回报错
                abiFilters  "armeabi-v7a","arm64-v8a", "x86"
            }
        }
    }

复制代码

修改完上面内容后,在执行flutter build apk 命令,咱们能够看到整个项目从24MB左右变成了10MB,lib目录下x86_64arm64-v8a文件夹被移除。 gradle

注意:这里armeabi-v7a不能写成 armeabi。 我在第一次的时候就是配置的armeabi,结果打出来的包只有3MB,反编译发现里面压根就一个so都没打出来。让我一度觉得这个方法是不行的呢。优化

shell命令

这个方法我是怎么知道的呢?其实flutter一直在提醒你:

上面这个截图,使用过flutter build命令的你们确定都熟悉,只是大多人都没注意(反正不影响我打包)。 *You are building a fat APK that includes binaries for android-arm, android-arm64, android-x64.*不会使用翻译工具的小伙伴我帮你翻译好了:

您正在构建一个胖APK,其中包含适用于android-arm,android-arm64和android-x64的二进制文件。 若是您要将应用程序部署到Play商店,建议使用应用程序捆绑包或拆分APK以减少APK的大小。

下面就介绍了根据ABI拆分的方法(无论app bundle,只看apk):

flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
复制代码

我执行上面的命令后打的包:

咱们看到根据 --target-platform指定的的架构平台分别生成相应的apk,而每一个apk都是大约10MB上下。咱们能够把这些都上传到应用市场,而后应用市场会根据下载apk的手机架构下发合适的apk。(Google Play是这样,国内的嘛...)。

咱们也能够指定只打aemeabi-v7a的:

flutter build apk --release  --target-platform android-arm
复制代码

这个打出来就跟我在build.gradle中配置同样效果了。

混合项目

同理在混合开发项目中,须要将flutter做为插件打包成aar时,也能够经过这种方法减小aar体积。

flutter build aar --release  --target-platform android-arm
复制代码

总结:flutter的瘦身之路很长,而安卓和ios又有很大区别。这里记录的是我踩到坑,也是最简单效果最直接的一个方法。

相关文章
相关标签/搜索