Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结

优化

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第1张图片

发现我们 link 大概优化了 700 kb继续。

注意

因为 link 是检查有没有引用来做的判断是否使用了资源,那么如果是这种方式勒,所以在删除的时候一定要谨慎。

//动态获取资源 id , 未直接使用 R.xx.xx ,则这个 id 代表的资源会被认为没有使用过(类似不能混淆反射类)
int indetifier =getResources().getIdentifier(“img_bubble_receive”, “drawable”, getPackageName()); getResources().getDrawable(indetifier);

5. 开启混淆

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第2张图片

优化了大概 1.7M 继续。

6.移除无用资源 shinkResource

  • 开启 shinkResource = true

buildTypes {
release {
minifyEnabled true
shrinkResources = true

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
debug {
shrinkResources = true
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第3张图片

这个有可能 link 删除了无用资源,所以没有在优化了

7.开启删除无用资源 (严格模式和普通模式) - 这个我这里就不可测试,你们下来可以测试下效果

普通模式也就是自定义模式

如果您有想要保留或舍弃的特定资源,请在您的项目中创建一个包含 标记的 XML 文件,并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。您可以使用星号字符作为通配符。

例如:

将该文件保存在项目资源中,例如,保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

指定要舍弃的资源可能看似愚蠢,因为您本可将它们删除,但在使用构建变体时,这样做可能很有用。例如,如果您明知给定资源表面上会在代码中使用(并因此不会被压缩器移除),但实际不会用于给定构建变体,就可以将所有资源放入公用项目目录,然后为每个构建变体创建一个不同的 keep.xml 文件。构建工具也可能无法根据需要正确识别资源,这是因为编译器会添加内联资源 ID,而资源分析器可能不知道真正引用的资源和恰巧具有相同值的代码中的整数值之间的差别。

严格模式

正常情况下,资源压缩器可准确判定系统是否使用了资源。不过,如果您的代码调用 Resources.getIdentifier()(或您的任何库进行了这一调用 - AppCompat 库会执行该调用),这就表示您的代码将根据动态生成的字符串查询资源名称。当您执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。

例如,以下代码会使所有带 img_ 前缀的资源标记为已使用。

String name = String.format(“img_%1d”, angle + 1);
res = getResources().getIdentifier(name, “drawable”, getPackageName());

资源压缩器还会浏览代码以及各种 res/raw/ 资源中的所有字符串常量,寻找格式类似于 file:///android_res/drawable//ic_plus_anim_016.png 的资源网址。如果它找到与其类似的字符串,或找到其他看似可用来构建与其类似的网址的字符串,则不会将它们移除。

这些是默认情况下启用的安全压缩模式的示例。但您可以停用这一“有备无患”处理方式,并指定资源压缩器只保留其确定已使用的资源。要执行此操作,请在 keep.xml 文件中将 shrinkMode 设置为 strict,如下所示:

如果您确已启用严格压缩模式,并且代码也引用了包含动态生成字符串的资源(如上所示),则必须利用 tools:keep 属性手动保留这些资源。

8. AndResGuard 微信资源压缩方案

什么是 AndResGuard

AndResGuard 是一个缩小 APK 大小的工具,它的原理类似 Java Proguard ,但是只针对资源。它会将原本冗长的资源路径变短,例如将 res/drawable/wechat 变为 r/d/a。

为什么使用 AndResGuard

在以往的开发中,我们通常只混淆了代码,资源文件却暴露在他人面前,res 文件夹下所有文件名的可读性过强。

使用后的效果

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第4张图片

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第5张图片

AndResGuard 的配置

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

dependencies {
classpath ‘com.tencent.mm:AndResGuard-gradle-plugin:1.2.16’
}

  • 在 app 目录下,创建 and_res_guard.gradle 文件

apply plugin: ‘AndResGuard’

andResGuard {
mappingFile = null
use7zip = true
useSign = true
keepRoot = false
compressFilePattern = [
.png",
"
.jpg”,
.jpeg",
"
.gif”,
“resources.arsc”
]
whiteList = [
// 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*”,

//融云
“R.drawable.u*”,
“R.drawable.rc_",
"R.string.rc_
”,
“R.layout.rc_",
"R.color.rc_
”,
“R.id.rc_",
"R.style.rc_
”,
“R.dimen.rc_",
"R.array.rc_

]

sevenzip {
artifact = ‘com.tencent.mm:SevenZip:1.2.10’
}
}

  • 在 app 模块下的 build.gradle 文件添加

apply from: ‘and_res_guard.gradle’

  • 打包完之后效果图

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第6张图片

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第7张图片

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第8张图片

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第9张图片

Android性能优化之APK-极限压缩(资源越多,效果越显著),2021Android高级面试题总结_第10张图片

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

…(img-NAfJJQnf-1643875481487)]

[外链图片转存中…(img-XecRm7pM-1643875481488)]

[外链图片转存中…(img-lITtnGEi-1643875481488)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

你可能感兴趣的:(程序员,架构,移动开发,android)