Xamarin開發的時候大家都有一個疑問,就是apk文件會不會特別的大,啟動會不會很慢。答案是肯定的,文件肯定大,啟動肯定會慢,但是具體大多少、具體慢多少,有什么因素可以使apk文件稍微小一點、可以使啟動時間稍微短一點呢?
How to make a Xamarin.Forms app have smaller apk size and start up faster?
在Xamarin的編譯選項中有幾個比較關鍵,分別是:BundleAssemblies AotAssemblies EnableLLMV和 AndroidLinkMode
這三個選項的編輯頁面只有在enterprise版本里有,但是如果你是community版本,依然可以通過修改csproj文件直接修改這些編譯選項。
通過創建一個默認的Xamarin.Forms工程,修改各種編譯選項,然后看它的編譯的apk大小和啟動時間,得出下表。這里啟動時間是指從點擊啟動app到肉眼判斷第一個頁面完全顯示。
|
Bundle |
AoT |
LLVM |
Link none |
Link sdk |
Link all |
Api size (M) |
Startup time (s) |
|
1 |
|
|
|
|
Y |
|
21 |
4.5 |
|
2 |
|
|
|
|
|
Y |
15 |
4.24 |
|
3 |
|
y |
y |
|
|
y |
24 |
4.2 |
|
4 |
y |
y |
y |
|
|
y |
17 |
4.6 |
Link all 大小減少6M (2) |
5 |
y |
y |
y |
|
y |
|
22m |
4.7s |
Link sdk 大小減少10m (1) |
6 |
y |
y |
y |
y |
|
|
32 |
5.5s |
|
7 |
Y |
Y |
|
|
|
y |
20 |
2.7 |
|
8 |
y |
y |
|
|
y |
|
25.7 |
2.7 |
llvm加大啟動時間2s (3) |
9 |
|
Y |
|
|
|
Y |
27 |
2.5 |
AoT使apk大8M (4) 啟動時間減少2s |
(1)比較6和5:link sdk可以使得apk大小減小10M。
(2)比較5和4:link all可以使得apk大小再減小6M。
(3)比較8和5:llvm會使apk大小減小3M,但啟動時間增加了2s。
(4)比較9和2:AoT會使apk大小變大8M
綜合結論:
AndroidLinkMode對apk大小有很大影響,link all時apk文件最小。對啟動時間基本無影響。
EnableLLMV會使apk大小減小,但啟動時間變長。
AotAssemblies 使apk大小變大。
AotAssemblies 使啟動時間變短。(這個是間接得出的結論,因為啟動時間變化的因素中:link mode無影響,LLVM使時間變長,Bundle基本無影響,那么使啟動時間變短的只能是AotAssemblies )
BundleAssemblies 對文件大小、啟動時間的影響較小。
結論:
apk大小和啟動時間是互斥的。建議的選項配置:使用BundleAssemblies、AotAssemblies AndroidLinkMode(sdk & user,也就是all),不使用EnableLLMV。
同時可以得到,Xamarin.Froms程序,apk大小大約20M,啟動時間2秒。
題外話:
這其實是Xamarin將c#編譯為native code的一個應用,也可以把這個特性(BundleAssemblies, AotAssemblies)當做一個混淆代碼的更佳方案。