现在apk越来越大,原因有如下几个: 1.多dpi支持([l|m|tv|h|x|xx|xxx]dpi) 2.Android开发工具和生态系统的发展 3.为了提高用户体验的高分辨率ui设计 4.无用代码,重复类库的编译 随着项目的开发,项目体积不断增长,应用体积也变大了许多,会让很多用户会放弃安装,为了给apk瘦身,翻阅了大片文章,总结一下自己在开发中的经验

我们从一下几个方面去解决:

开发阶段代码优化: 优化查错瘦身神器之android lint 运行Proguard: proguard能够便利你所有的代码路径,把没有用到的代码重apk中剔除。并且能够重命名变量,尽量精简你的代码; 使用Lint: 上面的proguard只是分析Java代码。lint工具能够分析你资源文件(/res),使用./gradlew lint就能够检测出没有用的资源文件;

什么是ProGuard工具?

ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。具体来说,使用ProGuard工具,可以达到下面两个目的: 删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。 使用语义混淆的命名替换了代码中的类、字段和函数等,使得其他人无法反编译获取源代码,起到对代码的保护作用。

add Library和add jars的区别? 在android项目中调用一些方法需要第三方的jar包,我们习惯做法是在android项目文件夹根目录下加一个lib文件并添加诸如.jar的文件,然后在右击该android项目,点属性(Properties),配置android,Java Build Path等。对于添加的jar文件,我们都是点 add External jars 或者 add jars,目前我还没发现两者的区别。 但是如果这样添加,会导致apk包增大至少2M以上,我用的办法是 添加add Library,选择User Library,如果有现成调用过的jar直接选择添加,如果没有则新建后添加,这样生成的apk比原来会减小很多。一般只有几百k左右。 使用webP图片格式: 只用一种图片xhdpi 只用一张xhdpi图片放到xhdpi目录时,所有的屏幕密度都能很好的适配, android系统会自动的对你的图片进行缩放, 不用为每个密度都切一版图片的, 经过实际验证我也发现确实是这样的, 于是我将hdpi下的所有和xhdpi目录有重复的图片全部删除掉。 这样下来应用就减少了将近2M ! so库压缩 项目中使用了室内定位功能,,编译成so直接打包在apk里以jni方式调用。 我相信有不少应用对于注重性能或者功能复用的模块都使用了jni方式,带来的问题就是so经常成为apk体积膨胀的一大因素, 以这个室内定位库为例, so文件就有整整8MB。 为了适配armeabi和armeabi-v7a两种机型,这个库必须在libs/armeabi目录和libs/armeabi-v7a两个文件夹下各放一份。否则有可能在某种CPU类型的机器上运行出现初始化连接异常(因为找不到so库引起的)。 将so库使用zip压缩,可以压缩到50%~60%,然后 后只放一份到res/raw目录, 在代码里实现: 如果程序是第一次运行,则获取到raw下这个zip文件的输入流,然后将其解压到/data/data/com.xxx.xxx/lib_xxx目录, lib_xxx为你自己建的目录, 然后使用System.load加载库,而不要使用System.loadLibrary., 这样指定路径加载肯定不会出现找不到so的问题。

项目构建优化: 参考我的Android studio gradle 配置文章中,构建项目的时候,只编译所用代码,自动移除无用资源.

资源文件瘦身: 图片资源的优化原则是:在不降低图片效果、保证APK显示效果的前提下缩小图片文件的大小。 使用tinypng优化大部分图片资源:https://tinypng.com/

未完待续……