如何在10分钟内让Android应用大小减少 60%?
一个APP的包之所以大,主要包括一下文件
- 代码
- lib
- so本地库
- 资源文件(图片,音频,字体等)
瘦身就主要瘦这些。
一、打包的時候刪除不用的代码
buildTypes { debug { ... shrinkResources true // 能否去除无效的资源文件(假如你的Debug也需要瘦身) } release { ... shrinkResources true // 能否去除无效的资源文件 } }
二、减少不必要的打包
defaultConfig { ... //打包的语言类型(语种的翻译) resConfigs "en", "de", "fr", "it" //打包的文件夹 resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"}
或者者
android { ... splits { density { enable true exclude "ldpi", "tvdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' //reset() //include 'x86', 'armeabi-v7a', 'mips' //universalApk true } }
三、lib
尽量不用太复杂的lib,轻量级lib是首选。假如你的应用没用到兼容库,可以考虑去掉support包。
四、资源文件
我们可以通过Lint工具找到没有使用的资源(在Android Studio的“Analyze”菜单中选择“Inspect Code…”)
五、把现有图片转换为webP
我们可以通过 智图 或者者isparta将其它格式的图片转换成webP格式,isparta可实现批量转换。
五、图片相关
- 在Android 5.0及以上的版本可以通过tintcolor实现只提供一张按钮的图片,在程序中实现按钮反选效果,前提是图片的内容一样,只是正反选按钮的颜色不一样。
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
- 在Android 5.0及以上的版本,可以使用VectorDrawable和SVG图片来替换原有图片
六、混淆
1 构建多个版本
- 在gradle中的buildTypes中添加不同的构建类型,使用
applicationSuffix
和versionNameSuffix
可以生成多个版本在同一设施上运行 - 创立
src/[buildType]/res/
设置不同的ic_launcher以区别不同版本
2 混淆参数
{ debug { minifyEnabled false } release { signingConfig signingConfigs.release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}
minifyEnabled true
- 能否要启用通过 ProGuard 实现的代码压缩(true启用)
- 请注意,代码压缩会拖慢构建速度,因而您应该尽可能避免在调试构建中使用。
注:Android Studio 会在使用Instant Run时停用 ProGuard。
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
getDefaultProguardFile(‘proguard-android.txt’)方法可从 Android SDKtools/proguard/文件夹获取默认 ProGuard 设置。
提醒:要想做进一步的代码压缩,可尝试使用位于同一位置的proguard-android-optimize.txt文件。它包括相同的 ProGuard 规则,但还包括其余在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。
proguard-rules.pro文件用于增加自己设置 ProGuard 规则。默认情况下,该文件位于板块根目录(build.gradle文件旁)。
要增加更多各构建变体专用的 ProGuard 规则,请在相应的
productFlavor
代码块中再增加一个proguardFiles
属性。例如,以下 Gradle 文件会向flavor2产品风味增加flavor2-rules.pro。现在flavor2使用所有三个 ProGuard 规则,由于还应用了来自release代码块的规则。每次构建时 ProGuard 都会输出下列文件
dump.txt
说明 APK 中所有类文件的内部结构。mapping.txt
:提供原始与混淆过的类、方法和字段名称之间的转换。seeds.txt
:列出未进行混淆的类和成员。usage.txt
:列出从 APK 移除的代码。这些文件保存在/build/outputs/mapping/release/
。要修正错误并强制 ProGuard 保留特定代码,请在 ProGuard 配置文件中增加一行-keep代码。例如:
-keeppublicclassMyClass您还可以向您想保留的代码增加[@Keep]
(https://developer.android.com/reference/android/support/annotation/Keep.html)注解。在类上增加@Keep可原样保留整个类。在方法或者字段上增加它可完整保留方法/字段(及其名称)以及类名称。请注意,只有在使用注解支持库时,才能使用此注解。在使用-keep选项时,有许多事项需要考虑;如需理解有关自己设置配置文件的详细信息,请阅读ProGuard 手册。问题排查一章概述了您可能会在混淆代码时遇到的其余常见问题。
请注意,您每次使用 ProGuard 创立发布构建时都会覆盖mapping.txt文件,因而您每次发布新版本时都必需小心地保存一个副本。通过为每个发布构建保留一个mapping.txt文件副本,您即可以在客户提交的已混淆堆叠追踪来自旧版本应用时对问题进行调试。
在每次增加库的时候,需要及时进行make a release build
DexGuard时Proguard同一个团队开发的软件, 优化代码,分离dex文件从而处理65k方法限制的文件
关于proguard-android.txt文件:
-dontusemixedcaseclassnames: 表示混淆时不使用大小写混淆类名。
-dontskipnonpubliclibraryclasses:不跳过library中的非public方法。
-verbose: 打印混淆的详细信息。
-dontoptimize: 不进行优化,优化可能会造成少量潜在风险,不能保证在所有版本的Dalvik上都正常运行。
-dontpreverify: 不进行预校验。
-keepattributes Annotation :对注解参数进行保留。
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService:
表示不混淆上述公告的两个类。
proguard中一共有三组六个keep关键字的含义
keep 保留类和类中的成员,防止它们被混淆或者移除。keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。keepclassmembers 只保留类中的成员,防止它们被混淆或者移除。keepclassmembernames 只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。keepclasseswithmembers 保留类和类中的成员,防止它们被混淆或者移除,前提是指名的类中的成员必需存在,假如不存在则还是会混淆。keepclasseswithmembernames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必需存在,假如不存在则还是会混淆。
keepclasseswithmember和keep关键字的区别:
假如这个类没有native的方法,那么这个类会被混淆
-keepclasseswithmember class * { native <methods>;}
不论这个类有没有native的方法,那么这个类不会被混淆
-keep class * { native <methods>;}
另外、 你可以使用 APK Analyser 分解你的 APK
Android Studio 提供了一个有用的工具:APK Analyser。APK Analyser 将会拆解你的应用并让你知道 .apk 文件中的那个部分占据了大量空间。让我们看一下 Anti-Theft 在没有经过优化之前的截图。
从 Apk Analyser 的输出来看,应用的原大小是 3.1MB。经过 Play 商店的压缩,大致是 2.5MB。
从截图中可以看出主要有 3 个文件夹占据了应用的大多数空间。
classes.dex —— 这是 dex 文件,包含了所有会运行在你的 DVM 或者 ART 里的字节码文件。
res —— 这个文件夹包含了所有在 res 文件夹下的文件。大部分情况下它包含所有图片,图标和源文件,菜单文件和布局。
resources.arsc —— 这个文件包含了所有 value 资源。这个文件包含了你 value 目录下的所有数据。包括 strings、dimensions、styles、intergers、ids 等等。
你有两个默认的混淆文件。
proguard-android-optimize.txt
proguard-android.txt
就像文件名写的那样,“proguard-android-optimize.txt”是更积极的混淆选项。我们将这个作为默认的混淆配置。你可以在 /app 目录下的 proguard-rules.pro 里增加自己设置的混淆配置。
release { //Enable the proguard minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "proguard-rules.pro" //Other parameters debuggable false jniDebuggable false renderscriptDebuggable false signingConfig playStoreConfig //Add your own signing config pseudoLocalesEnabled false zipAlignEnabled true}
通过设置 minifyEnabled 为 true,混淆将会移除所有未使用的方法、指令以减小 classes.dex 文件。
这是启用了 minify 之后的 APK。
七、AndroidStudio使用lint清理无用的资源文件
在使用AndroidStudio进行App开发的时候,我们经常会在项目中引用多种资源文件,包括图片,布局文件,常量引用定义。随着项目版本开发的迭代,每一期的资源会有变动必定会留下少量无用的资源这个时候我们手动去一个一个寻觅效率就会很低下。这个时候我们就要学会AndroidStudio使用lint清理无用的资源文件。
打开AndroidStudio在项目中,点击最上方的菜单栏Analyze -> Run Inspection by Name 如下图:
点击 Run Inspection by Name会弹出一个对话框。在对话框里面输入unused resource 如下图:
而后点击下拉列表中的unused resource。 之后会弹出一个对话框如下图
最后
假如你看到了这里,觉得文章写得不错就给个赞呗?假如你觉得那里值得改进的,请给我留言。肯定会认真查询,修正不足。谢谢。
希望读到这的您能转发分享和关注一下我,以后还会升级技术干货,谢谢您的支持!
转发+点赞+关注,第一时间获取最新知识点
Android架构师之路很漫长,一起共勉吧!
——————分割线——————
简书点赞可以有好几种赞,长按点赞按钮就会有选项,大家点赞的时候,麻烦点个超赞,让我感受下这个功能……
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 如何在10分钟内让Android应用大小减少 60%?