通過評論區大神的留言,我發現我之前打包的想法是有很大的問題。 我之前是覺得一個apk可以是包含幾種主流CPU架構的動態庫。其實最好的做法是:針對不同架構打對應的apk,apk中也只包含一個架構型別的so。然後將這些apk都上傳到應用商城,應用商城根據使用者手機下發對應架構的apk。
以下內容主要是針對安卓App。想了解的Ios相關內容的出門左轉找找....。 本篇文章實現瘦身主要方法就是:移除apk中不需要的CPU架構目錄下的libflutter.so和libapp.so,使用分架構打包。已經掌握這個方法的也可以出門左轉了...。
Flutter打包
flutter build apk 這應該是我們最簡單的Android打包命令
通過這個命令我們會打出一個入口為main.dart的release包。下面是我的一個簡單專案打成release包後反編譯看到的情況。
我們看到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的不同環境。
優化方案
配置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資料夾被移除。
注意:這裡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又有很大區別。這裡記錄的是我踩到坑,也是最簡單效果最直接的一個方法。