經過評論區大神的留言,我發現我以前打包的想法是有很大的問題。 我以前是以爲一個apk能夠是包含幾種主流CPU架構的動態庫。其實最好的作法是:針對不一樣架構打對應的apk,apk中也只包含一個架構類型的so。而後將這些apk都上傳到應用商城,應用商城根據用戶手機下發對應架構的apk。 java
如下內容主要是針對安卓App。想了解的Ios相關內容的出門左轉找找....。 本篇文章實現瘦身主要方法就是:移除apk中不須要的CPU架構目錄下的libflutter.so和libapp.so,使用分架構打包。已經掌握這個方法的也能夠出門左轉了...。android
flutter build apk 這應該是咱們最簡單的Android打包命令ios
經過這個命令咱們會打出一個入口爲main.dart的release包。下面是個人一個簡單項目打成release包後反編譯看到的狀況。shell
咱們看到apk的大小是24.4MB,裏面的內存大戶就是libflutter.so和libapp.so。並且他們竟然有三組。 其實就是編譯的時候針對於 x86_64、 arm64-v8a、 armeabi-v7a三種CPU架構打出了對應的二進制庫。 下面是從網上搜到的x86_64通常是模擬器和平板使用, arm64-v8a就是arm 64位,如今新手機應該都是了,不過Android好像L以後才支持64位吧,具體能夠自行查詢資料(我就不誤導了)。 至於armeabi雖然不是如今主流CPU架構,可是高版本的都會對其進行兼容,因此致使主流的App若是隻想發一個版本的上線,用它就行。 因此咱們發應用市場時徹底能夠把x86_64和arm64-v8a目錄下的so文件給去掉(Google Play 好像要求得有arm64-v8a)。微信
可是咱們在開發時又要讓他能在模擬器上跑起來,因此咱們能夠配置個release和debug的不一樣環境。架構
這個方法雖然能達到效果可是不推薦,除非你確實想一個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_64和arm64-v8a文件夾被移除。 gradle
注意:這裏armeabi-v7a不能寫成 armeabi。 我在第一次的時候就是配置的armeabi,結果打出來的包只有3MB,反編譯發現裏面壓根就一個so都沒打出來。讓我一度覺得這個方法是不行的呢。優化
這個方法我是怎麼知道的呢?其實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又有很大區別。這裏記錄的是我踩到坑,也是最簡單效果最直接的一個方法。