Android 通过插桩来代理线程池


前言

         在日常开发App的过程中,难免需要依赖第三方Sdk,这样就无形中增加了我们自己App的线程数,从而会导致App出现内存溢出、Cpu消耗增加等等负面影响。如果依赖的Sdk提供了线程池代理的接口还好,那样直接设置我们自定义的线程池。但是依赖的Sdk没有提供可设置的接口,那我们有没有办法把我们自定义的线程池代理进去呢?答案是肯定的,这里我给大家提供一种万能代理第三方Sdk线程池的方法----插桩。

一、插桩是什么?

      我们都知道,在Android编译过程中,Java代码会被编译成Class文件,Class文件再被打进Dex文件,虚拟机最终会加载Dex文件去执行。

    插桩,就是干涉代码的编译过程,在编译期间生成新的代码或者修改已有的代码,即修改Class文件,生成新的Class文件再被打进Dex文件,从而加入了你自己想要的逻辑。

      那么Class文件的16进制代码。一般人都看不懂这些代码的含义,更别说去修改这些代码了...但既然AS可以将这些代码解析成开发者可以看懂的样子,说明Class文件肯定是遵循某个格式规范的。所以,就诞生了一个ASM框架,这个框架是完全有能力解析所有的Class文件,甚至修改Class文件的。它提供一套完整的API帮助我们在不需要了解Class文件格式规范的情况下,可以解析并修改Class文件。

ASM概念,操作流程:
需要创建一个 ClassReader 对象,将 .class 文件的内容读入到一个字节数组中

然后需要一个 ClassWriter 的对象将操作之后的字节码的字节数组回写

需要事件过滤器 ClassVisitor。在调用 ClassVisitor 的某些方法时会产生一个新的 XXXVisitor 对象,当我们需要修改对应的内容时只要实现自己的 XXXVisitor 并返回就可以了

  • ClassReader:用于读取已经编译好的.class文件。

  • ClassWriter:用于重新构建编译后的类,生成新的类的字节码文件。

  • 各种Visitor类:CoreAPI根据字节码从上到下依次处理,对于字节码文件中不同的区域有不同的Visitor,比如用于访问方法的MethodVisitor、用于访问类变量的FieldVisitor、用于访问注解的AnnotationVisitor等。为了实现AOP,重点要使用的是MethodVisitor。

  ASM 内部采用 访问者模式 将 .class 类文件的内容从头到尾扫描一遍,每次扫描到类文件相应的内容时,都会调用ClassVisitor内部相应的方法。

例如:

扫描到类文件时,会回调ClassVisitor的visit()方法;

扫描到类注解时,会回调ClassVisitor的visitAnnotation()方法;

扫描到类成员时,会回调ClassVisitor的visitField()方法;

扫描到类方法时,会回调ClassVisitor的visitMethod()方法;

    扫描到相应结构内容时,会回调相应方法,该方法会返回一个对应的字节码操作对象(比如,visitMethod()返回MethodVisitor实例),通过修改这个对象,就可以修改class文件相应结构部分内容。

    最后将这个ClassVisitor字节码内容覆盖原来.class文件就实现了类文件的代码切入。 

   

二、使用步骤

1.思维导图


2.如何扫描到创建的线程和线程池(扫描工具)

源码字节码
new ThreadPoolExecutor(corePoolSize,maxPoolSize,TIME_OUT,TimeUnit.SECONDS,new LinkedBlockingDeque<>(256),                     threadFactory);java/util/concurrent/ThreadPoolExecutor."<init>":(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V
new Thread(new Runnable(), "startAsyncJob");java/lang/Thread."<init>":(Ljava/lang/Runnable;Ljava/lang/String;)V
Executors.newSingleThreadScheduledExecutor();invokestatic  #6                 java/util/concurrent/Executors.newSingleThreadScheduledExecutor:()Ljava/util/concurrent/ScheduledExecutorService;

3.如何扫描到创建的线程和线程池(扫描条件) 


 

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

Java 压缩多个文件为zip包(中间不生成临时文件,直接压缩为zip二进制流),以及解压zip包二进制流为文件

Java 压缩多个文件为zip包及解压zip包以及压缩多文件为zip文件流解压zip二进制流&#xff08;中间不生成临时文件&#xff0c;直接压缩为zip二进制流&#xff0c;并验证解压&#xff09; 1. 效果图2. 源码 这篇博客将提供俩种方法&#xff0c; 提前生成要压缩的多个文件&#…

招聘小程序制作:连接人才与企业

随着人才市场的竞争日益激烈&#xff0c;招聘小程序成为了企业寻找优秀人才和求职者找到理想工作的重要工具。通过招聘小程序&#xff0c;企业可以发布招聘信息、筛选简历&#xff0c;而求职者可以浏览职位、提交简历等。 招聘小程序的好处 精准匹配人才&#xff1a;招聘小程序…

js的this绑定规则以及箭头函数

目录 调用位置默认绑定隐式绑定隐式丢失 显式绑定callapplybind new绑定装箱绑定优先级this规则之外忽略显式绑定间接函数引用 箭头函数 调用位置 从字面意思上来理解&#xff0c;this似乎是指向自己的 然而在JavaScript中&#xff0c;this并不是绑定到自身的 可以看这一个例子…

经典常谈思维导图怎么制作?手把手教你制作

经典常谈思维导图怎么制作&#xff1f;创建思维导图可以帮助我们更好地组织和整理信息&#xff0c;帮助我们更好地理解和记忆信息。它可以使我们更高效地学习和工作&#xff0c;并帮助我们更好地表达和分享我们的想法和想法。因此&#xff0c;制作思维导图是一种非常有用的技能…

适合投资者的交易策略,4步找到

在外汇交易市场中&#xff0c;根据市场情况和个人投资目标&#xff0c;制定灵活的交易策略是至关重要的。Forexclub认为投资者可以通过结合多种交易策略&#xff0c;打造出全面、科学且适合自己的外汇交易策略。 首先&#xff0c;基于技术指标的交易策略是判断市场趋势和转折点…

剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] …

【深度学习】张量的广播专题

一、说明 张量广播&#xff08;tensor broadcasting&#xff09;是一种将低维张量自动转化为高维张量的技术&#xff0c;使得张量之间可以进行基于元素的运算&#xff08;如加、减、乘等&#xff09;。在进行张量广播时&#xff0c;会将维度数较少的张量沿着长度为1的轴进行复制…

【深度学习】了解残差网 ResNet 和 ResNeXt 的架构

一、说明 了解和实现 ResNet 和 ResNeXt 的架构以实现最先进的图像分类&#xff1a;从Microsoft到 Facebook [第 1 部分]&#xff0c;在这篇由两部分组成的博客文章中&#xff0c;我们将探讨残差网络。更具体地说&#xff0c;我们将讨论Microsoft研究和Facebook AI研究发布的三…

【C++初阶】list的模拟实现 附源码

一.list介绍 list底层是一个双向带头循环链表&#xff0c;这个我们以前用C语言模拟实现过&#xff0c;->双向带头循环链表 下面是list的文档介绍&#xff1a; list文档介绍 我们会根据 list 的文档来模拟实现 list 的增删查改及其它接口。 二.list模拟实现思路 既然是用C模拟…

【Vue】给 elementUI 中的 this.$confirm、this.$alert、 this.$prompt添加按钮的加载效果

文章目录 主要使用 beforeClose 方法实现 loading 的效果beforeClose MessageBox 关闭前的回调&#xff0c;会暂停实例的关闭 function(action, instance, done)1. action 的值为confirm, cancel或close。 2. instance 为 MessageBox 实例&#xff0c;可以通过它访问实例上的属…

Django + Bootstrap - 【echart】 统计图表进阶使用-统计用户日活日增、月活月增等数据(二)

一. 前言 Bootstrap是一个流行的前端框架&#xff0c;而ECharts是一个流行的可视化库。 Bootstrap可以用来设计网站和应用程序的用户界面&#xff0c;而ECharts可以用来创建交互式和可视化的图表。 chart.js中文文档&#xff1a;http://www.bootcss.com/p/chart.js/docs/ 二. …

LT8619B 是一款HDMI转TTL或者2 PORT LVDS的芯片。

LT8619B 1. 概述 LT8619B是龙迅基于清除边缘技术的高性能HDMI接收芯片&#xff0c;符合HDMI 1.4&#xff08;高清多媒体接口&#xff09;规范。RGB 输出端口可支持 RGB888/RGB666/RGB565 格式&#xff0c;输出分辨率最高可支持 4Kx2K 分辨率。凭借可编程标量&#xff0c;LT86…