前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >APK 瘦身优化

APK 瘦身优化

作者头像
Yif
发布2020-04-23 17:42:09
1.3K0
发布2020-04-23 17:42:09
举报
文章被收录于专栏:Android 进阶Android 进阶

瘦身

  1. 主要是下载转换率提高
  2. 头部App都有Lite版本
  3. 渠道合作产商要求

APK 分析工具

ApkTool 反编译工具

官网:https://ibotpeaches.github.io/ApkTool apktool d students.apk

Analyze apk

Android studio 2.2之后使用 - 查看apk组成大小,各资源占比 - 查看dex文件组成 - 可以进行apk对比

通过Analyze app分析(打开方式:Android Studio下 ——> Build——> Analyze app

classyshark 二进制检查工具

https://github.com/google/android-classyshark 支持多种格式:apk,jar,class,so

nimbledroid app 性能指标系统

https://nimbledroid.com/ 可以通过上传apk得知: - 文件大小及排行 - Dex方法数、SDK方法数 - 启动时间、内存等

APK 组成

APK包结构如下:

  • lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a。
  • assets/:包含应用可以使用AssetManager对象检索的应用资源。
  • res/:包含未编译到的资源 resources.arsc,主要有图片资源文件。
  • META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
  • resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
  • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
  • AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

对lib文件目录进行瘦身

往往进行NDK开发的时候,so文件都比较大,将ndk修改为如下:

代码语言:javascript
复制
<br />ndk{
 
    //设置支持的so库架构
 
    abiFilters "armeabi-v7a"
 
   }
 
 

armeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).

而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a

如果适配版本高于4.1版本,可以直接上面这样写,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。

优化res,assets文件

手动lint检查,手动删除无用资源

Android Studio中打开“Analyze” 然后选择"Inspect Code...",范围选择整个项目,然后点击"OK"。

使用tinypng等图片压缩工具对图片进行压缩。

打开网址,将大图片导入到tinypng,替换之前的图片资源。

大部分图片使用Webp格式代替。

可以给UI提要求,让他们将图片资源设置为Webp格式,这样的话图片资源会小很多。当然,如果对图片颜色通道要求不高,可以考虑转jpg,最好用webp,因为效果更佳。

尽量不要在项目中使用帧动画

一个帧动画几十张图片,再怎么压缩都还是占很大内存比重的。所以建议是让UI去搞,这里可以参考使用lottie-android,如果项目中动画效果多的话效果更加明显。

使用gradle开启shrinkResources

每1000行代码在apk当中才会占用5kb的空间

设置shrinkResources true移除无用资源文件

要通过 ProGuard 启用代码压缩,请在 build.gradle 文件内相应的构建类型中添加 minifyEnabled true:对无用的代码进行删除

  • minifyEnabled 这个是用来开启删除无用代码,比如没有引用到的代码
  • shrinkResources 用来开启删除无用资源,也就是没有被引用的文件(经过实测是drawable,layout,实际并不是彻底删除,而是保留文件名,但是没有内容,等等),但是因为需要知道是否被引用所以需要配合mififyEnable使用,只有当两者都为true的时候才会起到真正的删除无效代码和无引用资源的目的

同样的资源代码测试

  • 只有minififyEnable false或者 minififyEnable false && shrinkResources true

APK大小为1.39M 资源文件和layout都存在且是有内容的

  • 只有minifyEnable true

866K 资源文件和layout都存在且是有内容的

  • minifyEnable true && shrinkResources true

资源文件在但是没有内容大小都变成67字节,layout文件内容被清空

减少chasses.dex大小

classes.dex中包含了所有的java代码,当你打包时,gradle会将所有模板力的.class文件转换成classes.dex文件,当然,如果方法数超过64K,将要新增其他文件进行存储。可以通过multidexing分多个文件,比如这里的classes2.dex。换句话说,就是减少代码量。我们可以通过以下方法来实现:

  • 尽量减少第三方库的引用,这个在上面我们已经做过优化了。
  • 避免使用枚举,可能几十个枚举的内存占有量才相当一张图片这样子,优化效果也不会特别明显。当然,如果你是个追求极致的人,我不反对你用静态常量替代枚举。
  • 如果你的dex文件太大,检查是否引入了重复功能的第三方库(图片加载库,glide,picasso,fresco,image_loader,如果不是你一个人单独开发完成的很容易出现这种情况),尽量做到一个功能点一个库解决。

第三方库处理

  • 基础库统一
  • 选择更小的库,Android Methods Count
  • 仅引入需要的部分代码:Fresco的webp支持

图片压缩

其他

  • 7zip代替压缩资源。
  • 删除翻译资源,只保留中英文
  • 尝试将andorid support库彻底踢出你的项目。
  • 尝试使用动态加载so库文件,插件化开发。
  • 将大资源文件放到服务端,启动后自动下载使用。
  • Facebook的redex优化字节码 redexfacebook发布的一款android字节码的优化工具,需要按照说明文档自行配置一下。

redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年4月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 瘦身
  • APK 分析工具
    • ApkTool 反编译工具
      • Analyze apk
        • classyshark 二进制检查工具
          • nimbledroid app 性能指标系统
          • APK 组成
          • 对lib文件目录进行瘦身
          • 优化res,assets文件
            • 手动lint检查,手动删除无用资源
              • 使用tinypng等图片压缩工具对图片进行压缩。
                • 大部分图片使用Webp格式代替。
                  • 尽量不要在项目中使用帧动画
                    • 使用gradle开启shrinkResources
                    • 减少chasses.dex大小
                    • 第三方库处理
                    • 图片压缩
                    • 其他
                    相关产品与服务
                    文件存储
                    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档