0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android apk三大瘦身步骤

张康康 来源:xx 2019-06-07 17:35 次阅读

为什么apk越来越大?

1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。

2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。

3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码。

4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片。

apk瘦身的切入点

解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:

1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小。

2.资源文件,对应res文件夹,assets目录。

3.减小lib中引入的so大小。

开始瘦身

接下来我们将分别针对上边的三个切入点进行apk瘦身。

一.减小Java代码的体积

有人认为这个方面的处理很鸡肋,因为每一行代码都对应相应的功能,这里能有多大的精简空间,其实并非完全如此,随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。接下来进入正题。

开启minifyEnable

它的作用不仅仅是混淆代码,还有压缩优化的功能,他会遍历所有代码并找出没有引用到的代码,这些代码不会生成在apk中;另外混淆的效果是使用简短的字母替代原来的类名属性名等,一定程度上也可以减小代码体积。

定期review重构代码

对代码的不断优化是提升个人能力的有效手段,同时优化的结果也会间接的对apk进行精简。

慎重选择你使用的开源库

很多开源库针对不同平台提供了精简版,目的就是移除在本平台上不需要的代码,例如fastJson,我们选择精简版就可以使开源代码缩小一倍左右,另外针对没有精简版的开源库,需要根据场景考虑是否使用源码依赖,手动移除不必要的文件资源。

二.资源文件瘦身

优先采用WebP图片

资源文件是apk中体积占用较大的一部分,尤其是图片资源,所以我们首要以图片的瘦身为主。首先要对图片编码格式有简单了解。Android平台支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0开始支持WebP),但是Android应用开发中,Bitmap所支持的只有三种JPEG,PNG,WebP,从Bitmap类的CompressFormat枚举可以看出(详见源码)。

JPEG:有损压缩,不支持透明通道和多帧动画(RGB)

PNG:无损压缩,支持透明通道(ARGB),PNG大小大于JPEG

WebP:支持有损和无损压缩,支持透明通道和多帧动画,4.0以上是开发首选,Google官方测试,WebP比PNG能减少45%大小,即便PNG经过压缩,也能相比PNG减小28%

PNG格式图片尽量使用NinePatch格式

9图具有体积小,拉伸不变形的特点,并且Android studio可以一键转换,使用起来相当方便。

Lint查找无效资源

Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。

开启shrinkResources功能

shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删

```

android {

buildTypes {

release {

minifyEnable true

shrinkResources true

}

}

}

```

resConfigs剔除第三方库或者SDK中的资源

第三方库中包含的无效资源通常包含以下两点:

dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。

很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源。

```

defaultConfig {

。。。

resConfigs "zh" //表示只使用中文

resConfigs "xxhdpi" // 表示只是用xxhdpi目录下的资源文件

}

```

三.libs目录瘦身

so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so

```

defaultConfig {

ndk {

abiFilters "armeabi-v7a","x86"

}

}

```

四.其他的一些优化

1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片。

2.使用shape(Vector)替换图片。

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

4.删除第三方aar库中使用的大图。

5.把so文件放置在网上或者sd卡内。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127367
  • apk
    apk
    +关注

    关注

    0

    文章

    23

    浏览量

    4932
收藏 人收藏

    评论

    相关推荐

    Android Gerber 查看软件.apk

    ` 本帖最后由 yuanqing17 于 2013-5-6 11:25 编辑 Android Gerber 查看软件.apk大家觉得好,就评分.......`
    发表于 05-03 11:11

    Android 串口访问的问题,包括eclipse编译、打包成apk,对apk重新签名以获取system权限、关闭selinux等

    Android 串口访问的问题下载源代码:https://github.com/friendlyarm/android_SerialPortDemo.git以前下载过的,用git pull命令更新
    发表于 09-02 14:45

    Snapdragon NPE SDK配置模型文件的转换和apk用例

    ./setup_models.sh #对Alexnet 例子(DLC、labels、imputs)进行打包来作为android源文件。2.用Android studio创建apk(1)打开
    发表于 09-28 11:49

    CYW20706 Mesh APP“MeshLighting.apk”在Android 7.0中强制终止

    平台:Android 7演示:所有网格问题工具:Wice 6;Mesh Health.APK;在Android 7测试示例中,我遇到了力关闭问题;我不知道其他Android版本是否有这
    发表于 11-09 15:05

    请问有蓝牙模块APKAndroid源码项目文件吗?

    原子哥有没有蓝牙模块APKAndroid源码项目文件啊?最近做毕设写Android代码碰到大问题了,希望能参考解决下
    发表于 04-18 06:36

    Vivado工程源码大瘦身

    `特权同学原创,转载请保留署名Vivado的工程文件包含了源码、IP、设置和各种编译的中间文件,动辄上百MB甚至上GB,非常占硬盘。可以通过以下步骤对编译过的工程进行瘦身,只预留必要的设置、IP
    发表于 08-17 08:41

    APK文件直接传到Android模拟器

    Graphic and Macintosh应用程序的声音格式ANI:Windows系统中的动画光标APKAndroidPackage /Android(安卓)安装包,APK是类似S
    发表于 08-20 06:18

    RK3326 android10.0(Q)系统精简瘦身该怎样去实现呢

    RK3326 android10.0(Q)系统精简瘦身该怎样去实现呢?
    发表于 02-17 07:48

    怎样在Android源码编译时的Makefile里添加自己的APK名字呢

    怎样在Android源码编译时的Makefile里添加自己的APK名字呢?有哪些基本步骤
    发表于 02-17 06:16

    Android APK下载地址分享

    Android APK 下载地址
    发表于 09-14 08:25

    永华APK20-4N APK25-5N APK30-6N A

    永华APK20-4N APK25-5N APK30-6N APK35-7N开敝式换气扇电路图
    发表于 02-27 21:23 1157次阅读
    永华<b class='flag-5'>APK</b>20-4N <b class='flag-5'>APK</b>25-5N <b class='flag-5'>APK</b>30-6N A

    MiCo Android V2.04 APK开发环境免费下载

    本文档的主要内容详细介绍的是MiCo Android V2.04 APK开发环境免费下载。
    发表于 12-06 14:57 15次下载

    你知道Android Apk的反编译和加密原理?

    Android的应用程序APK文件说到底也是一个压缩文件,那么可以通过解压缩得打里面的文件内容,不过很显然,当你去解压完去查看的时候,发现里面的很多东西和你想象中的不太一样。
    发表于 04-24 13:50 2462次阅读
    你知道<b class='flag-5'>Android</b> <b class='flag-5'>Apk</b>的反编译和加密原理?

    Java代码加密支持Android App Bundle动态化框架

    。 App 瘦身新姿势:Android App Bundle Android App Bundle是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积,
    的头像 发表于 07-29 16:13 2306次阅读
    Java代码加密支持<b class='flag-5'>Android</b> App Bundle动态化框架

    应用程式:AS3460_App_EnvironmentalNoise_pAndroid_v1-1-0.apk

    AS3460_App_EnvironmentalNoise_pAndroid_v1-1-0.apk
    发表于 01-21 10:18 28次下载
    应用程式:AS3460_App_EnvironmentalNoise_p<b class='flag-5'>Android_v1-1-0.apk</b>