apk瘦身的意义我就不多说了,首先让我们了解一个apk的组成部分,说简单点,一个apk文件就是包含一些文件的压缩包。作为开发者,我们通过使用unzip命令解压这个apk文件一探apk的内部结构。下面的文件结构就是我们使用unzip .apk1这个命令所获得的:
了解完apk的组成部分后,apk瘦身我们大致可以从这几方面下手: 1 减少java代码 2 减少资源文件 3 减少native_code
所以我们得养成良好的编程习惯,删除不必要的代码和重复无用的一些资源文件,比如图片,xml等。尽可能重用一些资源。但是如果我们是接手别人项目或者之前习惯不好,而导致太过臃肿等问题,这时候我们可以借助一些工具。
使用 Proguard
Proguard 是一个很强悍的工具,它可以帮你在代码编译时对代码进行混淆,优化和压缩。它有一个专门用来减少apk文件大小的功能叫做 tree-shaking。Proguard 会遍历你的所有代码然后找出无用处的代码。所有这些不可达(或者不需要)的代码都会在生成最终的apk文件之前被清除掉。Proguard 也会重命名你的类属性,类和接口,然整个代码尽可能地保持轻量级水平。
也许现在你会认为 Proguard 是一个相当有效地工具。但是能力越大,责任也就越大。现在许多开发这认为Proguard有点让人不省心,因为它会重度依赖反射。哪些类或者属性需要被处理或者不能处理都要开发者对 Proguard 进行配置。
使用 Lint
Proguard 只会对 Java 代码起作用,那么对哪些资源文件呢?比如一张图片my_image在res/drawable文件夹中,没有被使用,Proguard 只会移除掉R类中的引用,但是图片依然还在文件夹中。
Lint 一个静态的代码分析器,你只需通过调用./gradlew lint这个简单地命令它就能帮你检查所有无用的资源文件。它在检测完之后会提供一份详细的资源文件清单,并将无用的资源列在“UnusedResources: Unused resources” 区域之下。只要你不通过反射来反问这些无用资源,你就可以放心地移除这些文件了。
Lint 会分析资源文件(比如/res文件夹下面的文件) ,但是会跳过 assets 文件 (/assets文件夹下面的文件)。事实上assets 文件是可以通过它们的文件名直接访问的,而不需要通过Java引用或者XML引用。因此,Lint 也不能判定某个 asset 文件在项目中是否有用。这全取决于开发者对这个文件夹的维护了。如果你没有使用某个asset 文件,那么你就可以直接清除这个文件。
对资源文件进行取舍:
这里主要涉及到屏幕适配的图片问题,可以根据我们产品用户的层次来进行适配,现在市场上大多数手机都是1280 * 800 以上的,我们只需适配一两套图片即可,我通常用的都是xhdpi。