Android apk瘦身讲解

apk瘦身

想办法较减少apk大小

必要性

同样功能,apk越小越好,用户下载动机更大

了解apk的组成

  • classes.dex:是java源码编译后生成的java字节码文件
  • resources.arsc:编译后的布局文件
  • AndroidManifest.xml
  • assets:目录可以存放一些配置文件
  • lib目录下的子目录armeabi存放的是一些so文件或者jar包
  • META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
  • res:apk图片资源

了解apk生成过程

辅助分析工具

  • nimbledroid:能够得知app内存使用,网络使用,磁盘输入/输出,文件大小等一些NimbleDroid认为至关重要的数据;
    • 官网:https://nimbledroid.com/(无需翻墙,访问比较慢)
    • 注册
    • 登录
    • 上传apk
    • 效果图:”冒泡新闻_文件分析.png”

瘦身步骤

0.开始大小–>19039kb
1.开启minifyEnabled(开启混淆,删除没用的java文件),混淆笔记查看 Proguard使用注意_billy–>18447kb

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

2.开启shrinkResources(去除无用资源),同时去除工程中临时展示的图片–>17121kb

    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
    }

3.删除无用的语言资源–>减少100kb左右

defaultConfig {
    ...
    resConfigs "zh"
    ...
   }    

4.使用tinypng有损压缩

  • TinyPNG 使用一种智能有损压缩技术(通过降低图片中的颜色数量,来减少存储图片所需要的数据)来降低 PNG 图片的大小。这样的压缩对图片的效果影响是很小的,但是可以大大降低图片的大小,并且还能保持 PNG 的 alpha 透明度
  • 因为 TinyPNG 将 PNG 图片压缩成 8 位的 PNG(而不是24位),所以它的压缩比例非常高,至少都有 50% 以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼基本看不出区别。

5.对于非透明的大图,jpg将会比png的大小有显著的优势,在启动页,活动页等之类的大图展示区采用jpg将是非常明智的选择–>15615kb

6.使用webp格式–>15541

7.删除或者替换兼容包(v4 v7 v13)中无用的一些图

  • 删除drawable-ldrtl:是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android4.2上新出的功能

    drawable-ldrtl-xxxhdpi-v4
    drawable-ldrtl-xxhdpi-v4
    drawable-ldrtl-xhdpi-v4
    drawable-ldrtl-hdpi-v4
    drawable-ldrtl-mdpi-v4
    
  • 替换v4 v7 v13 中无用图片资源_可选方式

    • 可以使用1x1像素图片,替换v4,v7,v13中的一些图片资源
      博客:
      罗升阳(系统底层)
      张鸿阳(应用层)

8.注意删除第三方aar库中使用的大图_注意情况
9.so库的删除:建议实际工作的配置是只保留armeabi、x86下的so文件,算是一个折中的方案。

 armeabi :针对普通的或旧的arm v5 cpu
 armeabi-v7:库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。针对有浮点运算或高级扩展功能的arm v7 cpu.
 arm64-v8a:64位ARM设备
 mips
 mips64
 x86
 x86_64

10.通过v4包中的DrawableCompat,通过着色方案完成selector效果,参考

Drawable icon = getResources().getDrawable(drawableId)
Drawable tintIcon = DrawableCompat.wrap(icon);
//1.着色一个selector
DrawableCompat.setTintList(tintIcon, getResources().getColorStateList(R.color.xx));
//2.着色一个颜色
DrawableCompat.setTintList(tintIcon, ColorStateList.valueOf(Color.BLUE));
imageView.setImageDrawable(tintIcon);

11.使用shape文件替换图片

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners android:radius="10dp"></corners>
    <solid android:color="#e6d5d5"></solid>
</shape>

12.切图使用一套图即可,参考美团客户端,美团使用的一套drawable-xhdpi

13.把so文件放置到网上或者sdcard内,参考https://segmentfault.com/a/1190000004062899

14.配合vectorDrawable使用矢量图 (兼容性问题,5.0后才可使用)
15.使用微信资源混淆https://github.com/shwenzhang/AndResGuard

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值