1.打包之后的apk包含哪些文件
- classes.dex:是java源码编译后生成的java字节码文件
- resources.arsc:编译后的布局文件
- AndroidManifest.xml
- assets:目录可以存放一些配置文件
- lib目录下的子目录armeabi存放的是一些so文件或者jar包
- META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
- res:apk图片资源
2.apk打包的过程
流程:
① 清单文件(Manifest),资源文件(Resource),资产文件(Assets) 通过aapt工具生成打包之后的资源文件和索引文件(R),其中打包之后的资源文件就是解压一个APK看到的resources.arsc文件.
② 源代码和Lib文件由javac编译成.class文件,再由dx工具编译成.dex文件
③ 然后再由apkbuilder –u工具生成没有签名的apk文件
④ 最后又jarsigner加入签名
3.下面开始进入正题
方法一:开启minifyEnabled
这个操作在app的gradle里面配置
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
默认配置是false,改成true即可,就是为了开启proguard
proguard的作用除了混淆,还能删除无用的类和方法,已达到瘦身的目的
方法二:开启shrinkResources
release {
minifyEnabled false
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
该功能是去除项目中临时展示的图片,比如在布局文件中某个imageview设置的src
方法三:压缩图片
就是想办法使项目中使用图片变小些,可以参考一下几种方法:
(1)TinyPNG 使用一种智能有损压缩技术(通过降低图片中的颜色数量,来减少存储图片所需要的数据)来降低 PNG 图片的大小。这样的压缩对图片的效果影响是很小的,但是可以大大降低图片的大小,并且还能保持 PNG 的 透明度
因为 TinyPNG 将 PNG 图片压缩成 8 位的 PNG(而不是24位),所以它的压缩比例非常高,至少都有 50% 以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼基本看不出区别。
参考网站:http://tinypng.com/
(2)对于非透明的大图,使用jpg比png大小更有优势.
(3)使用webp格式的图片,从Android 4.0+开始原生支持,但是不支持包含透明度,直到Android 4.2.1+才支持显示含透明度的webp,使用的时候要特别注意
了解webp, 请点击:
http://isux.tencent.com/introduction-of-webp.html
方法四:尽量使用代码生成图片
比如可以用shape文件代替图片
方法五:apk包打好以后,可以删除res目录下drawable-ldrtl文件夹
drawable-ldrtl是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android4.2上新出的功能
附录:
辅助分析工具
- nimbledroid:能够得知app内存使用,网络使用,磁盘输入/输出,文件大小等一些NimbleDroid认为至关重要的数据;