当前位置: 首页 > news >正文

AMS概念以及面试相关整理

1、ActivityManagerService是什么?什么时候初始化的?有什么作用?

ActivityManagerService(AMS)是什么?

ActivityManagerService(简称AMS)是Android操作系统中的一个核心服务,主要负责管理和监控系统中所有Activity的生命周期,以及协调四大组件(Activity、Service、Broadcast Receiver和Content Provider)的启动、切换和调度。AMS还负责应用进程的管理和调度,确保系统资源的有效利用和分配。

何时初始化ActivityManagerService?

AMS的初始化发生在Android系统启动过程中,具体来说,是在SystemServer进程开启时进行的。在SystemServer进程中,会通过SystemServiceManager来启动AMS服务,这通常发生在SystemServer类的startBootstrapServices()方法中。AMS服务的启动是通过反射机制创建AMSEx对象,然后通过startService()方法启动服务.

ActivityManagerService的作用是什么?

AMS的主要作用包括:

  • 管理Activity的生命周期,包括创建、启动、暂停、恢复和销毁Activity。

  • 协调四大组件的启动和切换,确保它们按照预期的顺序和行为运行。

  • 管理应用进程,包括进程的创建、调度和终止。

  • 维护系统的全局状态,如当前正在前台运行的Activity、最近任务列表等。

  • 提供API供其他系统服务和应用程序查询和控制Activity和进程的状态。

AMS作为系统的关键部分,对于保证Android系统的稳定性和性能至关重要。

2、ActivityThread是什么?ApplicationThread是什么?他们的区别是什么?

ActivityThread

ActivityThread是Android操作系统中的一个核心类,它代表了Android应用程序的主线程,也就是UI线程。ActivityThread是Android应用程序启动的入口点,它负责管理应用程序的生命周期,包括启动Activity、处理Intent、管理服务和广播接收器等。ActivityThread通过Handler机制来处理消息循环,从而响应各种系统事件和用户输入。

ApplicationThread

ApplicationThread是ActivityThread的内部类,它是一个Binder对象,主要用于ActivityThread与ActivityManagerService(AMS)之间的通信。ApplicationThread作为客户端Binder,允许AMS服务调用应用程序进程中的方法,比如启动Activity或者服务。

区别

ActivityThread和ApplicationThread的主要区别在于它们的角色和用途。ActivityThread是应用程序的主线程,负责处理应用程序的生命周期和UI更新,而ApplicationThread则是ActivityThread与AMS之间的通信桥梁,用于处理与系统服务相关的操作。简单来说,ActivityThread是面向应用程序的,而ApplicationThread是面向系统服务的。

在Android系统启动时,ActivityThread会被创建并启动,它会通过attach方法与AMS建立连接,这时会创建ApplicationThread实例,以便于后续与AMS的通信。因此,ApplicationThread是ActivityThread在与AMS交互时使用的工具,而ActivityThread本身则是处理应用程序逻辑的主体。

3、 Instrumentation是什么?和ActivityThread是什么关系?

Instrumentation

Instrumentation在Android中是一个特殊的类,它可以被认为是应用进程的管家。每个Android应用程序只有一个Instrumentation对象,这个对象在应用程序的生命周期中扮演着重要的角色。Instrumentation对象的主要职责是监听和介入应用程序的生命周期事件,例如Activity的创建、销毁和系统的启动等。它还提供了一系列的方法,允许开发者在特定的生命周期事件发生时执行自定义的代码,这对于测试和调试应用程序特别有用。

ActivityThread与Instrumentation的关系

ActivityThread是Android应用程序的主线程,负责管理应用程序的生命周期和UI更新。每个Activity都持有Instrumentation对象的一个引用,这样ActivityThread在执行创建或暂停某个Activity的操作时,都需要通过Instrumentation来进行具体的操作,即回调Activity的生命周期方法。Instrumentation对象的存在使得ActivityThread能够在执行生命周期方法之前或之后插入额外的逻辑,这对于扩展和定制Android应用程序的行为非常重要2.

总结来说,Instrumentation是一个用于介入和监听Android应用程序生命周期事件的工具,而ActivityThread是负责执行这些生命周期事件的主线程。两者紧密协作,共同确保Android应用程序能够正确地启动、运行和关闭。

4、ActivityManagerService和zygote进程通信是如何实现的?

应 用启动时,Launcher进程请求AMS。 AMS发送创建应用进程请求 ,Zygote进程接受请求并fork应用进程 客户端发送请求调 用 Process.start() 方法新建进程连 接 调 用 的 是 ZygoteState.connect() 方 法 , ZygoteState 是 ZygoteProcess 的 内 部 类 。ZygoteState里 用 的 LocalSocket

public static ZygoteState connect( LocalSocketAddress address) throws IOException {
DataInputStream zygoteInputStream = null ;
BufferedWriter zygoteWriter = null;
final LocalSocket zygoteSocket = new LocalSocket( ) ;
try { zygoteSocket . connect(address); zygoteInputStream = new DataInputStream( zygoteSocket .getInputStream()) ; zygoteWriter = new BufferedWriter( new OutputStreamWriter( zygoteSocket .getOutputStream()) , 256) ;
} catch (IOException ex) {
try { zygoteSocket .close() ;
} catch (IOException ignore) {
}throw ex ;
}return new ZygoteState(zygoteSocket , zygoteInputStream , zygoteWriter , Arrays .asList(abiListString .split(","))) ;
}

Zygote 处理客户端请求 Zygote 服 务 端 接 收 到 参 数 之 后 调 用 ZygoteConnection.processOneCommand() 处 理 参 数 ,并fork 进 程 最 后 通过 fifindStaticMain() 找到 ActivityThread 类的 main() 方法并执行 ,子进程就启动了

5、ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerproxy的关系

### ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系

在Android操作系统中,ActivityManager、ActivityManagerService、ActivityManagerNative和ActivityManagerProxy是与活动管理器相关的几个关键组件,它们协同工作以管理和监控应用程序的生命周期和系统资源。

1. **ActivityManager**:这是一个Android系统中的接口,定义了一系列方法,用于管理应用程序的活动(Activities)和其他相关的系统级功能。

2. **ActivityManagerService**:这是一个后台服务,负责实现ActivityManager接口中定义的方法。它是Android系统中管理活动和应用程序生命周期的核心服务。ActivityManagerService运行在系统的服务进程中,通常是system_server进程。

3. **ActivityManagerNative**:这是一个Binder接口,它是ActivityManagerService的客户端侧代理。ActivityManagerNative本身并不实现任何方法,而是作为一个Binder通信类存在,它的作用是将客户端的请求转发给ActivityManagerService。

4. **ActivityManagerProxy**:这是ActivityManagerNative的一个实现类,它实际上是一个Binder代理类,用于在客户端和ActivityManagerService之间进行Binder通信。当客户端调用ActivityManager的方法时,这些调用会被封装在ActivityManagerProxy中,并通过Binder机制传递给ActivityManagerService。

在客户端代码中,通常不会直接与ActivityManagerService交互,而是通过ActivityManagerNative和ActivityManagerProxy来间接调用ActivityManagerService提供的服务。这样的设计允许客户端代码透明地与ActivityManagerService通信,同时也支持跨进程通信,因为ActivityManagerService可能运行在不同的进程中。

总结来说,ActivityManager是一个接口,ActivityManagerService是实现该接口的服务,ActivityManagerNative是客户端与服务端通信的Binder接口,而ActivityManagerProxy是ActivityManagerNative的具体实现,它作为Binder代理在客户端和ActivityManagerService之间进行通信. 

6、如何使用Instrumentation来优化Android应用的性能

Instrumentation在Android中不仅用于测试,还可以用来优化应用性能。以下是一些使用Instrumentation来优化Android应用性能的方法:

  1. 生命周期耗时监测:通过Hook Instrumentation实现生命周期耗时监测。这涉及到反射获取ActivityThread的实例,然后替换其内部的Instrumentation对象为自定义的Instrumentation,这样就可以在Activity的生命周期方法前后插入自定义的日志或分析代码,从而监测生命周期的耗时情况[1]。

  1. 性能分析工具:Instrumentation提供了性能分析工具,可以帮助开发人员记录应用程序的响应时间、CPU和内存使用情况等指标。这些工具可以帮助开发人员识别应用程序中的性能瓶颈,以便进行针对性的优化[2]。

  1. 应用启动时间优化:通过Instrumentation可以监控应用的启动时间,包括冷启动、温启动和热启动的时间。根据监控数据,开发人员可以采取措施减少启动时间,例如优化资源加载、减少初始化代码量等[3]。

  1. 测试驱动开发:利用Instrumentation编写自动化测试,确保应用程序的各个组件在各种情况下都能正确运行。这种测试驱动的方式有助于提前发现潜在的性能问题,并确保在后续的开发中不会引入新的性能问题[2]。

  1. 内存泄漏检测:Instrumentation可以配合内存分析工具(如LeakCanary)来检测应用中的内存泄漏。通过Instrumentation触发GC(垃圾回收)并检查是否有未释放的对象,可以帮助开发人员及时发现和解决内存泄漏问题。

  1. CPU使用率监控:使用Instrumentation监控CPU的使用情况,分析哪些操作或函数导致CPU负载过高,进而进行优化。

  1. 网络请求分析:Instrumentation可以帮助监控网络请求的次数、大小和延迟,从而优化网络使用效率,减少不必要的请求或优化请求的内容。

通过上述方法,Instrumentation成为了Android应用性能优化的有力工具。开发人员可以结合具体的应用场景和性能瓶颈,灵活运用Instrumentation提供的功能,来提升应用的性能和用户体验。

7、如果我想做一个全面的Android应用性能优化,应该怎样开始?

开始全面的Android应用性能优化

要进行全面的Android应用性能优化,您可以按照以下步骤进行:

  1. 性能分析:首先,使用性能分析工具(如LeakCanary、MAT、StrictMode等)来识别内存泄漏、CPU使用率高的代码段、网络请求的瓶颈以及其他可能的性能问题。

  1. 内存优化:优化内存使用,包括减少内存泄漏、优化Bitmap的使用、避免内存抖动,以及优化数据结构和算法以减少内存消耗。

  1. 布局优化:减少布局层级,优化布局结构,使用ConstraintLayout替代嵌套的LinearLayout和RelativeLayout,使用merge标签和ViewStub来延迟加载布局[2]。

  1. 异步处理:避免在UI线程进行耗时操作,使用AsyncTask、HandlerThread或其他并发机制将耗时操作移至后台线程执行,以避免界面卡顿。

  1. 网络优化:减少网络请求的次数和大小,使用缓存策略(如OkHttp的缓存机制)来减少不必要的网络流量,优化网络请求的优先级和顺序。

  1. 启动优化:优化应用启动时间,包括减少启动时的工作量、优化冷启动流程、预加载必要的资源和服务。

  1. 电量优化:优化应用的电量使用,例如限制后台活动、优化网络策略、合理使用GPS和传感器等。

  1. 测试和验证:在不同的设备和操作系统版本上测试优化后的应用,确保性能提升同时保持兼容性和稳定性。

  1. 持续监控:即使在发布后,也应持续监控应用的性能,使用实时分析工具(如Firebase Performance Monitoring)来跟踪关键性能指标,并快速响应任何新出现的问题。

  1. 反馈循环:收集用户反馈,特别是关于性能的反馈,并将其纳入未来的优化工作中。

以上步骤结合了最新的性能优化技术和最佳实践,可以帮助您全面提升Android应用的性能

Android应用启动流程概述

Android应用的启动流程是一个相对复杂的过程,它涉及到多个系统组件和进程的协作。以下是Android应用启动的基本步骤:

  1. 用户交互:用户在设备的主屏幕点击应用图标,触发启动请求。

  1. 启动器(Launcher):启动器接收到用户的点击事件后,向系统的ActivityManagerService(AMS)发送一个Intent,请求启动指定的应用。

  1. AMS处理:AMS是Android系统中负责管理Activity的服务,它接收到来自启动器的启动请求后,会检查目标Activity是否已经存在于正在运行的进程中。如果不存在,AMS会向Zygote进程发送一个请求,要求它fork出一个新的进程来承载这个Activity。

  1. Zygote进程:Zygote是Android系统中的一个特殊进程,它被设计为一个共享进程,用于快速启动新的应用进程。当Zygote进程接收到来自AMS的fork请求时,它会复制自己的内存空间和文件描述符,创建一个全新的进程,这个新进程称为应用进程。

  1. ActivityThread:在新创建的应用进程中,Zygote进程会启动ActivityThread,这是一个Java进程的入口点,它负责管理应用的生命周期和消息循环。ActivityThread会加载应用的Dex字节码,并准备好应用环境。

  1. Activity的创建:ActivityThread会调用Looper.loop()来启动消息循环,并在消息循环中处理各种事件,包括创建Activity。ActivityThread会调用Activity的onCreate()、onStart()和onResume()方法,最终使得Activity显示在屏幕上。

启动流程的优化

为了优化Android应用的启动性能,可以考虑以下几个方面:

  • 减少启动时的工作量:避免在启动时进行不必要的计算和资源加载,比如延迟加载非关键资源和功能。

  • 优化布局:简化布局层次结构,使用ConstraintLayout等高效布局,减少布局的重绘和测量开销。

  • 预热资源:在应用启动前预先加载一些资源,比如在后台线程中预加载图像和字体,以减少启动时的等待时间。

  • 使用启动屏:在应用启动时显示一个简单的启动屏,让用户知道应用正在加载,同时也可以隐藏启动过程中的闪烁和延迟。

  • 避免立即执行耗时操作:在Activity的onCreate()方法中避免立即执行耗时的操作,可以将这些操作放到后台线程中去执行。

  • 使用ProGuard或R8进行代码混淆和压缩:这可以减少APK的体积,加快安装和启动速度。

  • 使用动态特性模块:通过动态特性模块(Dynamic Feature Module)来按需加载应用的某些部分,从而减少初次启动时的加载时间。

以上步骤和建议结合了最新的性能优化技术和最佳实践,可以帮助您全面提升Android应用的性能。

相关文章:

AMS概念以及面试相关整理

1、ActivityManagerService是什么?什么时候初始化的?有什么作用? ActivityManagerService(AMS)是什么? ActivityManagerService(简称AMS)是Android操作系统中的一个核心服务&#…...

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图,给虚拟机分配了120GB,已经占用116.9GB,开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是,虚拟机的bug:在虚拟机的ub…...

面试题-Elasticsearch集群架构和调优手段(超全面)

对于Elasticsearch(ES),我了解并有经验。在我之前的公司,我们有一个相对大型的ES集群,以下是该集群的架构和一些调优手段的概述: 1. 集群架构 集群规模:我们的ES集群由15个节点组成&#xff0c…...

python基础练习题6

1、找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def find_numbers(m,n):result []for num in range(m,n):if (num % 5 0 or num % 6 0) and not (num % 5 0 and num % 6 0):result.append(num)return resultprint(find_…...

Chrome 插件各模块使用 Fetch 进行接口请求

Chrome 插件各模块使用 Fetch 进行接口请求 常规网页可以使用 fetch() 或 XMLHttpRequest API 从远程服务器发送和接收数据,但受到同源政策的限制。 内容脚本会代表已注入内容脚本的网页源发起请求,因此内容脚本也受同源政策的约束,插件的来…...

内存可见性

内存可见性 一:内存可见性1.2: 二:解决内存可见性问题2.1 volatile关键字2.2:synchronized关键字解决内存可见性问题 一:内存可见性 public class Demo1 {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1new Thre…...

Android room 在dao中不能使用挂起suspend 否则会报错

错误&#xff1a; Type of the parameter must be a class annotated with Entity or a collection/array of it. kotlin.coroutines.Continuation<? super kotlin.Unit> $completion); 首先大家检查一下几个点 一、kotlin-kapt 二、 是否引入了 room-ktx 我是2024年…...

【stable diffusion扩散模型】一篇文章讲透

目录 一、引言 二、Stable Diffusion的基本原理 1 扩散模型 2 Stable Diffusion模型架构 3 训练过程与算法细节 三、Stable Diffusion的应用领域 1 图像生成与艺术创作 2 图像补全与修复 3 其他领域 四、Stable Diffusion的优势与挑战 &#x1f449;优势 &#x1f…...

数据链路层之信道:数字通信的桥梁与守护者

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后...

Spring Boot + Vue 实现文件导入导出功能

文章目录 1、概述2、后端实现&#xff08;Spring Boot&#xff09;3、前端实现&#xff08;Vue&#xff09;4、总结 1、概述 ​ 在现代Web应用开发中&#xff0c;文件的导入导出是一个常见的需求。Spring Boot作为后端开发的强大框架&#xff0c;搭配前端框架Vue&#xff0c;可…...

vue watch 深度监听

vue2文档&#xff1a;API — Vue.js vue3文档&#xff1a;侦听器 | Vue.js watch 可以用来监听页面中的数据&#xff0c;但如果监听的源是对象或数组&#xff0c;则使用深度监听&#xff0c;强制深度遍历源&#xff0c;以便在深度变更时触发回调。 一&#xff0c;监听 <t…...

Qt源码调试步骤记录

1.源码&#xff1a; 两种方式&#xff0c;要么安装qt时选择source&#xff0c;要么从官网下载源码&#xff0c;然后在qt creator中设置路径。二选一即可。我选的第二种。 1.1.第一种&#xff0c;安装时选择source&#xff1a; 1.2.第二种&#xff0c;下载源码设置路径&#x…...

大数据面试英文自我介绍参考(万字长文)

发现有一个怪圈,如果码农年龄35+,除非非常匹配,不然在国内企业筛选可能就筛选不过。国外码农可以干到40+、50+。一些外企,对年龄35+的码农依然青睐。这些外企对英文是有要求,通常是要英文自我介绍,下面提供一些英文自我介绍参考。 参考1: Good morning/afternoon, I a…...

外包干了5天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

Docket常见的软件部署1

1 安装MySQL # 查看MySQL镜像 docker search mysql # 拉起镜像 docker pull mysql:5.7 # 创建MySQL数据映射卷&#xff0c;防止数据不丢失 mkdir -p /hmoe/tem/docker/mysql/data/ # 启动镜像 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /home…...

Qt源程序编译及错误问题解决

Error 5 while parsing C:/qt-everywhere-src-6.6.2/qt-build/qtdeclarative/src/qmlmodels/meta_types/qt6qmlmodels_release_metatypes.json: illegal value .json 文件为空文件0字节&#xff0c;加 “[]”&#xff0c;不要引号。可以解决这类错误。 Qt编译 Qt for Windows…...

作业练习(python)

第一题&#xff1a; cel eval(input()) fah 9 / 5 * cel 32 print("%.1f" % fah) 第二题&#xff1a; radius, length eval(input()) area radius * radius * 3.14159267 volume area * length print("%.2f" % area) print("%.2f" …...

Wireshark使用相关

1.wireshark如何查看RST包 tcp.flags.reset1 RST表示复位&#xff0c;用来异常的关闭连接&#xff0c;在TCP的设计中它是不可或缺的。发送RST包关闭连接时&#xff0c;不必等缓冲区的包都发出去&#xff08;不像上面的FIN包&#xff09;&#xff0c;直接就丢弃缓存区的包发送R…...

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...