前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(一百七十三)给安装包APK文件瘦身

Android开发笔记(一百七十三)给安装包APK文件瘦身

作者头像
aqi00
发布2020-09-08 21:19:58
6990
发布2020-09-08 21:19:58
举报
文章被收录于专栏:老欧说安卓老欧说安卓

App不但要求功能完善,其他方面也得综合考虑,比如APK安装包的文件大小就是很重要的因素。具备同样功能的两个安装包,一个很大很占用空间,另一个较小不怎么占空间,用户的选择结果自然不言而喻。如何减少打包后的APK文件大小,也就是所谓的APK瘦身,这涉及到很多技术手段,最常用的主要有四块:去除冗余功能、精简无用资源、减少图片大小、过滤无用的so文件,分别介绍如下:

一、去除冗余功能

每当开发者创建新的Android项目,打开模块的AndroidManifest.xml,看到默认的application节点是下面这样的:

代码语言:javascript
复制
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

注意application节点有两个属性allowBackup和supportsRtl,且都被设为true,它俩到底是干什么用的呢? 首先看allowBackup,该属性若设置true,则允许用户备份APK安装包和应用数据,以便在刷机或者数据丢失后恢复应用。这里其实隐含着高危漏洞,因为备份后的应用数据可能被人复制到其他设备,如此一来用户的隐私就会泄露出去,什么账号密码、聊天记录均可遭窃。所以还是赶紧关闭这个鸡肋功能,把allowBackup属性值由默认的true改为false。 然后看supportsRtl,该属性名称当中的Rtl为“Right-to-Left”(从右到左)的缩写,像中东的阿拉伯语、希伯来文等从右到左书写,supportsRtl属性为true时表示支持这种从右向左的文字系统。可是常用的中文、英文等等都是从左往右书写,根本用不着从右到左的倒排功能,因此若无特殊情况可把supportsRtl属性值由默认的true改为false。 关闭备份与倒排功能之后,application节点变成了下面这副模样:

代码语言:javascript
复制
    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="false"
        android:theme="@style/AppTheme">

二、精简无用资源

同样打开新项目的build.gradle,发现buildTypes节点是下面这样的:

代码语言:javascript
复制
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            
        }
    }

可见有个minifyEnabled属性,默认值为false,该属性的字面意思为是否启用最小化,如果将它设为true,则Android Studio在打包APK时会进行以下代码处理: 1、压缩代码,移除各种无用的实体,包括类、接口、方法、属性、临时变量等等; 2、混淆代码,把类名、属性名、方法名、实例名、变量名替换为简短且无意义的名称,例如Student类的名称可能改为a,方法getName的名称可能改为b等等; App的Java代码经过压缩和混淆之后,打包生成的APK文件会随之变小。除了代码之外,应用项目还包括各种资源文件,若想移除无用的资源文件(包括xml布局和图片),就要引入新属性shrinkResources,并将该属性值设为true,这样Android Studio在打包APK时便会自动移除无用的资源文件。同时开启代码压缩和资源压缩的buildTypes节点配置示例如下:

代码语言:javascript
复制
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

三、减少图片大小

由于手机屏幕的尺寸有限,原始质量的高清图片与有损压缩后的图片在视觉上没有什么差别,因此适当压缩图片质量也是减小APK体积的一个重要途径。App传统的资源图片主要有jpg和png两种格式,对于jpg图片来说,利用看图软件ACDSee即可快速压缩图片大小,先使用ACDSee打开jpg文件,然后依次选择菜单“文件”→“另存为”,弹出如下图所示的保存窗口。

单击保存窗口右下角的选项按钮,弹出如下图所示的JPEG选项窗口,把窗口上方“图像质量”区域的拖动条往左拖到60处,表示有损压缩保持60%的图像质量。单击选项窗口下方的确定按钮,回到前一步骤的文件保存窗口,单击窗口右侧的保存按钮,完成jpg图片的压缩操作。

对于png图片来说,利用PhotoShop即可快速压缩图片大小,先使用PhotoShop打开png、文件,然后依次选择菜单“文件”→“存储为Web所用格式”,弹出如下图所示的保存窗口。

单击窗口右上角的预设下拉框,并选中最后一项“PNG-8”,再单击窗口下方的储存按钮,完成png图片的压缩操作。

四、过滤无用的so文件

有的第三方库为了兼容不同CPU,提供了多种指令架构的so文件,例如:ARM架构的armeabi-v7a(32位)和arm64-v8a(64位)、英特尔架构的x86(32位)和x86_64(64位)、MIPS架构的mips(32位)和mips64(64位)等等。其中ARM架构主要用于智能手机,X86架构主要用于个人电脑,MIPS架构主要用于路由器和机顶盒。之所以提供x86架构的so文件,是为了能够在电脑的模拟器上运行App,开发阶段当然无所谓安装包大小,正式发布就得考虑给APK瘦身,因此正式版本的安装包建议移除非ARM架构的so文件。此时需要修改模块的build.gradle,在release节点下添加so文件的过滤规则,详细的过滤配置如下所示:

代码语言:javascript
复制
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 过滤第三方库里面多余的so文件,例如x86、x86_64这些用于个人电脑的英特尔指令集
            ndk {
                abiFilters "arm64-v8a", "armeabi-v7a" // 保留这两种指令架构的so文件
            }
        }
    }

添加so过滤配置后再导出安装包,重新生成的APK文件大小足足比原来减了好几M,可见瘦身成功。

点此查看Android开发笔记的完整目录

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、去除冗余功能
  • 二、精简无用资源
  • 三、减少图片大小
  • 四、过滤无用的so文件
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档