对于一个在Android studio上 1.5MB的apk,在使用Xamarin.Android编写以后,release包陡然变成了11.5MB ,差点被领导打死。
于是赶紧研究Xamarin.Android Apk瘦身。
中间经历了很多失败,所以我只说我试验正确的方法。
首先,请确定你使用的是VS2015 企业版,因为有些功能非企业版不能用(听说的)。其次,所有操作,请参考 xamarin-release-guide
下面是步骤:
1.确保你选择了release,而不是继续在debug模式上做这一项操作;
2.对project名点击右键-->属性 --> Android menifest,如果你的 Application Icon 还是空白的,请点击下拉框,为你的App添加一个图标 如
这样可以让你的App通过某些应用市场的审核。
3.对project名点击右键-->属性 --> Android Options,配置如图(只需要关注打勾的就行了,不要问我为什么,自己去看上面的超链接)
然后是这两个打勾选项的说明
1.Bundle assemblies into native code
就是这一个,听说要企业版才能使用。顾名思义, 是把一堆assemblies打包成java的native code,其实就是打包成.so。然后到底是把什么给打包了呢?将自己的APK改后缀为 .apk -->.zip,然后去找到assmblibs,会发现,在勾选这个选项前打包,里面是所有你引用过的包的.dll文件,并且还包括了你的工程代码所编译成的.dll文件,听说.dll文件很容易被反编译,多么不安全!现在变成了.so文件,这是一种不是那么容易被反编译的文件,即使反编译出来,也是汇编语言,听起来就好多了。
最重要的是,这一个操作,将我11.5MB的apk,变成了5.54MB!!效果显著!
2.Enable Proguard
允许混淆。貌似在Android studio 里面,编写混淆很容易的样子,但是在Xamarin里使用,耗费了我许多的时间,才最终有一个办法(注:此办法不一定具有普遍性)
大家知道,Microsoft 的vs2015 所有东西几乎都是默认装在C盘的,所以你会发现C盘再大也不够用。我在Xamarin使用的默认的Android SDK是在C盘下的,我在Android studio 的Android SDK 是在D盘下的。
在Xamarin 论坛 找了好久,没有遇到适用我的,能够使用proguard的。总是会报一个错误
并且一直没有解决思路。然后我想到,试试使用其他路径的sdk看看,会有什么错。于是 SDK路径: C:\xxx\android-sdk --> D:\xxx\android-sdk,再次清理,生成,没有这个错了!!虽然报了其他错:‘java.exe’ exist with code 1。 这个错误应该是由于SDK 24引起的,在去把SDK manager中有关API24的都删除后,编译通过!!
立即去检查apk 大小,发现已经从5.54MB --> 5.47MB,也算是个进步,嘿嘿。
上面这种混淆方式,是使用Xamarin自带的混淆文件 xxx/obj/Release/proguard/proguard_xamarin.cfg ,这个文件是不可编辑的,因为你每次编译的时候,都会重新生成。
还有一种混淆的方式,是Xamarin推荐的自定义proguard.cfg文件的方式,不过这种方式我测试了好久,没有做出来,希望研究出来的朋友回复下。不过我可以确定,如果能够使用自定义的混淆,肯定可以更大程度的减小apk的体积!
3.大家有注意到,packaging旁边有一个linker
实际上,按照Xamarin官网的说法,这一步操作类似于混淆,但是在混淆之前先编译(如果启用了混淆)。下面的表格是官网的表格,充分说明了linker的重要性。
Configuration | Xamarin.Android 4.2.5 Size |
None | 17.4 MB |
SDK Assemblies Only | 3.0 MB |
我的默认是 SDK Assemblies Only,所以没有做其他测试。
话不多说,就到这里了。
将原来的APK 大小从 11.5MB --> 5.47MB,优化空间还有,需要继续研究学习。