Xamarin App文件(apk)大小和启动时间的影响因素

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)当做一个混淆代码的更佳方案。

posted @ 2017-06-10 16:23  upcode-site  阅读(2404)  评论(0编辑  收藏  举报