2024年【Android优化】APK包资源精简,立减1M,2024年最新配电面试题目

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2019-2021字节跳动Android面试历年真题解析》

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

从原理上分析,这种查找无用资源的方式是可行的,只是需要稍微改动。默认情况下shrinkResources是安全模式,可能会被使用的资源也被标记为了可达;关闭安全模式,开启严格模式,只有真正通过代码或是资源文件引用的资源才被标记为可达。混淆配置添加**-dontshrink -dontoptimize**,系统是分析混淆后的类,如果一个类被压缩掉了,它引用的资源就会被标志为不可达,这时候如果仅仅删除资源,后续就编译通不过了。

res目录中添加keep.xml,设置严格模式。

经过上述配置改动后,重新编译查看输出文件,可以看到大量的无用资源。打包过程是将其替换为了一个同名的空文件,但我们可以解析这个文件,找到无用资源,用脚本批量删除。

头条app客户端原始15M,通过脚本批量删除了600+资源,包大小减小0.47M。不同项目效果不同。

重复资源精简

Android开发推崇根据业务拆分多个模块,模块间为了防止资源覆盖,会给每一个模块的资源加一个前缀,同样的资源就会在apk包中出现多次。阅读微信资源混淆源码时发现,它将每个资源Chunk中的资源路径替换为了一个较短的路径。那么对于重复资源,仅仅保留一份,修改arsc文件,重定向Chunk对应的资源路径,就可以解决重复资源问题。

打包过程中ProcessAndroidResources这个Task会生成资源文件**/build/intermediates/res/resources-release.ap_,该文件是一个zip文件,解压后包括AndroidManifest.xml,res,resources.arsc几部分。res目录中的文件即是最终要打入到apk中的,resources.arsc即为最终的arsc**文件。

解压ap_文件,遍历res目录中的文件,根据每个文件的md5值,找出重复的文件。最终发现主要有两种重复的情况,一种是文件名相同,但在不同的dpi目录下;一种是内容相同,名字不同。删除重复文件,保留一份,然后利用ChunkUtil这个库来修改arsc文件,ChunkUtil是一个arsc编辑库。

重复资源处理,作为一个gradle插件,后续会开源给大家作为参考。

重复资源处理后,资源映射如下所示,每个资源代码一个chunk,假如以下3个chunk中的资源相同,则处理后它们会指向相同的路径。

经过打包期间删除重复资源,共删除了300+资源,包大小减小了0.28M,不同的项目效果不同。

重复资源处理与微信资源混淆冲突

项目中如果使用了微信资源混淆,打包失败。如果你的项目中没使用微信资源混淆,就没必要看后面的问题了。

根据错误堆栈可以定位到微信资源混淆出现的位置。阅读微信资源混淆源码,发现映射关系如下:从res/drawable/icon.pngr/a/c.png是一一映射的。每个资源路径可变的有两部分,一是资源类型如drawablecolor;另一个是资源名称。映射过程有以下规则,同类型资源会映射到相同目录中,资源id相同也即是同名资源映射后的资源名相同。如下图中,资源1和2是名字相同,映射后的名字都是c.png,资源2和资源3资源类型相同,映射后的资源都在r/b目录下。

这时候将重复资源处理和微信混淆流程串联起来如下所示:

资源1和资源2映射后的目标路径相同。微信资源混淆会遍历每个chunk,把每个chunk中的资源从原始目录copy到目标目录并重新命名为映射后的文件,copy前check目标文件是否存在,如果存在会出现上述错误。

微信资源混淆的目标路径映射规则是根据id值映射的,不是根据原始路径。因此我们需要改变默认的映射规则,如果原始路径相同,则映射到相同的目标路径,并且不做后续的copy工作。修改了映射逻辑后,资源3最终映射的路径也变为了r/a/c.png

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值