共计 3503 个字符,预计需要花费 9 分钟才能阅读完成。
前几年开始 Android 开发的职业生涯,那会公司对 APP 的包体积还特别敏感,到了今天,对 APP 的包体积已经不在是特别敏感了
但是对于
- 出海应用 APP,非洲,印度那些网络资源匮乏的地方,APP 包体积还是特别敏感的
- 日活,流量比较大的 APP, 如微信,抖音等 APP,对包体积还是比较关注的
所以今天还是把我之前对 APP 瘦身的笔记分享给大家,与此共勉(内容不包含插件化,Split APK 等动态下发技术,Only 客户端自己的优化)
APK 包结构简介
APK 包结构主要包含
- assets 目录:用于存放需要打包到 APK 中的静态文件和 res 的不同点在于,assets 目录支持任意深度的子目录,用户可以根据自己的需求任意部署文件夹架构,而且 res 目录下的文件会在.R 文件中生成对应的资源 ID,assets 不会自动生成对应的 ID(在不动业务逻辑,或者代码逻辑的情况下, 针对此项很难优化)
- lib 目录: 存放应用程序依赖的 native 库文件, .so 的形式存在
- res 目录:res 是 resource 的缩写,这个目录存放资源文件
- resources.arsc 文件:编译后的二进制资源文件
- META-INF 目录:保存应用签名信息,此处可验证 APK 的完整性,签名等
- AndroidManifest.xml:应件文件配置信息
- classes.dex:
下面我们来说一下优化的具体实施有哪些.
classes.dex 中常量 R 文件及内敛类的删除 * .R$ *
我们知道,Android 的 Res 资源会生成 R 文件的引用,如下
public final class R {
private R() {
}
public static final class id {
public static final int action_container = 2131165209;
public static final int action_divider = 2131165211;
public static final int action_image = 2131165212;
public static final int action_text = 2131165218;
public static final int actions = 2131165219;
public static final int async = 2131165226;
public static final int blocking = 2131165232;
public static final int chronometer = 2131165246;
public static final int forever = 2131165290;
public static final int icon = 2131165299;
public static final int icon_group = 2131165300;
public static final int info = 2131165305;
public static final int italic = 2131165309;
public static final int normal = 2131165373;
public static final int notification_background = 2131165374;
public static final int notification_main_column = 2131165375;
public static final int notification_main_column_container = 2131165376;
public static final int right_icon = 2131165405;
public static final int right_side = 2131165406;
public static final int tag_transition_group = 2131165453;
public static final int text = 2131165456;
public static final int text2 = 2131165457;
public static final int time = 2131165461;
public static final int title = 2131165462;
private id() {
}
}
public static final class drawable {
…
}
public static final class dimen {
…
}
…
}
这都是些常量, 那我们有没有办法删除这个文件呢,引用的地方直接使用常量的值?事实是可以的. 根据 APK 打包的编译过程,在编译过程中使用 Android 的 Transform 替换所有的类里面的常量. BuildConfig, Rlayout, R$string,AppConstans, etc
目前滴滴开源了一个 booster 可以直接使用,不用在自己造轮子
booster-transform-shrink
效果
组件化后或者依赖第三方 R 文件越来越多, 常量比较多时,效果比较显著 据抖音的一哥们说,他们项目针对此项目优化后,包体积减少 2M 左右.
在我们项目上使用,不是很明显,优化体积 1M 左右.
注意事项
因为是删除常量,所有使用反射的地方也需要 keep 住,如果使用滴滴的 booster,可以参考 issues
Res 资源
Android Lint 去除无用资源
当我们项目迭代不断迭代,总有些资源逐渐不在使用,成为了冗余,当很多时候又懒得删,或者怕删了出问题. Android Studio 自带 lint 工具可以帮助我们清楚这些无用资源.(这里的清楚和 shrinkResources 去除无用是不一样的)
使用方法入口
自我介绍一下,小编 13 年上海交大毕业,曾经在小公司待过,也去过华为、OPPO 等大厂,18 年进入阿里一直到现在。
深知大多数 Android 工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024 年 Android 移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合 3 年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了 95% 以上 Android 开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加 V 获取:vip204888(备注 Android)
最后
感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近 30 的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎 j8 扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?
Android 凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己 8 年 Android 开发的知识笔记整理成的 Android 开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度 2019-2021 面试真题解析,并且把每个技术点整理成了视频和 PDF(知识脉络 + 诸多细节)。
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝 offer 的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事 IT 行业的老鸟或是对 IT 行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事 IT 行业的老鸟或是对 IT 行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!*
[外链图片转存中…(img-UMEJgU9x-1712605449724)]
原文地址: Android 可能你想要的 APK 瘦身笔记,html5 在移动端开发优势更明显