一个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] (developer.android.com/reference/a…)注解。在类上增加@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小伙伴们运用内存问题~
更多Android进阶指南 能够具体Vx重视公众号:Android老皮 解锁 《Android十大板块文档》
1.Android车载运用开发体系学习指南(附项目实战)
2.Android Framework学习指南,助力成为体系级开发高手
3.2023最新Android中高档面试题汇总+解析,离别零offer
4.企业级Android音视频开发学习道路+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技能解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高档Android插件化与组件化(含实战教程和源码)
9.Android 功能优化实战+360全方面功能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,重视一下吧。ღ( ・ᴗ・` )