APP终极瘦身方案

具体可参见 github.com/shwenzhang/…

优化META-INF

MANIFEST.MF:是摘要文件,程序会遍历apk包中所有的文件,对非文件夹、非签名文件的文件,逐个编码生成摘要信息,并记录于此。如果逆向修改了任何文件,那么将出现文件和摘要信息不匹配的情况,导致安全校验失败。每一个资源文件都有一个sha1-digest的值,为该文件sha-1的值进行base64编码后的结果。

CERT.SF:是对MANIFEST.MF的签名文件,经过三步生成:

  • 1、系统会把MANIFEST.MF整个文件进行sha1计算,并且计算base64编码后的值。

  • 2、系统会对MANIFEST.MF中的每一条内容分别进行sha1计算,然后再用base64编码。

  • 3、上述两部完成后,系统会将内容写入到CERT.SF文件中。

可以这样理解CERT.SF的作用:

  • 该文件是MANIFEST.MF的二次编码后产生的文件。

  • 如果逆向修改了任何文件,则MANIFEST.MF文件必定会发生改变,从而和CERT.SF不匹配。

  • CERT.SF二次编码的特点是用于在APK安装时校验MANIFEST.MF是否被篡改

  • 若根据修改的文件伪造了一份新的CERT.SF文件,那么数字签名值必定与CERT.RSA中的记录不一样

CERT.RSA:包含了公钥和加密算法等信息,而最重要的信息是“对CERT.SF用私钥进行加密之后的值”。

META-INF文件夹下的文件环环相扣,总结如下:

  • 如果逆向修改了APK包中的文件,那么被修改的文件的摘要和MANIFEST.MF中的信息则不对应

  • 如果修改了某个文件,则必须修改MANIFEST.MF中对应的摘要值,必须保证对应关系

  • 要修改MANIFEST.MF的摘要值,会产生新的MANIFEST.MF,必然和CERT.SF中的记录不匹配

  • CERT.SF中记录了MANIFEST.MF整个文件的编码和其所有内容的编码值,逆向时必须修改CERT.SF

  • 修改了CERT.SF后,安装apk时CERT.RSA文件中的内容和修改后的CERT.SF会不匹配,出现安装失败

  • 逆向者只有拿到了开发者的秘钥才能完全创造一个相同的apk

优化建议:通过分析得出,除了RSA没有缩减机会外,其余两个文件都可以通过混淆资源名称的方式进行压缩。

优化Res目录
  • 打包时剔除无用资源:shrinkResources true shrinkResources意思是收缩资源,将它设置为true,每次打包时就会自动排除无用的资源,不仅作用于图片,还会清理无用的layout资源等,但是只有配合开启混淆才能生效。

  • 删除无用的语言:大部分app其实不需要支持几十种语言,国内应用,可以只支持中文

defaultConfig {

resConfig “zh”

}

这样配置后,打包时会排除私有项目、Android support库、三方库中的非中文资源文件。

  • 控制raw中的资源大小:Raw和Assets可以用来存放资源,但两者有以下差异:
  1. Assets目录允许下面有多级子目录,而Raw不允许存在字目录结构。

  2. Assets目录不会产生R文件,Raw则相反

  3. 因为Raw文件会产生R文件的映射,所以可以被lint分析,而Assets不能

  4. Raw不支持子目录让其无法成为存放多种类文件的目录

Raw虽然不会对文件大小有限制,但是存放的音频文件尽量不要使用无损格式,可以考虑同等质量但文件更小的音频格式,如OGG、wav、mp3等格式

减少layout文件

减少layout有两个方法:复用和融合。

复用:把一些页面共用的布局抽出来,这对于layout文件的管理还是瘦身都非常有用。

融合:对于不会被复用的layout呢?

  • shatter是一个类似于Fragment的解耦库,可以为同一个layout中不同区域的view进行逻辑解耦,还可以尽可能少的建立layout文件。

  • 将没有必要复用的header头布局和ListView/RecycleView放在同一个layout布局中,通过代码完成头部的添加

动态下载图片

贴纸、表情这类的文件是相当大的,对于这类图片资源,强烈建议通过在线的方式获取,虽然有一点的复杂度和出错率,但是投入产出比还是不错的。

分目录放置图片

不同分辨率的图片应该放在不同的目录中,如果放错了,对于app运行时的内存大小会有一定的影响。

如果把一个本来应该放在drawable-xxhdpi里面的图片放在了drawable文件夹中,会出现什么问题呢? 在xxhdpi设备上,图片会放大3倍,图片内存占用会变为原来的9倍。

因为不同分辨率的图片大小有差距,很多认为可以使用一套图片来做,不用多套图,借此达到瘦身的目的。但谷歌建议针对不同分辨率出不同的图片。 比较通用的做法是:

  • 聊天表情就出一套图,放在hdpi中(因为此类图片对于清晰度要求不高)

  • 纯色小icon用svg制作,用矢量图适配所有分辨率

  • 对于背景图等大图,出一套放在hdpi或者xxhdpi中

  • logo等权重较大的图片可针对hdpi、xhdpi、xxhdpi做多套图

  • 如果某些图在真机中展示异常,就用多套图适配

  • 如果有特殊机型,可针对性的补图

优化图片资源

图片的优化,最重要的是知道选择什么样的图片格式。

  • 如果是纯色的icon,推荐使用svg

  • 如果是两种以上颜色的icon,推荐使用webp

  • 如果webp无法达到效果,则选择用png

  • 如果图片没有alpha通道,则考虑使用jpg

  • 因为svg是通过xml描述的,所以可以享受到资源优化和代码压缩,通常可以压缩到1kb

  • 对于无透明度的大图,可以换为jpg格式进行有损压缩

webp格式从4.0开始原生支持,知道4.2.1才支持显示含有透明度的webp,一般png转换为webp,大小可以减少一半

另外,在大型项目中,会引入汗多support库以及三方库,如果库中包含一些大图,并且不会用到的话,可以用1x1的同名透明图片替代,达到技能编译通过,又能缩小体积的目的。

针对动画,尤其是帧动画,一直是相当占用资源的,现在可以使用svg动画或者Airbnb公司的Lottie动画库实现,如果使用Lottie可以直接使用json文件描述动画,图片会减少很多。

优化dex

dex文件是class文件被编译后可供art虚拟机理解的文件格式,可以理解为java代码包。

利用lint分析无用代码

可以借助Inspect Code,对工程做静态代码检查。Lint是一个强大的工具,它能做的事情不限于检查无用资源和代码,它能检测丢失的属性、写错的单位、会引起内存溢出的代码等,当然Lint虽然强大,但也会带来一些缺点,就是生成的信息量过大,不适合快速定位无用的代码。除此之外,Lint会提示不要使用枚举方法,如果将枚举变为int,apk的大小也会缩小一些,没减少一个enum,可以减少大约1到4kb的大小。

image.png

删除R文件

Android中的R文件,除了styleable类型外,所有的字段都是int型变量或者常量,且在运行期间都不会改变。可以在编译时记录R中所有字段的名称以及对应值,然后利用ASM工具遍历所有class,将引用R字段的地方替换成对应的常量 ThinRPlugin插件可以方便地将R.xxx的地方替换为具体值,可以减少一部分dex大小。

在最外层的build.gradle中加入如下依赖:

classpath ‘com.mogujie.gradle:ThinRPlugin:0.0.2’

在内层的gradle文件中加入如下代码:

apply plugin: ‘thinR’

thinR {

//为了不影响日常开发的编译速度,debug版本可以不用删除R

skipThinRDebug = true

}

启用ProGuard:

ProGuard是一款优秀的代码优化、混淆工具,适用于java和Android。关于ProGuard,最需要了解的是它的方法检测机制。它将产出的class作为输入,然后寻找代码中所有的调用点,计算出代码中可达的调用关系图,然后移出剩余的部分,将真正用到的方法变量保留下来进行优化,最终输出一个新的class。

image.png

上图简单描述了什么是可达和不可达的代码

buildTypes {

release {

minifyEnabled true

shrinkResources true //压缩资源

proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’

}

}

虽然这种​
方式成果显著,但也要配合正确的ProGuard规则才能起作用。

image.png

这张图展示了原始apk和混淆后apk的大小差异

每次构建时,ProGuard都会输出下列文件:

  • dump.txt:说明APK中所有类文件的内部结构

  • mapping.txt:提供原始与混淆过的类、字段、属性、方法之间的映射关系

  • seeds.txt:列出未进行混淆的类和成员

  • usage.txt:列出从apk中移除的类和代码

利用混淆来删除代码的方式是一种保险措施,真正治本的方法是在开发过程中随手删除无用的代码。

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
是一种保险措施,真正治本的方法是在开发过程中随手删除无用的代码。

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-HmvSa9dR-1719087128977)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

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

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

相关文章

(2024.6.23)最新版MAVEN的安装和配置教程(超详细)

1.什么是MAVEN Maven是一个自动化构建工具,主要用于Java项目,它由Apache软件基金会维护。Maven能够自动化完成编译、测试、打包、发布等构建过程,可以大大提高开发效率,保证项目的质量。 下面我们从几个方面来介绍一下MAVEN的功能…

【嵌入式Linux】i.MX6ULL 时钟树——理论分析

文章目录 0. 时钟树结构0.1 参考手册 Chapter 18​: Clock Controller Module (CCM)0.2 时钟信号路径 1. 时钟源——晶振1.1 外部低频时钟 - CKIL1.1.1 CKIL 同步到 IPG_CLK 解释 1.2 外部高频时钟 - CKIH 和 内部振荡器1.3 总结1.4 缩写补充 2. PLL时钟2.1 i.MX6U 芯片 PLL 时…

八爪鱼现金流-025-工作的终极目标,不是为了成为更好的员工

工作的终极目标,不是为了成为更好的员工。 而是解放时间和收入自动化 打造自己的被动收入!!! 八爪鱼现金流 八爪鱼

CMMM Plus+ Calculus Update 超级游戏大作 游戏说明

资源链接 关卡编辑器 ◽️使用 WASD 移动视图。 ◽️LMB 放置单元格。 ◽️Space LMB 删除单元格。Ctrl Space LMB 删除所有相同类型的单元格。 ◽️Q / E 旋转单元格。 ◽️Z / X 在单元格类别之间切换。 ◽️键 1-9 快速选择单元格。 ◽️按 F 显示可拖动的图块。 ⌨️控…

会声会影2024永久破解和谐版下载 包含激活码序列号

亲爱的创作伙伴们,今天我要分享一个让我的影视编辑生活大放异彩的神器——会声会影2024破解版本!🎉🌟 🌈**功能全面升级**:作为一款专业的视频编辑软件,会声会影2024破解版本不仅继承了之前版本…

Springboot应用的信创适配

CentOS7在2024.6.30停止维护后,可替代的Linux操作系统-CSDN博客 全面国产化之路-信创-CSDN博客 信创适配评测-CSDN博客 Springboot应用的信创适配 Springboot应用的信创适配,如上图所示需要适配的很多,从硬件、操作系统、中间件&#xff08…

人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展|顶刊速递·24-06-23

小罗碎碎念 本期推文主题:人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展 这一期的推文是我发自内心觉得为数不多,特别宝贵的一篇推文,原因很简单——可参考的文献相对较少&方向非常具有研究意义&现在不卷。 数字病理…

Vue3+TypeScript项目实战——打造雨雪交加的智慧城市

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

三国之家网站的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,公告管理,三国视频管理,基础数据管理,三国图文管理 前台账户功能包括:系统首页,个人中心&#…

从工具产品体验对比spark、hadoop、flink

作为一名大数据开发,从工具产品的角度,对比一下大数据工具最常使用的框架spark、hadoop和flink。工具无关好坏,但人的喜欢有偏好。 目录 评价标准1 效率2 用户体验分析从用户的维度来看从市场的维度来看从产品的维度来看 3 用户体验的基本原则…

《人生苦短,我用python·四》pybind11多场景使用

引言 Pybind11作为一个强大的工具,不仅可以轻松地将简单的C函数和类暴露给Python,还可以处理更复杂的场景,比如支持C标准库容器、处理C异常、以及自定义数据结构的转换。本文将深入介绍Pybind11的一些高级用法,帮助你在实际项目中…

将WIN10的wifi上网分享给以太网接口

目录 打开网络设置设置属性点这里的设置将wlan主机的以太网接口IP设为自动获取 如果连接不成功,拔网线重连一次 打开网络设置 设置属性 点这里的设置 将wlan主机的以太网接口IP设为自动获取 如果连接不成功,拔网线重连一次

IOS开发学习日记(十六)

目录 App间的唤起和通信 App跳转 通过Scheme唤起其他App Universal Link 组件化 App间的唤起和通信 App跳转 使用URL Scheme支持App启动、跳转及参数传递 分享 / 登陆 / 拉起App Store等 设置URL Type 在UIApplication中处理参数和业务逻辑 -(BOOL)application:(UIApp…

Vue73-命名路由

一、路由的name属性 二、小结

stm32使用time模块输出pwm波,stm32-matlab开发电机控制

simulink: stm32cubemx : 注意在stm32配置了两路的一个互补输出,但实际上在matlab里只需要给定占空比就行了,他会自动输出互补,驱动电机,这是因为有点的电机输出需要6路,有的只需要1路,我们看下图就知道了…

一些3D数据集的简单介绍

一、Objaverse 1.0 Objaverse 1.0: a large dataset of objects with 800K (and growing) 3D models with descriptive captions, tags and animations. Assets not only belong to varied categories like animals, humans, and vehicles, but also include interiors and ex…

MySQL之复制(十三)

复制 复制的问题和解决方案 在主-主复制结构总写入两台主库 试图向两台主库写入并不是一个好主意,如果同时还希望安全地写入两台主库,会碰到很多问题,有些问题可以解决,有些则很难。一个专业人员可能需要经历大量的教训才能明白…

“Driver not loaded“问题解决方案

这两天又碰到了离谱的,愚蠢的,莫名其妙的,丧尽天良的错误。 之前已经解决过这个问题。这几天又碰上了,明明都已经把相应的dll放到了exe的同级目录,NND还是有问题!!!卡了我一个晚上加…

c库函数:strrchr使用demo案例

1. strrchr库函数说明 头文件 <string.h> 函数形式 char *strrchr( const char *str, int ch ); 功能 在str所指向的空终止字节串中寻找字符ch的最后出现。 参数 str - 指向要分析的空终止字节字符串的指针 ch - 要搜索的字符 返回值 指向 str 中找到的字符的…

Emacs之实现目录替换(一百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…