Android 通过插桩来代理线程池

news2024/10/7 10:20:42


前言

         在日常开发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.coloradmin.cn/o/767672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学学习笔记(十五):ECDSA - 椭圆曲线数字签名算法

椭圆曲线数字签名算法是DSA的一种椭圆曲线变体&#xff0c;它发明的初衷只是避免使用Schnorr签名的专利。椭圆曲线数字签名算法依赖于验证器中的私钥和主机用于验证验证器的公钥。它的缺点和DSA一样&#xff0c;它也没有提供安全性证明。 椭圆曲线算法 DSS&#xff08;数字签…

工作空间内各文件夹解析

src文件夹用来存放源代码 launch文件夹用来存放一个或多个ros节点启动文件 msg文件夹包含用户定制化消息的定义 srv文件夹包含各种服务的定义 action文件夹包含动作文件 package.xml是软件包清单文件 Cmakelists.txt文件包含编译软件包的各类指令

面试官: 说一下你做过哪些性能优化?

前言 如果你已经有 2 - 3 年以上开发经验还不懂的怎么去优化自己的项目&#xff0c;那就有点说不过去了&#xff0c;下面是我自己总结的一套通用级别的 Android 性能优化。 如果你正在找工作, 那么你需要一份 Android 高级开发面试宝典 1、 你对 APP 的启动有过研究吗? 有做过…

Spring解决数据乱码问题-spring21

乱码数据实际情况&#xff1a; 都出现了&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 怎么解决&#xff1a; 第一步&#xff0c;找到web.xml配置文件。 改成name控制台就不出来了 如何解决地址方法与Controller业务参数名称不一致的情况&#xf…

Linux 之 基本工具(一)

一、粘滞位 1.背景 在现实生活中&#xff0c;有很多人会在同一台云服务器上共同工作&#xff0c;会出现这些人的某些文件需要保存但又不想保存在各自的家目录下且这些文件需要共给其他一同工作的同事共享&#xff08;可查阅&#xff09;的情况&#xff0c;则需要将这些文件保…

Mysql表锁与行锁

Mysql锁实战 前言&#xff1a;什么是锁一&#xff1a;全局锁1.1 概念1.2 作用1.3 使用1.4 特点 二&#xff1a;表级锁2.1 概念2.2 分类2.2.1 表锁2.2.2 元数据锁 MDL2.2.3 意向锁 三&#xff1a;行级锁3.1 行锁(Record Lock)3.2 间隙锁(Gap Lock)3.3 临键锁(Next-Key Lock): 四…

redis乐观锁概念

乐观锁&#xff08;又名乐观并发控制&#xff0c;Optimistic Concurrency Control&#xff0c;缩写“OCC”&#xff09;&#xff0c;是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响&#xff0c;各事务能够在不产生锁的情况下处理各自影响的那部分数据。…

Ubuntu下安装、配置及重装CUDA教程

安装CUDA 前往Nvidia CUDA Tools官网选择对应的架构和版本下载CUDA 以如下架构和版本为例&#xff1a; 查看显卡驱动 nvidia-smi如果显卡驱动已经装了&#xff0c;那么在CUDA安装过程中不用再勾选安装driver 下载并安装CUDA wget https://developer.download.nvidia.co…

如何设计一个完美的复杂业务系统架构?

1 什么是复杂系统 我们经常提到复杂系统&#xff0c;那么到底什么是复杂系统。我们看下维基的定义&#xff1a;复杂系统&#xff08;英语&#xff1a;complex system&#xff09;&#xff0c;又称复合系统&#xff0c;是指由许多可能相互作用的组成成分所组成的系统。强调了两…

字幕切分视频

Whisper 仓库地址&#xff1a; https://github.com/openai/whisper 可用模型信息&#xff1a; 测试视频&#xff1a;18段&#xff0c;总共447S视频&#xff08;11段前&#xff1a;有11段开头有停顿的视频&#xff09; Tiny: 跑完&#xff1a;142S &#xff0c;11段前&#xf…

微服务sleuth+zipkin——链路追踪

一、链路追踪&#x1f349; 1.什么是链路追踪&#xff1f;&#x1f95d; 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要…

深入理解Java虚拟机(二)Java内存区域与内存溢出异常

一、前言 对于Java程序员来说&#xff0c;在虚拟机自动内存管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;看起来由虚拟机管理内存一切都很美好。不过&#xff0c;也正是因为Java程序…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区&#xff0c;(信息体地址&#xff0c;装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…

Ansible Playbook剧本配置文件

一、执行文件 Playbook配置文件使用YAML语法&#xff0c;具有简 洁明了&#xff0c;结构清晰等特点。Playbook配置文件类似于shell脚本&#xff0c;是一个YAML格式的文件&#xff0c;用于保存针对特定需求的任务列表&#xff0c;前面介绍的ansible命令虽然可以完成各种任务&a…

学习记录——SAM、SPM

Segment Anything Model&#xff08;SAM&#xff09; 能分割一切的模型 2023 SAM是一个提示型模型&#xff0c;其在1100万张图像上训练了超过10亿个掩码&#xff0c;实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻&#xff0c;因为 SAM 已经学会了物体是什…

EFLFK——ELK日志分析系统+kafka+filebeat架构(有乌云的天反而是最美的)

文章目录 1.修改filebeat配置文件filebeat.yml收集日志转发&#xff08;生产&#xff09;给kafka2.修改logstash配置从kafka中消费日志&#xff0c;并输出到kibana前端展示 在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&am…

appium自动化测试中控件坐标及控件属性获取

在appium有时会遇到content-desc中存在内容的情况&#xff0c;有时需要校验它的值&#xff0c;那么它是怎么获取的呢&#xff1f; driver.find_element_by_XX().get_attribute("contentDescription") 使用上边的方式可以获取到content-desc中的值。 像上图中我们其…

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2

概念&#xff1a;端口号&#xff0c;实质就是一个数字编号&#xff0c;用来在我们一台主机中&#xff08;主机的操作系统中&#xff09;唯一的标识一个能上网的进程。端口号和IP地址一起会被打包到当前进程发出或者接收到的每一个数据包中。每一个数据包将来在网络上传递的时候…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems&#xff08;CCF-A&#xff09;https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…