Android编译大小优化 APK编译大小优化,这个题目可能有点大,这是我在开发Android应用中遇到的困惑,也因此在网络上进行了各种搜索,却没能找到合适的答案。经过与各种Example Project的比较,摸索得到了一条优化体验,如下:
首先看臃肿APK与优化APK文件的内容比较:
从图中看到,左侧为优化文件,右侧为臃肿文件,2个文件的关键差异为classes.dex大小差异,再通过apktools解开将classes.dex反转为jar文件,打开看差异,如图:
再来看android包内容:
从上图可以看出,差异来自臃肿文件多了一个android.suport.v4包,为什么会编译生成这个包?为什么会有如此差异?原因在.classpath文件。
在Eclipse的工程中通常会自动生成一个.classpath文件,大致内容如下:
臃肿Android工程的.classpath:
[php]<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>[/php]
大小优化的Android工程的.classpath:
[php]<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>[/php]
通过比对得知,其差异仅在第6行的exported="true" ,这就是在生成APK的classes.dex文件中的android.support.v4文件。这个设置,其实来自Project的"Build Path",如图:
从以上种种,得出结论,要将编译结果最小化,只需在Build Path中不要勾选不需要导出的包即可,一般只需要勾选Android Dependencies即可。