推荐阅读:

滴滴Booster移动App质量优化框架-学习之旅 一

Android 模块Api化演练

不一样视角的Glide剖析(一)

 

滴滴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  1 > 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

 

参考资料:

官方公众号-Apk 分析减包利器

 

 

如果您对博主的更新内容持续感兴趣,请关注公众号!

 

转载于:https://www.cnblogs.com/sihaixuan/p/11075041.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/277483.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/277483.shtml
英文地址,请注明出处:http://en.pswp.cn/news/277483.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 最后的异常_java – 最后不要抛出堆栈溢出异常

Error不是例外.所以捕捉任何异常都不会捕获StackOverflowError.所以让我们先来看一下“明显的错误” – (这段代码不太适合这个答案后面的说明):catch(Throwable e){System.out.println("Catch");}如果您进行此更改,您将发现代码仍然不打印.但是它不会打印…

Colder框架硬核更新(Sharding+IOC)

目录 引言控制反转读写分离分库分表 理论基础设计目标现状调研设计思路实现之过五关斩六将 动态对象动态模型缓存数据源移植查询表达式树深度移植数据合并算法事务支持实际使用展望未来引言 前方硬核警告:全文干货11000字,请耐心阅读 遥想去年这个时候&a…

python:小心类实例的属性动态绑定机制

为什么80%的码农都做不了架构师?>>> class Test:def __init__(self):self.__keyinitdef get_key(self):return self.__keydef set_key(self,key):self.__keykeyif __name__ __main__:obj Test()print(obj.get_key())#输出初始值initobj.set_key(通过s…

java 获取手机归属地_java 获取手机归属地

java 获取手机归属地[2021-01-30 20:46:44] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:…

Atom常用功能插件

minimap代码缩略图插件 代码粒子效果activate-power-mode 代码格式化插件atom-beautify packages-->Atom Beautify-->Beautify进行格式化 标签折叠 autoclose-html 转载于:https://www.cnblogs.com/chenxi-hxl/p/9464120.html

mui aniShow 动画属性

aniShow: animationType //mui切换窗口的动画效果;(默认为slide-in-right);1."auto": (String 类型 )自动选择动画效果,使用上次显示窗口设置的动画效果,如果是第一次显示则默认动画效果。 2.&qu…

java中和char功能相反的是_JAVA基础语法

java的基础语法Java中的程序可分为结构定义语句和功能执行语句.结构定义语句:用于声明一个类或方法,功能执行语句用于实现具体的功能。功能执行语句:每条功能执行语句的结尾都必须用英文分号(;)结束。public修饰的类名必须和文件名一致(如果没…

P1357 花园 (矩阵快速幂+ DP)

题意:一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 m < 5 n < 1e15 题解:用一个m位二进制表示状态 转移很好想 但是这个题是用矩阵快速幂加速dp的 因为每一位的转移都是一样的 用一个矩阵表示状态i能否转移到状态j 然后跑一遍 统计答案特…

IDEA设置类、方法注释模板

类注释模板 File -> Other Setting -> Default Setting打开默认设置 Editor -> File and Code Templates -> Files -> Class 找到类注释模板&#xff0c;在public class前面添加模板注释 /** * program: ${PROJECT_NAME}->${NAME} * description: ${descript…

Element.shadowRoot

Element.shadowRoot转载于:https://www.cnblogs.com/yishenweilv/p/11083278.html

netty源码分析之服务端启动全解析

background netty 是一个异步事件驱动的网络通信层框架&#xff0c;其官方文档的解释为 Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and stream…

捕鱼达人java源代码解析_捕鱼达人源码Java

【实例简介】捕鱼达人源码Java实现的完整代码,对应的源码分析文章http://write.blog.csdn.net/postedit【实例截图】【核心代码】Fishlord├── bin│ ├── fishlord│ │ ├── Fish.class│ │ ├── Fishlord.class│ │ ├── Net.class│ │ ├─…

Android-一张图理解MVP的用法

M和V通过P交互&#xff0c;M做了两件事&#xff0c;开启子线程做耗时操作&#xff0c;然后使用原生的Hander方式切回主线程回调结果给P。 M做的两件事也可以使用比较流行的rxjava实现&#xff1a; 备注&#xff1a;图片不清晰可以看这里 转载于:https://www.cnblogs.com/develo…

Android 使用jtds远程访问数据库

最近老师让我用jtds这个jar包远程访问数据库中的数据&#xff0c;虽然不难&#xff0c;但有几个点还是要注意一下的。 1、jtds的jar包我使用的是1.2.7这个版本的&#xff0c;如果是Java工程使用的是1.3.1这个版本&#xff0c;Android工程不能使用1.3.1否则连接不上数据库 2、远…

java乘以2的位计算符号_java编程之:按位与运算,等运算规则

按位与运算符(&)参加运算的两个数据&#xff0c;按二进制位进行“与”运算。运算规则&#xff1a;0&00; 0&10; 1&00; 1&11;即&#xff1a;两位同时为“1”&#xff0c;结果才为“1”&#xff0c;否则为0例如&#xff1a;3&5 即 0000 0011 &a…

C语言文字加密程序的实现

前言&#xff1a;当今社会是一个信息社会&#xff0c;你的个人信息和聊天记录极有可能被别有用心的人时时刻刻监视着&#xff0c;那么你想不想实现专属于两个人或一个小圈子的人在社交软件上的交流不被任何其他人读懂呢&#xff1f;下面就给大家提供一个原理极其简单程序极其容…

菜鸟-es6

这里就不在唠叨浏览器对es6的支持跟转码器了&#xff0c;稍微百度一下就ok let and const 变量 and 常量 什么是变量,什么是常量 - 都是存储数据的容器, - 变量》即意思就是程序运行中可以发生变化的,- 常量》即程序运行中不可以发生改变&#xff0c;- 注意&#xff1a;常量…

阿帕奇退出java_java+tomcat+apache安装整合,启动/关闭,添加开机启动服务

安装java1.8#yum update 服务器更新源码包#rpm -qa |grep -E ^open[jre|jdk]|j[re|dk] 搜索任何版本的已安装JDK组件java-1.8.0-openjdk-headless-1.8.0.60-2.b27.el7_1.x86_64pygobject2-2.28.6-11.el7.x86_64pygobject3-base-3.8.2-6.el7.x86_64java-1.8.0-openjdk-1.8.0…

Spring Boot中如何干掉if else

Spring Boot中如何干掉if elsehttp://www.ciphermagic.cn/spring-boot-without-if-else.html 转载于:https://www.cnblogs.com/tyk766564616/p/11089133.html

java 抽象类与接口理解

2019独角兽企业重金招聘Python工程师标准>>> 在java 中抽象类是implements [等有时间了补充] 转载于:https://my.oschina.net/kuchawyz/blog/1929094