1. 程式人生 > >Flutter iOS減包方案

Flutter iOS減包方案

作者:騰訊 - 小德(任曉帥 koudleren)

前言

Flutter幾乎從一開始就被人詬病SDK的包太大,真的是這樣子嗎?

1. Flutter 構建產物分析

分析Flutter的構建產物,發現一個完整的Flutter 模組包含三個部分,分別是:

  1. sdk大小:so庫(Android)/Framework(iOS)
  2. Dart程式碼的構建產物(Android和iOS)
  3. Channel 層的Android程式碼(iOS這部分在構建產物中)
  4. 資原始檔

1.1 so庫(Android)/FrameWork(iOS)

這部分是Flutter engine的so,包含各種平臺的so,在release和debug模式下包含的so不同,造成包大小不同,這塊對Flutter包大小影響很大。

Android包含的如下:

1. 在debug模式下,so庫打入了x86_64、x86、arm64-v8a,總共22.28M
2. 在release模式下,so庫只有armeabi-v7a,總共3.46M
複製程式碼

iOS包含的如下:

1. 在debug模式下,Flutter的Framework包含x86_64、armv7、arm64,總共31M
2. 在release模式下,Flutter的Framework包含armv7、arm64,,總共13.8M
複製程式碼

1.2 Dart程式碼的構建產物(Android和iOS)

在debug模式下,Android和iOS在Dart的JIT模式下生產中間產物,因為不是生產環境,我們就不分析了,主要看release模式下的區別。

在release模式下,Android生成的是Arm code,iOS生成的是Framework,這個Framework包含armv7和arm64

Dart程式碼的構建產物,依賴於業務的規模,業務越大,資原始檔越多,這塊所佔的空間也會越大。

1.3 Channel 層的Android程式碼

第三個就是用來橋接Flutter和Native的Channel層程式碼,這部分程式碼所佔的空間很小,幾乎可以忽略不計;

1.4 資原始檔

第四個是資原始檔,包括圖片等資源,這塊大小主要取決於業務,如果業務的資源很多,這塊也很難減下去,木有辦法的;

Flutter 真的很大嗎?

經過以上分析, Android release模式下,sdk大小為3.46M

iOS release模式下,sdk大小為13.8M

  • 所以並沒有想象中的那麼大

Flutter iOS減包方案

而且iOS Flutter的sdk還可以進一步精簡,因為Flutter的Framework都包含armv7和arm64,我們可以只用arm64,這樣的話,sdk大小就只有8M