滴滴Booster移动APP质量优化框架 学习之旅 三
推荐阅读:
滴滴Booster移动App质量优化框架-学习之旅 二对重复资源优化和无用资源优化进行了讨论。这里对不可编译无用assets资源优化进行讨论。
先看微信Matrix-ApkChecker是怎样检索对无用assets资源。ApkCheckers是针对 android 安装包的分析检测工具,反汇编apk包中dex文件,在内存生产smali相关数据,检索 const-string 指令 line,根据const-string指令 后面字符串常量值 与 assets资源名是否相等,找出usedAssetsResouces,比如:
- //如果 能在assets文件夹booster_demo_1.png
- //则booster_demo_1.png为usedAssetsResources
- const-string v0, "booster_demo_1.png"
反汇编dex使用了如下两个jar包:
- implementation "org.smali:smali:2.2.7"
- implementation "org.smali:baksmali:2.2.7"
不过这种方式只能粗略的检索出来,比如使用三方图片加载库,是鉴别不了的,比如使用Glide加载assets中图片:
- val url = "file:///android_asset/booster_demo_1.png" Glide.with(context).load(url).into(holder.image)
在构建过程中进行无用assets资源优化,需要考虑两点
1.Hook点 即在哪个Task之后或者之前进行优化
2.inputFiles(dex、assets) 来源
无用assets资源优化,肯定在apk生成之前进行,Hook点就选择在packageDebug/packageRelease task之前
- variant.packageAndroidTask.doFirst{
- ...
- //unusedAssetsResources优化
- variant.removeUnusedAssetsResources(it.logger,results)
- variant.generateReport(results)
- }
使用TaskTreePlugin插件查看packageDebug / packageRelease的task tree,cmdz终端执行如下命令:
- gradlew :app:packageDebug :app:taskTree --task-depth > log-debug.txt
可以看到packageDebug/packageRelease tasktree如下图:
打印mergedAssetsTask和dex相关task的outputFiles,如下图:
如果之前成功地打过包,查看这个两个task的outputFiles下的文件如下:
现在无用assets资源优化的inputFiles dex和assets都找到了。
无用assets资源优化实现
步骤如下:
1.找出assets资源
2.反汇编dex找出usedAssetsResources
3根据配置解析出无用assets白名单
4.根据前三步,得到unusedAssetsResources
5.删除unusedAssetsResources文件
详见:doRemoveUnusedAssetsResources方法
验证:分别在App module assets放入显示如下图片资源:
集成无用assets资源优化功能,打release包,插件输出报告如下:
查看release.apk包中assets文件如下:
运行app,可以成功加载显示assets图片资源。
本篇文章比较简短,只讨论了无用assets资源优化,大佬们也许觉得写得有些啰嗦,估计一句也可以表述清楚,但我这里重在表述实现的思路过程。没有经过大量测试,仅供参考学习,共同成长。
源码传送门:BoosterStudy
参考资料:
如果您对博主的更新内容持续感兴趣,请关注公众号!
滴滴Booster移动APP质量优化框架 学习之旅 三的更多相关文章
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- 滴滴Booster移动APP质量优化框架 学习之旅
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...
- 滴滴 App 的质量优化框架 Booster,开源了!
一. 序 当 App 达到一定体量的时候,肯定是要考虑质量优化.有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就很严重了. 滴滴这个独角兽的 DAU 早已过千万,自 ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...
- Hadoop学习之旅三:MapReduce
MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...
- .net转php laraval框架学习系列(三)项目实战---Route&Controllers
本章来学习laravel的路由 一个简单的路由列子 Route::get('/', function() { return 'Hello World'; }); 路由的写法和Node的风格很相似.上面 ...
- Go 框架学习之旅 ① 深入解析 net/http 启动服务的层级逻辑
Web Server. net/http 标准库怎么学. 库函数. 结构定义. 结构函数. 思维导图解析HTTP服务端. 层级逻辑. 创建框架的Server结构. OSI参考模型. TCP/IP五层模 ...
- Omi框架学习之旅 - Hello World 及原理说明
学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...
- struts2框架学习之第三天
day03 上传下载 1 上传下载组件介绍 l jspSmartUpload(model1的年代): l apache-commons-fileupload,Struts2默认上传组 ...
随机推荐
- iOS SQLite使用
数据库的特征: 以一定方式存储在一起 能为多个用户分享 具有尽可能少的冗余代码 与程序彼此独立的数据集 SQLite SQLite是一个轻量级关系数据库,最初的设计目标是用于嵌入式系统,它占用资源非常 ...
- Spanner: Google’s Globally-Distributed Database
https://research.google.com/archive/spanner.html Spanner is Google’s scalable, multi-version, global ...
- HTML 学习笔记 JQuery(animation)
动画效果也是JQuery库吸引人的地方,通过JQuery的动画方法,能够轻松的为网页天假非常紧菜的视觉效果. show()方法和hide()方法 show()方法和hide()方法是JQuery中最基 ...
- Grunt 学习笔记【1】----基础知识
题记:虽然现在大家都在推Webpack,无奈业务需要,因此研究下Grunt. 说明:本文是基于Grunt 0.4.5版本. 一 说明 为何要用构建工具? 一句话:自动化.对于需要反复重复的任务,例如压 ...
- mybatis 执行查询时报错 【Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: 】
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLE ...
- centos 安装postgresql 完整版
按步骤 执行命令即可: yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-c ...
- python连接redis并插入url
#!/usr/bin/env python # -*- coding:utf8 -*- import redis ''' 这种连接是连接一次就断了,耗资源.端口默认6379,就不用写 r = redi ...
- Allegro PCB中添加汉字
注明出处:http://www.cnblogs.com/einstein-2014731/p/5650943.html Cadence用起来比AltiumDesigner要麻烦些,但是也更开放,更灵活 ...
- IOS 获取 文件(UIImage) 创建时间
Image 在手机里 如果是手机拍的那么能使用ALAssetsLibrary获取一系列 图片的信息 颜色.GPS.尺寸.创建日期等 使用ALAssetsLibrary导入框架AssetsLibrary ...
- git设置只允许特定类型的文件
git设置只允许特定类型的文件 # 忽略所有文件 * # 不忽略目录 !*/ # 不忽略文件.gitignore和*.foo !.gitignore !*.foo