2M-APK瘦身实测可行又便捷的方法 (应用上架 阵前磨枪)

2023-12-18 12:59

本文主要是介绍2M-APK瘦身实测可行又便捷的方法 (应用上架 阵前磨枪),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

新项目上线,新应用原始apk大小在6.9M左右,然后公司和第三方运营公司合作,加入其提供的第三方SDK,瞬间apk体积增大3M;接着为了应用上线后的安全性,对应用进行了加固处理,套了一层壳之后,应用又增大了1.7M,最后上线之前包的体积已经超过10M,计算器这一工具类的应用包体积超过10M就没有很强的竞争力了,所以减小包体积的工作势在必行。

下面是博主实际运用到的一些方法,没有囊括所有的方案,但都是有效的方案:

1).删除项目中无用的资源

Menu - >Refactor ->Remove unused resources

AS搜索一段时间之后会在下方弹出提示框,点击“do refactor”就可以将项目中无用的资源文件全部清除,包括图片,各种xml文件。注意:机器没有智能到那种程度,所以直接删除可能会导致一些错误,使得之后编译不通过,所以建议在直接删除之前使用快捷键“alt + F7”检查该资源文件在项目中使用的地方,确定确实无用之后在进行删除。

2).清除项目中无用的import包

Menu - >Code ->Optimize Imports  | 项目根目录下右键->Optimize Imports

以上是直接去掉整个项目中的import包,若在某个文件中去除可使用快捷键“ctrl+alt+o”。

也可在设置里直接设置为自动清除无用的import包(可自动导入包,当然也可以设置为自动删除包)。

Setting - >Editor - >General - >Auto Import - >Optimize imports on the fly

以上两步操作完之后,整个应用包减小0.7M。

3)包体分析 (Android Studio 2.2以上)- 从内到外了解

Menu - >build->Analyze APK

①lib/ -> 存放so文件,可能会有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持armabi与x86的架构即可,如果非必需,可以考虑拿掉x86的部分;

②res/ -> 存放编译后的资源文件,例如:drawable、layout等等;

③assets/ -> 应用程序的资源,应用程序可以使用AssetManager来检索该资源;

④META-INF/ -> 该文件夹一般存放于已经签名的APK中,它包含了APK中所有文件的签名摘要等信息;

⑤classes(n).dex -> classes文件是Java Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式;

从上图apk 分析后可以看到占用空间多的主要是代码、图片、资源和lib和assert文件,主要方向精简代码、压缩图片、去除无用的库、减少asserts里面文件。

AndroidManufest.xml ->最终应用请求了哪些权限,不管是主项目工程的还是外部库的,最终以打出来的apk中申请的权限为准,通过analyse apk,可以准确地知道应用到底申请了哪些权限。

有了方向之后,那么开始进行瘦身:

a.asserts文件夹内去除占用空间较大的字体文件,既使得包的体积减小(一个字体文件100-200k),又使得应用字体变得更为统一;

b.开启资源压缩

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

minifyEnabled 设为true时会自动对代码进行清理,打包时去掉无用的代码部分,注意此时编译速度会受到影响(所以release包打包速度比debug包要慢一些);

shrinkResources设为true时打包会自动根据minifyEnabled 为true时去掉的代码部分再次去掉该代码部分相关的资源文件部分,注意二者是配合使用的。

注:build.gradle中配置二者时只是在打包文件中去掉了无用的部分,项目中还是实际存在的。

c.语言资源优化,原项目中产品经理要求配置三种语言:中文 英文 法语,最终上线前为包体积做考虑,只启用英语一门语言配置(应用是发布在谷歌应用市场)。

android {...defaultConfig {...resConfigs "en"}...
}

如果不做任何配置的话,最终APK包中会包含项目中所有已翻译语言字符串,无论应用的其余部分是否翻译为同一语言,可以通过resConfig来配置使用哪些语言,从而让构建工具移除指定语言之外的所有资源。

d.图片压缩,原本项目中使用的图片都是32*32的png图片,后来为清晰度的考虑将图片同一替换成72*72的png,结果每张图片都有200k左右,这里推荐使用tinypng网站进行图片无损压缩,下面这张图从190k压到1.6k,肉眼基本看不出任何区别;

这两张图标 一张被压缩了97%,你相信吗?

e.优化classes.dex,这里无定式方法,主要是提供一些思路 —— 时刻保持良好的编程习惯和对包体积敏锐的嗅觉,去除重复或者不用的代码,慎用第三方库,选用体积小的第三方SDK等等。

以上四步操作完之后,整个应用包减小0.5M。

4)APK瘦身放大招 - AndResGuard的使用

①概念:AndResGuard是一个缩小APK大小的工具,它的原理类似Java Proguard,但是只针对资源。它会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a(是的,如同混淆一样的abc,通过进一步混淆res资源夹来减小包体积)。

②配置

项目根目录下build.gradle中,添加插件的依赖:

 dependencies {classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'}

项目根目录中build.gradle中,再添加白名单配置:

apply plugin: 'AndResGuard'
buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.0.1'classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'}
}andResGuard {mappingFile = nulluse7zip = trueuseSign = truekeepRoot = falsewhiteList = [// your icon"R.drawable.icon",// for fabric"R.string.com.crashlytics.*",// for umeng update"R.string.tb_*","R.layout.tb_*","R.drawable.tb_*","R.drawable.u1*","R.drawable.u2*","R.color.tb_*",// umeng share for sina"R.drawable.sina*",// for google-services.json"R.string.google_app_id","R.string.gcm_defaultSenderId","R.string.default_web_client_id","R.string.ga_trackingId","R.string.firebase_database_url","R.string.google_api_key","R.string.google_crash_reporting_api_key",//友盟"R.string.umeng*","R.string.UM*","R.layout.umeng*","R.drawable.umeng*","R.id.umeng*","R.anim.umeng*","R.color.umeng*","R.style.*UM*","R.style.umeng*",]compressFilePattern = ["*.png","*.jpg","*.jpeg","*.gif","resources.arsc"]sevenzip {artifact = 'com.tencent.mm:SevenZip:1.2.10'}
}

其中whiteList(白名单)中指定不需要进行混淆的资源路径规则,主要是一些第三方SDK,因为有些SDK的代码中引用到对应的资源文件,如果对其进行混淆,会导致找不到对应资源文件,出现crash,所以不能对其资源文件进行混淆。由于公司的项目中使用到了友盟和融云,所以将这两个SDK加入白名单,更多的白名单可以查看:

AndResGuard白名单

③build.gradle文件中添加签名文件等信息

    signingConfigs {release {keyAlias 'popstar'keyPassword 'popstar'storeFile file('star.jks')storePassword 'popstar'}}buildTypes {release {minifyEnabled trueshrinkResources truesigningConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}

④打包

不再使用AS自带打包方法,而是使用gradle的打包方法,AS右侧点击Gradle打开Gradle任务列表:

打release包,只需要双击resguardRelease,开始打包(时间较长),执行完毕后,可以在app目录下的/build/output/apk/release/AndResGuard_{apk_name}/ 文件夹中找到混淆后的Apk,其中app-release_aligned_signed.apk为进行混淆并签名过的apk。

双击查看该apk,再次打开res文件夹就会发现所有的文件名都已经再次混淆了。

操作完这一步之后,整个apk减小了0.8M

有疑问的读者可以自行查看库文档 AndResGuard中文文档

 

通过以上的一些apk瘦身常用方法,最终包减小了2M左右,值得一提的是,如果使用一种瘦身方法没有明显的效果时,就可以放弃再寻找其他方法,不要死磕(别问我为什么这样说)。

PS:临时抱佛脚,应用上架前被附加了那么多东西,然后才开始做apk瘦身,博主多少有些无奈。不过学到了很多!以后不会被弄的手忙脚乱的了。

 

2020/06/02 补充:

如果按照上述步骤,使用微信压缩库时出现打包错误如下:

parse to get the exist names in the resouces.arsc first
com.tencent.mm.androlib.AndrolibException: Could not decode arsc file
at com.tencent.mm.androlib.res.decoder.RawARSCDecoder.decode(RawARSCDecoder.java:74)
at com.tencent.mm.androlib.ApkDecoder.decode(ApkDecoder.java:190)
at com.tencent.mm.resourceproguard.Main.decodeResource(Main.java:96)

原因在于升级后,系统默认升级了buildToolsVersion版本到28.0.3。从而导致对资源的解码出现问题。项目当前buildToolsVersion版本为27.0.3,直接去除,采用AGP对应的默认buildToolsVersion版本配置。

同时,AndResGuard最新版本已经解决了此问题,直接升级1.2.10版本到当前最新版本。

classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'

博主亲测,解决问题。

解决办法取自文章《项目Gradle版本从4.4升级到4.6》

这篇关于2M-APK瘦身实测可行又便捷的方法 (应用上架 阵前磨枪)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508449

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验