【适合小白】Apk精简优化详细教程(搬砖)
本帖最后由 景寒杏 于 2021-9-25 17:13 编辑来论坛一年了,这是我的第一篇教程贴,如有错误,请诸位不吝赐教。在此谢过了undefined
本文大部分摘自CSDN的这篇
https://blog.csdn.net/AndroidAlvin/article/details/103159561
另外还有mt官方文档
还有其它各种文档参考及个人经验,,
总结了这么一篇适合小白的教程。。
闲言少叙,下面是正文
在精简apk之前,首先要了解一下它的结构。
1.结构分析
APK包结构如下:
lib/
so库存放位置。
so库文件分为不同的CPU架构,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因。
res/
资源文件夹,包含着图片、布局、菜单等文件,resources.arsc 中索引的文件均存放在该目录中(进行过资源混淆的除外)。
assets/
副资源文件夹。
META-INF/
包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
resources.arsc
资源配置文件,包含着字符串、主题、图片文件索引、布局文件索引等信息
classes.dex
包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
AndroidManifest.xml
应用清单文件,版本号、版本名称、权限、应用名称、应用图标、活动、服务、广播等配置信息,均在这个文件中。该文件使用Android的二进制XML格式。
在这些文件中,除了META-INF/其它都是本文的精简对象
下面正式开始
1. 对lib目录下的文件进行瘦身处理
如果我直接告诉你只留下 armeabiv-v7a 文件夹就行是很不负责任的
如果你感兴趣,可以往下看
参考一下
armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它。
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
armeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).目前这两款处理器的手机设备占比太少。
而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。
最后总结一点:如果适配版本高于4.1版本,可以只留下armeabiv-v7a,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。
so,,,,只留 armeabiv-v7a,,没错的undefined
(至于能省下多大空间,因应用而定)
另,,,如果有termux
[*]uname -m
复制代码
可以查看你手机的cpu框架类型
当然还有进阶玩法--精简so文件,,只保留有用的核心代码,,但是,我不会undefined
2. 精简res/asstes
①删除asstes里的广告插件
主要有bdx开头的压缩包(百度)
和
gdt_开头的文件夹(腾讯)
②使用图片压缩工具对图片进行压缩。
(注:在压缩前要先看一下,不能预览的不要动)
例:
使用tinypng有损压缩
TinyPNG工具只支持上传PNG图片到官网上压缩,然后下载保存,在保持alpha通道的情况下对PNG的压缩可以达到1/3之内,而且用肉眼基本上分辨不出压缩的损失.
Tinypng的官方网站:http://tinypng.com/
注意:图片在打包时已经进行过无损压缩了,,故进行无损压缩是没有任何效果的。
③使用音频压缩工具对音频进行压缩。
(注:在压缩前要先看一下,不能播放的不要动)
④还可以删除abc_开头的图片文件,,
(这种一般都是自动生成的,开发者也不会调用)
[*]abc_*.png
复制代码
正则搜索删除。
另:如果有能力,可以尝试把非透明 png 格式大图片转换为 jpg 格式,效果显著!
等等。。
3. 减小classes.dex大小
脱壳的就删无用类,,比如某数字删stub和jg
(mt新版可以一键去除调试信息,下面留作纪念)
(感谢@快乐小牛的提醒~来自545楼)
,,,,,,,,,,,,,,,,,,,,,
删掉dex里的.line x和.prologue也是个不错的方法,听说proguard工具可以一键,,但我不会
留下我的方法
①全dex代码搜
[*].prologue
复制代码,全部替换即可(替换什么都不要填,强迫症可以填个空格)
②然后就是.line ,这个比较麻烦,因为有一到几千,,所以用正则匹配
[*]\.line .+
复制代码
全dex搜索代码,,记得勾正则
虽然意义不大,但也有一定的效果,,而且可以增加dex对比的难度
4月1日补充:有人反应不能保存 (报错) 的问题,猜测是工作量太大导致mt编译出错,,关闭弹窗,然后再保存一遍就好啦。(详见43页)
如果还是不能解决,就别搞了。。编译的太多,手机带不动。。。强迫症可以一个dex一个dex删
,,,,,,,,,,,,,,,,,,,
高级一点的就是剥离广告sdk,由于我不会,就不多说了。undefined
还有就是用工具,比如proguard,,自行百度
4. 精简 resources.arsc
我有点懒,不多说了,
官方文档有详细教程
路径:逆向功能 - 简单实战 - 汉化应用 - 精简语言包
另附(特别感谢@小狗巧巧):
[答疑解惑]为什么arsc越精简越大?
5.精简AndroidManifest.xml
这个我真的不会说,删掉无用activity 广播service啥的就可。
用activity 举个例子。
[*]<activity开头............xxxx........../>或者</activity>结尾
复制代码
这个是通用的,,建议去设置里开启 显示空白符,一般都是删八个点开头,八个点结束的一段。
常见的广告关键词有
[*]
[*]qq.e(腾讯)
[*]ads.(通用)
[*].ad.(大部分是应用内置)
[*].mobad.(百度)
[*].mobads.(百度)
[*].bytedance.(穿山甲,今日头条旗下)
[*].ss.(穿山甲,和上一个在一块)
[*](如果软件有其它功能和今日头条合作)
[*](删 错 会导致闪退)
[*](建议备份后再删除测试)
[*]
[*].bytedance.sdk.openadsdk.
[*](已确定是穿山甲广告)
[*]
[*]sdk(带有huawei,xiaomi,meizu,vivo , push等 字样的删)
[*]
[*]还有 taobao, liulishuo, weibo 这些等等,自行判断
[*]
[*]
[*]push.(通知推送)
[*]
复制代码
注:push请根据实际情况删除,,一般破解软件通知推送什么的根本不需要。
(4月26号补充:对不起诸位,我没有说清楚,,把自己的习惯带了进去,其实SDK有讲究的,,比如weibo的sdk删了会导致无法用微博登陆和分享,删淘宝可能会导致无法调用淘宝,
删带有手机型号的可能会导致无法使用手机运营商相关的服务,比如无法使用通知推送,无法调用应用商店更新,等等
再比如删alipay可能导致无法调用支付宝支付,,这些请自行判断)
(因为我平时是不在乎的,通知推送什么的,没有才好。微博本人也不用。。所以没有注明,抱歉,现在补上)
再次声明
本文大部分节选自CSDN的这篇
https://blog.csdn.net/AndroidAlvin/article/details/103159561
及mt官方文档
还有其它各种文档参考及个人经验,,
花了很长时间才写好,,有用的记得给个免费的好评!undefined
。。。THE END。。。
@MiBStudio 来看看啊undefined
(现在叫小狗巧巧undefined)
补几张图,顺序乱了,凑合看吧undefined
补充:关于为什么不能预览/播放的文件不要压缩,
举个例子,吃鸡游戏的安装包里有一个图片文件,1g多的地图,当然不能压缩。
人脸识别的配置文件就是mp3格式,也不可压缩
总结:只能压缩可以查看的文件
https://oss2-bbs.mt2.cn/forum/202003/23/182831jxjtni5bnpn5xg5x.png
原作者:白又白 支持,楼主辛苦了。。。学习一下 精简了也没什么太大的用处 支持一下,来看看怎么操作,学习中 很详细的教程 感谢分享,这是好东西!! 很详细的教程。 教程还能再详细一点吗?sdk具体例子 感谢分享66666,学习一下 先收藏,国庆有时间再学些,谢谢楼主