打包与APK瘦身
打包与APK瘦身
打包方式
- 使用Android Studio提供的可视化工具来生成带有正式签名的APK文件。
- 使用Gradle生成。
- 命令行打包gradlew assembleDebug, gradlew assembleRelease
- 生成多渠道APK文件。
打包流程
-
通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)。
-
处理.aidl文件,生成对应的Java接口文件。
-
通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件。
-
通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
-
通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
-
通过Jarsigner工具,对上面的apk进行debug或release签名。
-
通过zipalign工具,将签名后的apk进行对齐处理。
以上步骤均为必须,否则不能在设备上安装。
参考:
APK瘦身
- 剔除掉冗余的代码与不必要的 jar 包:具体来讲的话,我们可以使用 SDK 集成 的 ProGuard 混淆工具,它可以在编译时检查并删除未使用的类、字段、方法和属性,会遍历所有代码找到无用处的代码,所有那些不可达的代码都会在生成最终 apk 文件之前被剔除掉,同时他还会重命名类、属性、接口;在使用 ProGuard 的时候需要注意,它默认情况下是会对第三方库进行混淆的,而第三方库有的已经进行过混淆,有的使用了 Java 反射技术,所以我们在进行代码混淆的时候要排除这些第三方库,具体来讲的话就是在混淆规则文件中添加一些规则;也可以使用 AndResGuard 来剔除那些冗余代码,他可以做到直接处理安装包而不依赖于源码,也不依赖编译过程,也就是说仅仅输入一个安装包,就得到一个混淆包。
- 剔除无用的资源:使用 ProGuard 的话,仅仅是对代码进行了分析,但是对于图片资源的话,就束手无策了,这个时候可以使用 Lint 工具,它是一个静态代码分析器,你只需要通过调用./gradlew lint 命令就可以查找到所有无用的资源文件,在检查结束之后会提供一份详细的资源文件清单,只要我们不通过反射来访问这些无用的资源,就可以放心的删除 这些资源了;有一点需要注意,Lint 会分析 res 下面的资源文件,但是会跳过 assets下面的资源文件,Lint 不能判断某个 asset 文件在项目中是否可用,因此这个文件夹下面的内容就需要我们自己去维护了。
- 对资源文件进行取舍:对 Android 所有屏幕密度下的文件夹全部都提供一套图 片资源的做法是非常不理智的,虽然 Android 支持多种屏幕密度,但是这并不代表我们需要为每一种屏幕密度都提供一整套资源,我们应该尽量使用一套图片资源,对于一些图片在不同分辨率手机上出现差异较大的情况再去考虑在相应文件夹下放入特定的图片;尽量重用图片,比如对称图片的话,只需要提供一张,另外一张可以通过代码旋转的方式实现;去除那些无用的类库,比如我们在使用第三方库的时候,可能只用到库中的一部分功能,对于那些没用到的功能部分,能不引入就不引入。
- 对图片资源进行优化:在不降低图片的显示效果、保证 APK 显示效果的前提下压缩图片文件的大小,我们可以使用 tinypng 工具来实现,他的原理是通过合并图片中相似的颜色,将 24 位的 png 图片压缩成小得多的 8 位色值的图片,并且去掉了图片中不必要的 metadata 元数据,这种方式几乎能完美支持原图片的透明度;此外我们可以使用 webp格式的图片,这是 google 推出来的意图改变 web 图片 jpg、png、gif 三分天下局势的一种图片格式,在同画质的情况下,他所占用的空间是最少的,并且支持无损和有损压缩、alpha通道。
可参考:
一些文章
菜甜二的学习笔记and总结啊。。。总会遇到挫折,可是还是要保持开阔的心态才能开心的学习啊,坚持吧。