Flutter apk最简单的瘦身方式
通过评论区大神的留言,我发现我之前打包的想法是有很大的问题。 我之前是觉得一个apk可以是包含几种主流CPU架构的动态库。其实最好的做法是:针对不同架构打对应的apk,apk中也只包含一个架构类型的so。然后将这些apk都上传到应用商城,应用商城根据用户手机下发对应架构的apk。
以下内容主要是针对安卓App。想了解的Ios相关内容的出门左转找找....。 本篇文章实现瘦身主要方法就是:移除apk中不需要的CPU架构目录下的libflutter.so和libapp.so,使用分架构打包。已经掌握这个方法的也可以出门左转了...。
Flutter打包
flutter build apk 这应该是我们最简单的Android打包命令
通过这个命令我们会打出一个入口为main.dart的release包。下面是我的一个简单项目打成release包后反编译看到的情况。
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/aacb999af5b94ea7bd29ad50979f0633.webp)
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/bee35eca891643dc806bc85038b2998c.webp)
x86_64一般是模拟器和平板使用, arm64-v8a就是arm 64位,现在新手机应该都是了,不过Android好像L之后才支持64位吧,具体可以自行查询资料(我就不误导了)。 至于armeabi虽然不是现在主流CPU架构,但是高版本的都会对其进行兼容,所以导致主流的App如果只想发一个版本的上线,用它就行。 所以我们发应用市场时完全可以把x86_64和arm64-v8a目录下的so文件给去掉(Google Play 好像要求得有arm64-v8a)。
但是我们在开发时又要让他能在模拟器上跑起来,所以我们可以配置个release和debug的不同环境。
优化方案
配置android的build.gradle
这个方法虽然能达到效果但是不推荐,除非你确实想一个apk中包含几种架构的so。
(文件的位置: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_64和arm64-v8a文件夹被移除。
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/b2a236302810475c9173f1a3d15f413f.webp)
注意:这里armeabi-v7a不能写成 armeabi。 我在第一次的时候就是配置的armeabi,结果打出来的包只有3MB,反编译发现里面压根就一个so都没打出来。让我一度以为这个方法是不行的呢。
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/1ae423f3d42f4494a2f8bdd25eab8314.webp)
shell命令
这个方法我是怎么知道的呢?其实flutter一直在提醒你:
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/6724ec33003f455593a3a5dbb5d43133.webp)
您正在构建一个胖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
我执行上面的命令后打的包:
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/24a4cf3ae75b44c097c3ab134f9d846f.webp)
--target-platform
指定的的架构平台分别生成相应的apk,而每个apk都是大约10MB上下。我们可以把这些都上传到应用市场,然后应用市场会根据下载apk的手机架构下发合适的apk。(Google Play是这样,国内的嘛...)。
我们也可以指定只打aemeabi-v7a的:
flutter build apk --release --target-platform android-arm
这个打出来就跟我在build.gradle中配置一样效果了。
![Flutter apk最简单的瘦身方式](https://img.blogweb.cn/article/77dca5e79ba54207bcf61f60ce87bc83.webp)
混合项目
同理在混合开发项目中,需要将flutter作为插件打包成aar时,也可以通过这种方法减少aar体积。
flutter build aar --release --target-platform android-arm
总结:flutter的瘦身之路很长,而安卓和ios又有很大区别。这里记录的是我踩到坑,也是最简单效果最直接的一个方法。
转载自:https://juejin.cn/post/6844904186446872584