开发者社区> mogqp3unktbnq> 正文

Android 安装包体积优化

简介: 实际开发应用时,包体积优化是必不可少的。毕竟手机内存有限,如果包体积过大很多用户会直接放弃(以前手机内存很小的时候,这个真的很重要),现在由于手机内存大了(512G已经挡不住了),现在的用户更关注流畅度和美观作为参考,但是该有的优化还是要优化的,毕竟要尽善尽美嘛。
+关注继续查看

    实际开发应用时,包体积优化是必不可少的。毕竟手机内存有限,如果包体积过大很多用户会直接放弃(以前手机内存很小的时候,这个真的很重要),现在由于手机内存大了(512G已经挡不住了),现在的用户更关注流畅度和美观作为参考,但是该有的优化还是要优化的,毕竟要尽善尽美嘛。


安装包监控


Android Studio 的 APK Analyser


       这是 Android Studio 提供的一个 APK 检测工具,通过它可以查看一个 apk 文件内部各项内容所占的大小,并且按照大小排序显示。因此我们很容易观察到 APK 中哪一部分内容占用了最大空间。APK Analyzer 的使用非常简单,只要将需要分析的 APK 文件拖入 Android Studio 中即可(直接点击项目中的apk也可以),显示内容类似下图所示:

微信图片_20220522202800.png


微信图片_20220522202805.png


微信图片_20220522202809.png


       从上图中可以看出classes.dex都代码文件,不是很好东,看图片也占用了比较大的资源空间,因此可以针对性地对其做压缩优化等操作。(我这个项目是个demo所以显得代码占比较多。实际项目中肯定是图片资源占比相对较大)


           从上图看出,实际上 APK Analyzer 的作用不光是查看 APK 大小,从它的名字也能看出它是用来分析 APK 的,因此可以使用它来分析一些优秀 APK 的目录结构、代码规范,甚至是使用了哪些动态库技术等。


Matrix中 的 ApkChecker(传送)


       Matrix 是微信终端自研和正在使用的一套APM(Application Performance Management)系统。 Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。


安装包优化实践


Lint查找无用文件


       使用 Lint 查看未引用资源。Lint 是一个静态扫描工具,它可以识别出项目中没有被任何代码所引用到的资源文件。具体使用也很简单,只要在 Android Studio 中点击 Analyze -> Inspect Code,如下所示:


微信图片_20220522203141.png


选中整个项目,如下所示

微信图片_20220522203158.png



如果项目中有未被使用资源,则 Lint 会在窗口 Inspection Result 中显示,类似结果如下:

微信图片_20220522203218.png



低效布局权重:提供优化方案。


微信图片_20220522203231.png


       上面就是未使用的资源:会使应用程序变大,并降低构建速度。


       还有很多就不多介绍了,感兴趣的可以去玩玩。


启用压缩、混淆和优化功能


       当你使用 Android Studio 3.4 或 Android Gradle 插件 3.4.0 及更高版本时,R8 是默认编译器,用于将项目的 Java 字节码转换为在 Android 平台上运行的 DEX 格式。不过,当您使用 Android Studio 创建新项目时,缩减、混淆处理和代码优化功能默认处于停用状态。

        debug{
            // 启用代码收缩、模糊处理和优化
            minifyEnabled true
            // 资源缩减
            shrinkResources true
            //包括与打包在一起的默认ProGuard规则文件
            //R8配置文件。
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }


  未启用


微信图片_20220522203400.png


 启用后


微信图片_20220522203423.png


文件优化


图片优化


降低图片bit


微信图片_20220522203448.png


 不需要太精致的图片可以将图中32 bit降至16 bit或者8 bit。


使用 VectorDrawable 图片


       UI小姐姐能提供最好不能提供,咱们自己自己造。


       Android Studio 中点击 File > New > Vector Asset


微信图片_20220522203529.png


    Clip Art 项为固有的矢量图,我们直接用即可,而Local file(SVG,PSD)选项,则是我们需要转换的了,剩下的提示进行就可以啦。


使用 webp 格式图片


       使用webp格式的图片可以在保持清晰度的情况下减小图片的磁盘大小,是一种比较优秀的,Google推荐的图片格式。


       选中图片>右键>选择


微信图片_20220522203627.png

微信图片_20220522203630.png


图片由.png转为.webp


三方库优化


       在 App 中会引入各种三方的库,但是在引入之前最好权衡一下是否需要将其代码全部引入,造成不必要的代码或者资源也被打包到 APK 中。


       例如Facebook全家桶,你不可能全部用到仅导入部分即可,如登入和分享


dependencies {
    // Facebook Core only (Analytics)
    implementation 'com.facebook.android:facebook-core:11.1.0'
    // Facebook Login only
    implementation 'com.facebook.android:facebook-login:11.1.0'
    // Facebook Share only
    implementation 'com.facebook.android:facebook-share:11.1.0'
    // Facebook Messenger only
    implementation 'com.facebook.android:facebook-messenger:11.1.0'
    // Facebook App Links only
    implementation 'com.facebook.android:facebook-applinks:11.1.0'
    // Facebook Android SDK (everything)
    implementation 'com.facebook.android:facebook-android-sdk:11.1.0'
}
 
仅需导入
dependencies {
    implementation 'com.facebook.android:facebook-login:11.1.0'
    implementation 'com.facebook.android:facebook-share:11.1.0'
}


  例如XRecyclerView一个 RecyclerView 实现了 pullrefresh 、loadingmore 和 header featrues。你可能仅用到 loadingmore,那你就可以将关于loadingmore部分截取出来。而不用导入整个包。


关于 App Bundle


       这个功能就跟ios一样了,他们就是将所有资源全部打到项目中,然后App Store,根据安装设备的属性,来选取相应资源打包进行下载。


       谷歌的 Dynamic Delivery 功能就天然地解决了这个问题,通过 Google Play Store 安装 APK 时,也会根据安装设备的属性,只选取相应的资源打包到 APK 文件中。


       如下图,你上传的700MB大小的aab,但是你下载的话会有两套资源打在apk中,但是用户下载仅一套资源700MB。


微信图片_20220522203849.png


       但是 App Bundle 目前只适合在 Google Play Store 上发布的项目,国内目前还是通过各家的插件化方案来实现动态部署,一定程度上也可以算作减少安装包大小的方案。


       还有一个骚操作,就是前期资源打包,后续资源用户边玩边下载,缺点可能造成卡顿和浪费流量,仅供参考。


文章推荐


Image Asset Studio(图标生成工具)


aab打包


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19723 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29028 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13544 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22504 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
16373 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20659 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14895 0
201
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载