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

一、去除冗余功能

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

    <applicationandroid: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节点变成了下面这副模样:

    <applicationandroid: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节点是下面这样的:

    buildTypes {release {minifyEnabled falseproguardFiles 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节点配置示例如下:

    buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles 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文件的过滤规则,详细的过滤配置如下所示:

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

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

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

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

  1. Android开发笔记(三十二)文件基础操作

    File类 File类是java中的文件操作工具类,它的常用方法如下: File构造函数 : 根据文件路径构造File对象 delete : 删除文件 exists : 判断文件是否存在 getNam ...

  2. Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法

    当我们将Android升级功能的中的下载新版本apk文件存放在data/data/xxx.apk位置时,在有的些版本的手机中安装可能会出现安装包解析出错的问题,对于该问题的解决方案是提升该文件的权限. ...

  3. Android开发笔记(序)写在前面的目录

    知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入 ...

  4. Android开发笔记(七十七)图片缓存算法

    ImageCache 由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存.图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了.只要理解图片缓存的算法, ...

  5. Android开发笔记(序)

    本开发笔记,借鉴与其他开发者整理的文章范例与心得体会.在这里作为开发过程中的一个总结与笔记式记录. 如有侵犯作者权益,请及时联系告知删除.俗话说:集百家成一言,去粕成金. ************** ...

  6. Android开发笔记(序)写在前面的目录大全

    转自  湖前琴亭 的博客https://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面 ...

  7. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

  8. Android开发--构建项目安装包APK(debug版)

    1.build→Build APK(s),点击即可构建 2.点击日志可以查看构建情况 3.点击locate即可进入debug文件夹 4.也可以在构建完成后直接按照路径找到debug文件夹 其中apk文 ...

  9. Android安装包APK如何解压

    参考:http://hellorheaven.iteye.com/blog/1012932 今天遇到一种情况,我们提供给客户的安装包APK是56.3M,客户觉得很大,通过看代码发现模型20.3M + ...

  10. Android开发笔记(一百七十七)借助FileProvider安装应用

    除了发送彩信需要文件提供器,安装应用也需要FileProvider.不单单彩信的附件图片能到媒体库中查询,应用的APK安装包也可在媒体库找到.查找安装包依然借助于内容解析器,具体的实现过程和查询图片类 ...

最新文章

  1. Python基础教程(八):日期和时间、文件I/O、异常处理
  2. a 中调用js的几种方法
  3. Linux学习之服务器搭建——DHCP服务器
  4. LeetCode之Missing Number
  5. Visual C++ 编译器选项 /MD、/ML、/MT、/LD
  6. Java校招笔试题-Java基础部分(二)
  7. spring FileCopyUtils类 上传图片
  8. 惠普招聘 运维质量管理顾问 1名 北京
  9. 使用SerialPort 对象实现串口拨号器通信[下]
  10. Linux系统启动流程图
  11. pytorch中lr_scheduler的使用
  12. C# sqlDataReader区别Dataset
  13. ae效果英文版翻译对照表_AE中CC效果英文对照表
  14. 计算器(加减乘除,平方,取余)
  15. 线程----code
  16. win10系统如何查询本机的IP地址和外网IP地址
  17. excel vba 去重
  18. 红旗h5中控台恢复出厂设置后不显示倒车影像问题
  19. 实时数据库和关系数据库的区别
  20. acr38u PHP调用,ACS ACR38智能卡读写器驱动下载_ACS ACR38智能卡读写器驱动官方下载-太平洋下载中心...

热门文章

  1. RK339中安卓系统7和9升级最新webView内核步骤
  2. Android 开发笔记2.0
  3. 微微一笑很倾城 从网红浅看CRM发展趋势
  4. matlab解决力学问题程序,力学专业程序实践:用MATLAB解决力学问题的方法与实例...
  5. 第三方自动投票软件制作教程
  6. 可决系数、相关系数、均方误差
  7. java中判断指定日期是星期几
  8. win10电脑玩红警老是卡死怎么办?win10电脑玩红警老是卡死解决方法
  9. 电脑复制粘贴不了怎么办?
  10. 2021(上海)第34届国际创业投资连锁加盟展览会