Android 包体积优化建议-资源篇

这是 Android 官方文档给出的一些减少包体积的建议,最近正好在看这方面内容,顺手记录、分享一下。本文主要是针对 Android 的资源(Resource) 相关优化建议。

1 移除无用资源

使用 lint 静态代码分析工具查找出未使用的 res 资源。

注意 assertlib 下的未使用资源无法检测出来,其中 assert/ 资源引用采用的是反射方法。 除了检测工具外,Gradle 还支持在打包编译的时候自动移除无用资源,使用 shrinkResources

android {// Other settingsbuildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}

这里 minifyEnabled 需要一起打开,即代码压缩。这样编译的时候会先用 R8 进行无用代码移除,然后 gradle 插件进行无用资源的移除。详细使用参考:Shrink, obfuscate, and optimize your app

除此之外,还可以使用 resConfig 配置针对指定的 flavor 来打包指定的资源。比如外发包的图片和第一方的包的资源不一样,配置在不同的文件夹下,打包的时候就可以只打包指定的文件夹资源,这样也能减少一定的体积。

2 减少依赖库大小

开发的时候,在选择第三方工具库时,需要关注一下该库的大小。比如 Android 图片加载库 Glide、Picasso、Fresco的选择,将依赖库的体积大小作为选用的衡量标准之一。

另外,如果只是使用某个工具库的其中一个(小)功能,是否可以考虑将其下载下来自行修改,适当移除不需要的功能代码,从而减少依赖库的体积。

3 原生动画图片支持

使用 ImageDecoder 原生 API 支持带动画的 GIF 和 WebP 的图片文件格式,从而删除第三方库减少包体积。

要求 Android 11 以上才支持

4 支持特定分辨率

从 Android 4.4 开始,支持 ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpixxxhdpi 这么多的分辨率(屏幕密度,density),但是没有必要给每个分辨率都制作对应的图片资源。

也许你的用户只有 0.1% 的人需要 ldpi

这个时候,其实我们只需要一种分辨率的文件夹,比如 drawable-nodpi/,对于其他的,系统会自动适配(放大缩小)

官方推荐至少有一种分辨率 xxhdpi

5 使用 drawable 或代码渲染图片

有些单色背景图片其实不需要静态的图片文件,使用 Drawable 对象(xml 里的 )可以在运行的时候绘制出来,从而节省出静态图片文件的大小。

对应的,使用代码来生成某些简单的效果图(render from code),比如页面背景设置为纯色。

相比使用图片文件,可以减小一定的包体积大小。

6 复用资源

某些情况下,两张图片可能除了角度或者颜色不一样,其他都是一样的,这个时候,我们就不推荐使用2张图片,可以通过代码来上色或者旋转。

图片的纯上色(改变颜色),大于 Android 5.0(API 21) 的系统可以使用 android:tinttintMode ,小于 Android 5.0 的版本使用 ColorFilter 来完成。

改变图片的旋转角度,比如上箭头改为下箭头这种,使用下面这样即可:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/ic_thumb_up"android:pivotX="50%"android:pivotY="50%"android:fromDegrees="180" />

7 压缩图片资源文件

官方内置的工具 aapt,在编译的时候,会自动对 res/drawable/ (其他目录无效,比如 asset/ )里面的图片进行无损压缩(lossless compression),如果不需要,可以手动关闭:

buildTypes.all { isCrunchPngs = false }

需要注意的是,isCrunchPngs 在 release 默认打开(这会增加编译时间),debug 下默认关闭。

选用第三方工具进行不同格式图片压缩:

  • PNG 使用 Pngcrush (推荐)、pngquant、zopfli

8 使用 WebP 文件格式

Android 3.2(API 13) 之后开始支持 WebP 图片格式。

WebP 相比 JPEG 和 PNG 有更好的压缩效率(即压缩的体积更多,损失越小),可以直接在 Android Studio 里面将 BMP, JPG, PNG 或者静态 GIF 图片转换为 WebP 格式。

JPEG 为有损压缩(lossy compression) PNG 为无损数据压缩,主要体现在透明度上的变化。(lossless data compression,a raster-graphics file format)

9 使用矢量图形(vector graphics)

矢量图形是一种与分辨率无关的图片,100字节大小的文件可以描述出充满整个屏幕的高清图片。

矢量图形在代码里用 VectorDrawable 表示。

但是有一定的性能问题。矢量图形本质上就是一系列 xml 数据,Android 系统根据矢量图形的“描述”调用 cpu\gpu 去绘制出来一张图:比如x坐标以上涂满红色,y坐标以下涂满绿色,哪里哪里填上灰色…

适合用于小面积的图标(icon)绘制,不适合大面积的图像绘制,有一定的性能消耗。

例子:

<!-- res/drawable/battery_charging.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"android:height="24dp"android:width="24dp"android:viewportWidth="24.0"android:viewportHeight="24.0"><groupandroid:name="rotationGroup"android:pivotX="10.0"android:pivotY="10.0"android:rotation="15.0" ><pathandroid:name="vect"android:fillColor="#FF000000"android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z"android:fillAlpha=".3"/><pathandroid:name="draw"android:fillColor="#FF000000"android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z"/></group>
</vector>

还有动画效果也可以使用 vector graphics 来实现,(对比使用逐帧动画,需要放入大量的单帧图片组合一个动画,极大增加了apk包大小!)

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71938.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云炬Android开发笔记 2-2 Android studio项目上传到Github及无法连接Github的问题处理

本文将介绍如何将AS上的项目发布到GitHub上&#xff1a; 选择 VCS——enable verSion control integrate &#xff1a; 选择GIT&#xff1a; 此时可以发现左侧的类都变红了&#xff1a; 此处的颜色含义&#xff1a; 绿色&#xff0c;已经加入控制暂未提交 红色&#xff0c;未加…

【Python】JupyterLab 4.0 来了

来源丨Deephub Imba JupyterLab 是 Jupyter Notebook 的下一代版本&#xff0c;它提供了更强大的功能和更灵活的用户界面&#xff0c;6月6日&#xff0c;官方发布了JupyterLab 4.0的说明&#xff0c;并且说该版本是下一个主要的版本。 JupyterLab的主要改进是: 用户界面&#x…

关于安装基于Anaconda的Pytorch报错问题(文章为所有安装步骤)

由于一开始Pycharm无法下载资源包&#xff0c;所以打算重新安装一下Anaconda&#xff0c;没想到想在官网下载Anaconda时文件丢失&#xff0c;缺少Sprits文件&#xff0c;在网上尝试了很多方法也没有成功&#xff0c;最后猜测应该是之前卸载Anaconda时没有卸载干净&#xff0c;导…

分享一个免费开源的视频剪辑软件(Shotcut)-附带安装教程以及中文设置

Shotcut是什么? Shotcut是一个免费开源跨平台的视频编辑器,内置丰富的视频效果,音频效果,转场效果,最重要是shotcut这款软件操作极其简单,尤其适合新手,是新手入门自媒体的最佳工具 下载Shotcut 官网地址: https://www.shotcut.org 官网下载页面: https://www.shotcut.org/…

剪映专业版大更新:一款全能好用的视频编辑工具

剪映专业版 for Mac是一款全能好用的视频编辑工具&#xff0c;使用剪映专业版能够轻松对视频进行各种编辑&#xff0c;包括卡点、去水印&#xff0c;特效制作、倒放、变速等&#xff0c;还有专业风格滤镜&#xff0c;精选贴纸给你的视频加点乐趣。 本次更新功能&#xff1a; …

剪映专业版v1.4.1正式版!一款全能好用的视频编辑工具

电脑版的剪映称之为“专业版”&#xff0c;相对手机版功能更加强大。比如&#xff0c;Windows 版和 Mac 版支持多视频轨 / 多音频轨编辑&#xff0c;支持 4K 视频分辨率与 60fps 帧率&#xff0c;可一键添加变速效果&#xff0c;拥有多类型蒙版&#xff0c;多视频轨道编辑创作等…

为什么都不想去中科创达_排了10000桌的超级文和友,我这辈子都不想再去了

■ 作者 桃之 ■ 内容转载自Vista氢商业(ID&#xff1a;Qingshangye666) 提起长沙&#xff0c;你最先想到什么&#xff1f; 芒果TV&#xff1f;No&#xff0c;No&#xff0c;No&#xff01; 而今的长沙主题热议&#xff0c;是茶颜悦色和超级文和友。 当你朋友圈的人在长沙玩时…

HTTP代理服务器

代理服务器实现流程 创建一个监听服务器&#xff0c;监听客户端的连接。客户端连接上后&#xff0c;将客户端要上网的信息&#xff0c;发给网络web服务器&#xff0c;然后从那里读取数据&#xff0c;再发给客户端。 注&#xff1a;客户端是通过浏览器的设置&#xff0c;来设置…

nginx获取代理服务ip及客户端真实ip

一、问题背景   在实际应用中&#xff0c;我们可能需要获取用户的ip地址&#xff0c;比如做异地登陆的判断&#xff0c;或者统计ip访问次数等&#xff0c;通常情况下我们使用 request.getRemoteAddr() 就可以获取到客户端ip&#xff0c;但是当我们使用了nginx 作为反向代理后…

如何使用国内代理ip?

现在市面上有很多代理ip&#xff0c;功能多种多样&#xff0c;五花八门的产品让用户挑花了眼&#xff0c;下面是购买代理IP时应该是注意的几点。 代理IP类型代理IP分为多种类型&#xff0c;按照匿名度区可分为透明代理、普通代理、高匿代理&#xff1b;按照用途可分为HTTP代理…

获取客户端IP地址(nginx代理)

需求 对接支付系统的时候, 需要传入 付款方,也就是客户端的IP地址 现象 客户端的请求走我们的 nginx 代理了, 获取到的客户端ip地址不对, 变成了 nginx 服务器的地址了 data 的值是nginx服务器的地址, 这样很明显不对 没有加之前的配置 解决方案 在 nginx 的配置里面加上…

代理ip

proxies有两种协议&#xff0c;http 和 https&#xff0c;访问http协议的网页&#xff0c;需要将代理设置成http&#xff0c;https 也是如此&#xff0c;如果设置错误&#xff0c;仍会使用你自己的IP地址。 https://icanhazip.com/ 这个链接可以查看你访问这个网页所使用的的I…

ip代理

为什么会出现IP被封 网站为了防止被爬取&#xff0c;会有反爬机制&#xff0c;对于同一个IP地址的大量同类型的访问&#xff0c;会封锁IP&#xff0c;过一段时间后&#xff0c;才能继续访问 如何应对IP被封的问题 有几种套路&#xff1a; 修改请求头&#xff0c;模拟浏览器…

测试一下博弈Ai能不能让你成为一个出色的服装设计师

笔者也不是专业的设计人员&#xff0c;就是突发奇想&#xff0c;看看怎么利用博弈AI的设计一款自己风格的衣服。 首先我们打开博弈AI的官网&#xff0c;链接&#xff1a;博弈Ai-基于ChatGPT4及3.5的智能聊天机器人国产镜像 我们把自己的创意和要求提交给博弈AI&#xff0c;就得…

传统企业如何面对电子商务的发展

传统企业如何面对电子商务的发展 在现代生活中&#xff0c;人们对电子商务已经不再陌生。但是随着在电子商务的快速发展&#xff0c;传统零售企业的生存环境变得更加困难&#xff0c;不但面临着上游原材料价格飞涨的困扰&#xff0c;还受到下游渠道商、零售商、品牌商的多重挤…

2022跨境电商新战场:海外社交电商发展前景分析

社交电商正在慢慢改变人们的购物习惯。最近几年&#xff0c;国内由于疫情和电商平台流量红利减少的影响&#xff0c;出现了一批已抖音、快手为代表的社交电商&#xff0c;且迅速大火。随着TikTok在海外的不断布局&#xff0c;社交电商模式的影响力也在不断扩大。作为Nox聚星的营…

电子商务时代,企业社交电商转型要做什么?

当前,全球经济一体化已经成为一种趋势&#xff0c;电商企业的出现也迅速改变了传统的经济交易方式和经济的形式,进一步促进了经济结构的重组及调整,推动了工业经济快速向信息经济转换。 电子商务的诞生给世界经济发展带来了新的推动力,并且给企业创造了新的商业机遇,企业可以提…

盘点两个神器,快速告别垃圾短信邮件

前言 在日常生活中&#xff0c;我们时常会接收到一些垃圾短信和邮件&#xff0c;造成这种原因就是因为我们使用自己的手机号码在 App 上 注册了账号&#xff0c;导致手机号泄露&#xff0c;成为了别人发财的工具。 一、如何避免接收垃圾短信 众所周知&#xff0c;针对短信和…

使用 ChatGPT、Stable Diffusion、React 和 NodeJS 构建网站画廊

TLDR 在本文中&#xff0c;您将学习如何构建一个 Web 应用程序&#xff0c;该应用程序使用 ChatGPT 和 Stable Diffusion 为您提供的任何网站描述生成徽标和合适的域名。 介绍 人工智能正在接管世界。这些技术每天都在震撼着我们的世界&#xff1a;ChatGPT 和 Stable Diffusion…

工业富联2018年报来了!上市后首张成绩单大起底

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云…