`
Z_萧晓
  • 浏览: 11274 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android性能优化之APK瘦身详解(瘦身73%)

阅读更多

 

公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了。可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段。你在写上个版本的内容,好了,下个版本的更新内容已经定稿了。基于这种快速开发的现状,我们app优化前已经有87.1M了,包大了,运营说这样转化不高,只能好好搞一下咯。优化过后包大小为23.1M(优化了73%,不要说我标题党)。好了好了,我要阐述我的apk超级无敌魔鬼瘦身之心得了。

文章目录:

 

文章主要内容从理论出发,再做实际操作。分为下面几个方面:1. 结构分析, 2.具体实操 3. 总结 4. 参考资料

1. 结构分析

首先上传一张瘦身前通过Analyze app分析出来的图片(打开方式:Android Studio下 ——> Build——> Analyze app):

 

APK包结构如下:

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

通过分析图可以知道,目前app主要是so文件占比比较大,占了31.7M,占了整个应用是38.2%。其次是assets目录,整个目录占了32M,第三就是资源文件res目录了。所以接下来我们处理步骤就是按这个顺序来处理。(简单说下图中的Raw File Size(磁盘解压后的大小)和DownLoad Size(从应用商店下载的大小),分析了包结构组成之后,我们可以开始瘦身操作了。

2.具体实操

1. 对lib目录下的文件进行瘦身处理

1. 修改lib配置:

参考资料
so文件的优化:通常我们在使用NDK开发的时候,我们经常会有如下这么一段代码:

ndk {
            //设置支持的so库架构
            abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
        }
 

最后我的修改代码如下:

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,那么会在性能上造成一定的影响。

参考文章:安卓app打包的时候还需要兼容armeabi么?

好了,我们再打一次包试试。

 
 

确实有点震惊,一下子包小了这么多,从87.1M到51.9M,容我好好算算少了多少M.赶快让测试帮忙测一下。基于之前的理论知识,心里还是有点底。果然,测试效果和之前是一样的。心里的石头先落下罗。

2. 重新编译so文件,用更小的库代替

相信很多开发者都有这种苦恼,很多第三方我们导入进来只用到其中很小一部分功能,大部分功能都是我们用不上的。这时候我们找到源代码,将我们需要的那部分代码提取出来,重新编译成新的so文件,再导入到我们项目中。当然,如果之前没有编译过so文件,这部分建议做最后的优化去处理。不然你会遇到很多问题。上一波处理后的效果图:

 

这里说下,因为项目中有使用到ffmpeg库,之前导入的第三方的放在assets文件夹下,重写编写后的so库文件放在lib文件夹下,所以lib文件夹反而大了。从51.9M到35.6M,效果还是蛮不错的。

对了,别问我为什么assets文件夹下为什么还有12.6M资源,因为很多.mp3都是第三方的人脸识别必备配置文件,我也很无奈。

 

2. 优化res,assets文件大小

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

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

 

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

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

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

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

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

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

5. 使用gradle开启shrinkResources

移除无用资源文件,下面是我的配置:

 buildTypes {
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

通过上述步骤操作,apk效果如下:

 

又优化了将近5M,别问我为什么还有7.5M,里面大量的gif和webp格式的动图,都是UI丢给我的,一个2.7M.后面再慢慢和他细究这个问题。后面要做的两部分,一部分是将资源文件下的所有gif图放后台下载处理,第二个是和UI讨论下如何减小webp 动图的大小(我看其他平台只有100K的样子,给我的就2.7M?)。

3. 减少chasses.dex大小

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

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

关于classes.dex文件大小分析可以参考这篇译文使用 APK Analyzer 分析你的 APK

4. 其他

  1. 用7zip代替压缩资源。
  2. 删除翻译资源,只保留中英文
  3. 尝试将andorid support库彻底踢出你的项目。
  4. 尝试使用动态加载so库文件,插件化开发。
  5. 将大资源文件放到服务端,启动后自动下载使用。

3. 总结

好了,说道这里基本上就结束了,apk包从87.1M减小到了23.1M(优化了73%,不要说我标题党)已经差不多了,关于第四部其他部分的优化我是没有进行再操作的。因为公司运营觉得二三十M的包比较真实,太小了就太假了。所以我暂时就不进行优化了。如果再上面提到的部分通过所有将所有非启动页面首页之外的所有资源,so库放服务端,理论上apk包大小能在10M以内这样子。

 

不管怎么说,大家技术还是要学好的。小编下面给大家分享一份成为高级工程师学习路线,如果想学习高级UI、性能优化、移动架构师、 NDK、混开发等Android高阶开发的朋友可以加下我的Android架构群:887084983,还有免费的学习资料及面试资料领取~

 

好了,文章到这里就结束了如果你觉得文章还算有用的话,不妨把它们推荐给你的朋友。

0
0
分享到:
评论

相关推荐

    Apk 全面瘦身详解

    本文将详细讲解Apk瘦身的各种策略,从理解Apk的包结构开始,探讨如何进行有效的优化。 首先,了解Apk的包结构是优化的第一步。Apk主要包含以下几个部分: 1. **lib/** 目录:存放针对不同CPU架构的.so库文件,通常...

    android核心技术与实例详解》电子书与源码

    书中可能会涉及内存管理、UI流畅度、电量优化、APK瘦身等技巧,帮助开发者打造高效的应用。 十、测试与发布 最后,书中还会介绍如何进行单元测试、UI测试、性能测试,以及如何打包、签名和发布应用到Google Play ...

    《android核心技术与实例详解》源码(完整版)

    这本书涵盖了Android应用开发的多个重要方面,包括但不限于UI设计、数据存储、网络通信、多线程处理、性能优化等。以下是对这些关键知识点的详细说明: 1. **UI设计**:Android的用户界面设计是通过XML布局文件实现...

    Android应用开发详解

    11. **Android组件生命周期**:理解Activity、Fragment等组件的生命周期是防止内存泄漏和优化性能的基础。开发者应学会在适当的时间点执行操作,如保存和恢复状态。 12. **多线程和并发**:Android主线程(UI线程)...

    [Android系统原理及开发要点详解].(韩超,梁泉).扫描版

    12. **Android性能优化**:内存泄漏检测、CPU使用率分析、UI流畅性优化、APK瘦身等实践技巧。 13. **App发布与调试**:打包流程、签名机制、版本控制,以及使用Android Studio进行调试的方法。 14. **Android NDK...

    Android系统原理及开发要点详解课件

    10. **资源优化**:包括内存管理、图片压缩、APK瘦身等方面,优化资源使用可以提高应用性能并减少用户数据消耗。 此外,课程还可能涵盖Android Studio的使用技巧、单元测试、调试方法、版本控制、Gradle构建系统...

    android核心技术与实例详解口袋微博项目源码

    12. **性能优化**:包括内存泄漏检测、UI流畅度优化、APK瘦身、启动速度提升等,这些都是提升应用质量的关键。 在"KDWB"这个压缩包中,可能包含了上述各个技术的实现细节,通过阅读和分析这些源码,开发者不仅可以...

    Android系统原理与开发要点详解_培训课件.rar

    10. **性能优化**:内存优化、渲染优化、电量优化和APK瘦身等。 11. **单元测试与自动化测试**:JUnit、Espresso等工具的使用,进行应用的测试和调试。 12. **热修复与插件化**:了解如何通过DexClassLoader实现热...

    Android应用开发详解第18章的代码

    8. **性能优化**:这部分可能包含内存管理、CPU优化、布局优化、APK瘦身等实践策略,以提高应用的运行效率和用户体验。 9. **权限管理**:随着Android系统版本的更新,权限管理变得越来越重要。这里可能讲解如何...

    《Android应用开发详解》配套光盘之源代码

    10. **性能优化**:如内存管理、耗电优化、APK瘦身、布局优化等实践案例,帮助开发者打造高质量的应用。 通过对这些源代码的学习和研究,开发者不仅可以加深对Android开发的理解,还能积累实际项目经验,提升解决...

    AndroidStudio实战快速高效地构建Android应用 AndroidStudio 高清完整带目录书签 PDF AndroidStudio实战

    10. **Android性能优化**:介绍内存管理、CPU优化、启动速度提升、APK瘦身等实践策略,以及使用Android Profiler进行性能分析。 11. **发布与分发**:讲解如何签名APK,通过Google Play Store或其他分发渠道发布...

    Android核心技术与实例详解

    15. **Android性能优化**:内存泄漏检测、UI流畅性优化、APK瘦身、代码混淆等,提高应用的效率和稳定性。 16. **单元测试与集成测试**:JUnit、Espresso和Mockito等工具用于编写测试用例,确保代码质量。 17. **...

    Android核心技术与实例详解源码和文档全

    14. **性能优化**:包括内存优化、UI流畅性、电量管理、APK瘦身等方面,理解Dalvik和ART虚拟机的工作原理,以及使用Profiler工具进行性能分析,有助于打造高效、流畅的应用。 15. **Android Studio与Gradle**:...

    Android核心技术和开发详解-源码完整版

    16. **Android性能优化**:内存管理、渲染优化、电量优化、APK瘦身等都是Android性能优化的重点,通过这些技术可以提升用户体验。 17. **单元测试与持续集成**:了解JUnit、Espresso等测试框架,以及如何配置持续...

    Android移动开发案例详解

    15. **性能优化**:介绍内存优化、渲染性能提升、APK瘦身等方法,提高应用的运行效率和用户体验。 通过这些章节的学习,开发者可以掌握Android应用开发的全貌,从基础到进阶,从理论到实践,从而能够独立完成各种...

    Android 核心技术与实例详解_课件PPT

    13. **性能优化**:包括内存优化、绘制优化、APK瘦身、电量管理等方面,优化应用性能对于提升用户体验至关重要。 14. **安全性**:涉及权限管理、数据加密、代码混淆等,确保应用的安全性是开发者必须关注的问题。 ...

    Android核心技术和开发详解源码完整版(7-12章)

    在Android核心技术和开发详解源码完整版的7-12章中,涵盖了Android开发的关键领域,包括UI系统、数据存储、网络通信、多线程、性能优化以及应用程序发布等核心概念。下面将对这些章节的主要内容进行详尽的阐述。 **...

    android 应用开发详解(光盘源代码04)

    最后,为了确保应用的性能和用户体验,你需要关注内存优化、性能监控、APK瘦身等技术。例如,避免内存泄漏,合理使用软引用和弱引用,以及使用ProGuard或R8进行代码混淆,保护应用的安全性。 总之,"Android应用...

    Android_DEX_文件格式详解

    Android DEX 文件是Dalvik虚拟机执行的字节码文件,它是Android应用的主要组成部分,包含了应用程序的类、方法和数据。下面将详细解释DEX文件...开发者可以通过修改DEX文件来实现APK的瘦身、性能提升或保护代码安全。

Global site tag (gtag.js) - Google Analytics