把Android/IOS卡顿掌握了,牛的让你飞起

Android 性能优化--卡顿,ANR ,方法耗时监测 常见anr input,点击事件:5秒; contentprovider:10秒; Broadcast:前台10秒,后台60秒; 服务 service:前台20秒,后台200秒 原理 埋炸弹和拆炸弹 当启动service的时候,会调用 scheduleCreateService方法创建service app.thread.scheduleCreateService(r, r.serviceInfo, mAm.compatibilityInfoForPackageLocke. 阅读详情

“我在秒杀iPhone XS的支付页面卡了3秒,最后没抢到”,用户嘶声力竭地反馈了一个卡顿问题。

“莫慌莫慌”,等我打开Android Studio, 用上一讲学到的几个工具分析一下就知道原因了。

“咦,在我这里整个支付过程丝滑般流畅”。这个经历让我明白,卡顿跟崩溃一样需要“现场信息”。因为卡顿的产生也是依赖很多因素,比如用户的系统版本、CPU负载、网络环境、应用数据等。

脱离这个现场,我们本地难以复现,也就很难去解决问题。但是卡顿又非常影响用户体验的,特别是发生在启动、聊天、支付这些关键场景,那我们应该如何去监控线上的卡顿问题,并且保留足够多的现场信息协助我们排查解决问题呢?

卡顿监控

前面我讲过监控ANR的方法,不过也提到两个问题:一个是高版本的系统没有权限读取系统的ANR日志;另一个是ANR太依赖系统实现,我们无法灵活控制参数,例如我觉得主线程卡顿3秒用户已经不太能忍受,而默认参数只能监控至少5秒以上的卡顿。

所以现实情况就要求我们需要采用其他的方式来监控是否出现卡顿问题,并且针对特定场景还要监控其他特定的指标。

1. 消息队列

我设计的第一套监控卡顿的方案是基于消息队列实现,通过替换Looper的Printer实现。在2013年的时候,我写过一个名为WxPerformanceTool的性能监控工具,其中耗时监控就使用了这个方法。后面这个工具在腾讯公共组件做了内部开源,还获得了2013年的年度十佳组件。

还没庆祝完,很快就有同事跟我吐槽一个问题:线上开启了这个监控模块,快速滑动时平均帧率起码降低5帧。我通过Traceview一看,发现是因为上面图中所示的大量字符串拼接导致性能损耗严重。

后来很快又想到了另外一个方案,可以通过一个监控线程,每隔1秒向主线程消息队列的头部插入一条空消息。假设1秒后这个消息并没有被主线程消费掉,说明阻塞消息运行的时间在0~1秒之间。换句话说,如果我们需要监控3秒卡顿,那在第4次轮询中头部消息依然没有被消费的话,就可以确定主线程出现了一次3秒以上的卡顿。

这个方案也存在一定的误差,那就是发送空消息的间隔时间。但这个间隔时间也不能太小,因为监控线程和主线程处理空消息都会带来一些性能损耗,但基本影响不大。

2. 插桩

不过在使用了一段时间之后,我感觉还是有那么一点不爽。基于消息队列的卡顿监控并不准确,正在运行的函数有可能并不是真正耗时的函数。这是为什么呢?

我画张图解释起来就清楚了。我们假设一个消息循环里面顺序执行了A、B、C三个函数,当整个消息执行超过3秒时,因为函数A和B已经执行完毕,我们只能得到的正在执行的函数C的堆栈,事实上它可能并不耗时。

不过对于线上大数据来说,因为函数A和B相对比较耗时,所以抓取到它们的概率会更大一些,通过后台聚合后捕获到函数A和B的卡顿日志会更多一些。

这也是我们线上目前依然使用基于消息队列的方法,但是肯定希望可以做到跟Traceview一样,可以拿到整个卡顿过程所有运行函数的耗时,就像下面图中的结果,可以明确知道其实函数A和B才是造成卡顿的主要原因。

既然这样,那我们能否直接利用Android Runtime函数调用的回调事件,做一个自定义的Traceview++呢?

答案是可以的,但是需要使用Inline Hook技术。我们可以实现类似Nanoscope先写内存的方案,但考虑到兼容性问题,这套方案并没有用到线上。

对于大体量的应用,稳定性是第一考虑因素。那如果在编译过程插桩,兼容性问题肯定是OK的。上一讲讲到systrace可以通过插桩自动生成Trace Tag,我们一样也可以在函数入口和出口加入耗时监控的代码,但是需要考虑的细节有很多。

  • **避免方法数暴增**。在函数的入口和出口应该插入相同的函数,在编译时提前给代码中每个方法分配一个独立的ID作为参数。
  • **过滤简单的函数**。过滤一些类似直接return、i++这样的简单函数,并且支持黑名单配置。对一些调用非常频繁的函数,需要添加到黑名单中来降低整个方案对性能的损耗。

基于性能的考虑,线上只会监控主线程的耗时。微信的Matrix使用的就是这个方案,因为做了大量的优化,所以最终安装包体积只增大1~2%,平均帧率下降也在2帧以内。虽然插桩方案对性能的影响总体还可以接受,但只会在灰度包使用。

插桩方案看起来美好,它也有自己的短板,那就是只能监控应用内自身的函数耗时,无法监控系统的函数调用,整个堆栈看起来好像“缺失了”一部分。

3. Profilo

2018年3月,Facebook开源了一个叫Profilo的库,它收集了各大方案的优点,令我眼前一亮。具体来说有以下几点:

第一,集成atrace功能。ftrace所有性能埋点数据都会通过trace_marker文件写入内核缓冲区,Profilo通过PLT Hook拦截了写入操作,选择部分关心的事件做分析。这样所有systrace的探针我们都可以拿到,例如四大组件生命周期、锁等待时间、类校验、GC时间等。

不过大部分的atrace事件都比较笼统,从事件“B|pid|activityStart”,我们并不知道具体是哪个Activity的创建。同样我们可以统计GC相关事件的耗时,但是也不知道为什么发生了这次GC。

第二,快速获取Java堆栈。很多同学有一个误区,觉得在某个线程不断地获取主线程堆栈是不耗时的。但是事实上获取堆栈的代价是巨大的,它要暂停主线程的运行。

Profilo的实现非常精妙,它实现类似Native崩溃捕捉的方式快速获取Java堆栈,通过间隔发送SIGPROF信号,整个过程如下图所示。

Signal Handler捕获到信号后,拿取到当前正在执行的Thread,通过Thread对象可以获取当前线程的ManagedStack,ManagedStack是一个单链表,它保存了当前的ShadowFrame或者QuickFrame栈指针,先依次遍历ManagedStack链表,然后遍历其内部的ShadowFrame或者QuickFrame还原一个可读的调用栈,从而unwind出当前的Java堆栈。通过这种方式,可以实现线程一边继续跑步,我们还可以帮它做检查,而且耗时基本忽略不计。代码可以参照:Profilo::unwind和StackVisitor::WalkStack。

不用插桩、性能基本没有影响、捕捉信息还全,那Profilo不就是完美的化身吗?当然由于它利用了大量的黑科技,兼容性是需要注意的问题。它内部实现有大量函数的Hook,unwind也需要强依赖Android Runtime实现。Facebook已经将Profilo投入到线上使用,但由于目前Profilo快速获取堆栈功能依然不支持Android 8.0和Android 9.0,鉴于稳定性问题,建议采取抽样部分用户的方式来开启该功能。

先小结一下,不管我们使用哪种卡顿监控方法,最后我们都可以得到卡顿时的堆栈和当时CPU运行的一些信息。大部分的卡顿问题都比较好定位,例如主线程执行一个耗时任务、读一个非常大的文件或者是执行网络请求等。

其他监控

除了主线程的耗时过长之外,我们还有哪些卡顿问题需要关注呢?

Android Vitals是Google Play官方的性能监控服务,涉及卡顿相关的监控有ANR、启动、帧率三个。尤其是ANR监控,我们应该经常的来看看,主要是Google自己是有权限可以准确监控和上报ANR。

对于启动和帧率,Android Vitals只是上报了应用的区间分布,但是不能归纳出问题。这也是我们做性能优化时比较迷惑的一点,即使发现整体的帧率比过去降低了5帧,也并不知道是哪里造成的,还是要花很大的力气去做二次排查。

能不能做到跟崩溃、卡顿一样,直接给我一个堆栈,告诉我就是因为这里写的不好导致帧率下降了5帧。退一步说,如果做不到直接告诉我堆栈,能不能告诉我是因为聊天这个页面导致的帧率下降,让我缩小二次排查的范围。

1. 帧率

业界都使用Choreographer来监控应用的帧率。跟卡顿不同的是,需要排除掉页面没有操作的情况,我们应该只在界面存在绘制的时候才做统计。

那么如何监听界面是否存在绘制行为呢?可以通过addOnDrawListener实现。

getWindow().getDecorView().getViewTreeObserver().addOnDrawListener

我们经常用平均帧率来衡量界面流畅度,但事实上电影的帧率才24帧,用户对于应用的平均帧率是40帧还是50帧并不一定可以感受出来。对于用户来说,感觉最明显的是连续丢帧情况,Android Vitals将连续丢帧超过700毫秒定义为冻帧,也就是连续丢帧42帧以上。

因此,我们可以统计更有价值的冻帧率。冻帧率就是计算发生冻帧时间在所有时间的占比。出现丢帧的时候,我们可以获取当前的页面信息、View信息和操作路径上报后台,降低二次排查的难度。

正如下图一样,我们还可以按照Activity、Fragment或者某个操作定义场景,通过细化不同场景的平均帧率和冻帧率,进一步细化问题排查的范围。

2. 生命周期监控

Activity、Service、Receiver组件生命周期的耗时和调用次数也是我们重点关注的性能问题。例如Activity的onCreate()不应该超过1秒,不然会影响用户看到页面的时间。Service和Receiver虽然是后台组件,不过它们生命周期也是占用主线程的,也是我们需要关注的问题。

对于组件生命周期我们应该采用更严格地监控,可以全量上报。在后台我们可以看到各个组件各个生命周期的启动时间和启动次数。

有一次我们发现有两个Service的启动次数是其他的10倍,经过排查发现是因为频繁的互相拉起导致。Receiver也是这样,而且它们都需要经过System Server。曾经有一个日志上报模块通过Broadcast来做跨进程通信,每秒发送几千次请求,导致系统System Server卡死。所以说每个组件各个生命周期的调用次数也是非常有参考价值的指标。

除了四大组件的生命周期,我们还需要监控各个进程生命周期的启动次数和耗时。通过下面的数据,我们可以看出某些进程是否频繁地拉起。

对于生命周期的监控实现,我们可以利用插件化技术Hook的方式。但是Android P之后,我还是不太推荐你使用这种方式。我更推荐使用编译时插桩的方式,后面我会讲到Aspect、ASM和ReDex三种插桩技术的实现,敬请期待。

3. 线程监控

Java线程管理是很多应用非常头痛的事情,应用启动过程就已经创建了几十上百个线程。而且大部分的线程都没有经过线程池管理,都在自由自在地狂奔着。

另外一方面某些线程优先级或者活跃度比较高,占用了过多的CPU。这会降低主线程UI响应能力,我们需要特别针对这些线程做重点的优化。

对于Java线程,总的来说我会监控以下两点。

  • 线程数量。需要监控线程数量的多少,以及创建线程的方式。例如有没有使用我们特有的线程池,这块可以通过got hook线程的nativeCreate()函数。主要用于进行线程收敛,也就是减少线程数量。
  • 线程时间。监控线程的用户时间utime、系统时间stime和优先级。主要是看哪些线程utime+stime时间比较多,占用了过多的CPU。**正如上一期“每课一练”所提到的,可能有一些线程因为生命周期很短导致很难发现,这里我们需要结合线程创建监控。**

看到这里可能有同学会比较困惑,卡顿优化的主题就是监控吗?导致卡顿的原因会有很多,比如函数非常耗时、I/O非常慢、线程间的竞争或者锁等。其实很多时候卡顿问题并不难解决,相较解决来说,更困难的是如何快速发现这些卡顿点,以及通过更多的辅助信息找到真正的卡顿原因。

就跟在本地使用各种卡顿分析工具一样,卡顿优化的难点在于如何把它们移植到线上,以最少的性能代价获得更加丰富的卡顿信息。当然某些卡顿问题可能是I/O、存储或者网络引发的,后面会还有专门的内容来讲这些问题的优化方法。

总结

今天我们学习了卡顿监控的几种方法。随着技术的深入,我们发现了旧方案的一些缺点,通过不断地迭代和演进,寻找更好的方案。

Facebook的Profilo实现了快速获取Java堆栈,其实它参考的是JVM的AsyncGetCallTrace思路,然后适配Android Runtime的实现。systrace使用的是Linux的ftrace,Simpleperf参考了Linux的perf工具。还是熟悉的配方,还是熟悉的味道,我们很多创新性的东西,其实还是基于Java和Linux十年前的产物。

还是回到我在专栏开篇词说过的,切记不要浮躁,多了解和学习一些底层的技术,对我们的成长会有很大帮助。日常开发中我们也不能只满足于完成需求就可以了,在实现上应该学会多去思考内存、卡顿这些影响性能的点,我们比别人多想一些、多做一些,自己的进步自然也会更快一些。

ESPnet语音模型移动端部署实战:从PyTorch到iOS/Android的完整指南 语音识别与语音合成作为人工智能的核心技术,其核心原理在于将音频信号转化为机器可理解的序列数据。通过深度学习模型,特别是基于Transformer的Conformer等先进架构,能够高效地建模语音的时序依赖关系,实现高精度的识别与合成。这项技术的价值在于赋能各类智能设备实现自然的人机交互,其应用场景广泛覆盖了智能助手、实时转录、车载系统及工业物联网等领域。本文聚焦于将前沿的ESPnet语音处理模型部署到资源受限的移动设备这一工程挑战,深入探讨了如何通过模型轻量化、ONNX格式转换及移动端推理引擎集成等关键技术 阅读详情

相关推荐

避坑指南:为什么uniapp的overflow-y在安卓上不生效?5分钟搞定滚动问题

本文深入解析了在UniApp开发中,overflow-y属性在安卓端失效的根本原因,即WebView渲染引擎与原生滚动机制的差异。核心解决方案是使用官方scroll-view组件替代CSS滚动,它通过调用原生滚动能力确保了跨端兼容性与流畅体验。文章提供了详细的改造步骤、高级配置及性能优化建议,帮助开发者快速解决滚动问题。

mm9012的博客 888

软件测试之SDK开发(ios)——ANR监控

1、什么是ANR ANR(Application Not Responding):应用程序无响应,即通常我们说的卡顿,卡顿就是在应用使用过程中出现界面不响应或者界面渲染粘滞的情况。而应用界面的渲染以及事件响应是在主线程完成的,出现卡顿的原因可以归结为主线程阻塞。在开发过程中,遇到的造成主线程阻塞的原因可能是: 主线程在进行大量I/O操作:为了方便代码编写,直接在主线程去写入大量数据; 主线程在进...

lfdanding的专栏 3044

UE5安卓移动端内存分析实战:工具链、案例与监控体系构建

内存管理是移动应用与游戏开发中的核心性能优化领域,其原理在于对应用运行时动态分配与释放的计算机资源进行精细管控。在技术价值层面,高效的内存管理能直接提升应用稳定性、减少崩溃并优化用户体验,尤其在硬件资源受限的移动设备上至关重要。其应用场景广泛覆盖了移动游戏、大型应用及任何对性能有严苛要求的软件。本文聚焦于虚幻引擎5(UE5)在安卓平台的内存分析实践,深入探讨了如何利用引擎内置工具如Stat命令与Memory Insights进行监控,并结合Android Profiler等系统级工具进行深度剖析,通过实战案

weixin_34110970的博客 243

Android&iOS崩溃情况总结

掌握了崩溃的情况,不至于盲目测试,也能给开发带来有利信息,便于开发排查定位问题。因此,作为测试工程师,很有必要掌握该项技能。 1. Android崩溃 1.1 ANR(ApplicationNotResponse) 发生场景:应用发生ANR 崩溃症状:系统弹出窗口询问用户选择“ForceClose”或者“Wait”。 “ForceClose”将杀掉发生ANR的应用进程。“Wait”将会等待系统择机恢复此应用进程。 发生原因: (1)应用主线程卡住,对其他请求响应超时。 (...

a653202的博客 1063

Unity项目移植移动端全攻略:从性能优化到平台适配实战

在游戏开发领域,跨平台移植是提升产品覆盖与用户体验的关键技术环节。其核心原理在于针对不同硬件架构与性能特性,对渲染管线、资源管理与输入交互进行系统性重构。这项技术的核心价值在于最大化代码复用,同时确保在各终端设备上均能提供流畅稳定的体验,尤其在移动端碎片化严重的生态中,性能优化与兼容性适配成为重中之重。典型的应用场景包括将基于PC或主机开发的游戏项目,高效、高质量地部署至iOS与Android平台,以触达更广泛的移动用户群体。本文聚焦于Unity引擎,深入探讨了在移植过程中如何驯服性能瓶颈、重构输入系统以及

weixin_33688840的博客 483

UniApp H5加载慢?5招UniApp优化方法让你的应用流畅到飞起!

减少没用的东西只更新该更新的部分UniApp 虽然是“跨端”,但性能也能搞得像原生一样猛。别再一味埋头加功能,抽空搞搞这些“被埋藏”的优化项,加载速度不止能追上对手,说不定还能拉开差距!📌如果你也踩过这些坑,欢迎评论区交流~有需求我后续再更新一波小程序/APP端优化!👀。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 881

不一样的 Android 堆栈抓取方案

随着需求的不断迭代,APP 遇到的问题越来越多,卡顿,ANR,异常等等问题接踵而来,那么简简单单某个时刻的堆栈信息已经不能满足我们的需求了,我们的目光逐渐转移到了每个时刻的堆栈上,如果能获取一个时间段内,每个时刻的堆栈信息,那么卡顿,以及 ANR 的问题也将被解决。例如,它可以用来找出当前线程堆栈上哪些函数调用了特定函数,或者收集特定函数的参数。我们是否可以简化这个流程,提高抓栈效率呢,理论上是可以的,我们只需要自己将这个流程复写一份,然后抛弃部分的数据,优化数据获取时间,同样可以做到更高效的抓栈体验。

idaretobe的专栏 2914

一个用于生产性能跟踪的库。-Android开发

Profilo:一个Android性能库简介Profilo是一个Android库,用于从应用程序的生产版本中收集性能跟踪。 索引入门内部体系结构Trac Profilo:一个Android性能库简介Profilo是一个Android库,用于从应用程序的生产版本中收集性能跟踪。 索引入门内部体系结构跟踪处理和分析API当前,没有一个API是稳定的,它们在发布之前会发生变化(主要是为了使它们更易于使用)。 用法示例java / main / com / facebook / profilo / sample中的示例应用程序显示了API的最基本用法。 您还可以找到预建的

ios崩溃日志收集_【建议收藏】一周打造Android崩溃监控平台(5000字精华)

前言今天给大家分享的是 阿里UC的移动应用线上监控体系建设,如何快速打造一个Android崩溃监控平台。 阿里UC有多款APP,亿级的用户量, 怎么通过线上监控体系,保障APP质量和用户体验,提高研发效能,这是今天分享的重点。 岳鹰全景监控的业务大图为什么需要移动应用线上监控?移动互联网在过去十几年的发展非常迅猛。在移动互联网“天下武功,唯快不破”这种环境下,我们几乎每天都面临着“尽快上线,越快...

weixin_39881387的博客 636

TSMaster MBD模块实战:如何用Simulink模型快速搭建汽车电子测试环境

本文实战演示了如何利用TSMaster的MBD模块,将Simulink模型快速部署为汽车电子自动化测试环境的核心。通过建立模型与TSMaster系统变量的实时数据通道,并利用数据仓库统一数据定义,工程师能无缝连接算法仿真与真实总线网络,显著提升从模型到HIL测试的验证效率。

php55的博客 206

Ren’py教程《从入门到精通》

Ren’py是什么?Ren'py是一款用于制作视觉小说、冒险游戏、galgame的游戏制作工具,被来自世界各地的数千名创作者使用。Ren'py的名字由Ren’ai和Python混合而成,而Python也是Ren'py所使用的环境语言。Ren'py可以帮助你使用文字、图像和声音来讲述在计算机和移动设备上运行的交互式故事。这些既可以是视觉小说,也可以是生活模拟游戏。易于学习的脚本语言允许 任何人都可以有效地编写大型视觉小说,而它的Python 脚本足以应对复杂的 模拟游戏。

2302_77140651的博客 1万+

Cleer Arc5耳机与安卓/iOS兼容性差异分析

本文深入分析Cleer Arc5耳机在iOS与安卓系统间的体验差异,揭示蓝牙协议栈、音频编码(AAC/SBC)、HFP通话协议及AVRCP控制指令在不同平台的表现差异,指出音质、连接稳定性与功能完整性的关键影响因素,并提出固件优化、编码协商、日志诊断等改进建议。

weixin_42126677的博客 728

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

MonoGame跨平台移动端部署实战:Android与iOS适配全攻略

跨平台开发是现代游戏工程中的重要实践,其核心在于通过一套代码库适配多个操作系统和设备。其原理通常基于共享的核心逻辑层与平台特定的运行时层相结合,利用中间件或框架抽象底层硬件差异。这种模式的技术价值在于显著提升开发效率、降低维护成本,并最大化产品的市场覆盖范围。在应用场景上,尤其适用于需要同时登陆移动端(Android/iOS)、PC和主机的独立游戏或中小型项目。本文聚焦于使用MonoGame框架进行跨平台开发时,在移动端遇到的实际工程挑战,例如针对不同屏幕分辨率的视口适配策略、触控输入与虚拟控制器的实现,以

weixin_34238633的博客 399

S32K144-EB tresos GPT驱动模块配置详解

GPT通用计时器,在S32K144这款芯片上,有4个外设模块,最多38各通道可以作为GTP的计时器通道,具体详细的大家可以去看芯片手册。这里咱们只管怎么用EB来配置GPT驱动。

小胡同学的工程师学习之路 3864

从光斑图到锤形优化:一次搞定Zemax双胶合透镜的像散与场曲问题

本文详细解析了Zemax双胶合透镜设计中像散与场曲问题的诊断与优化方法。从光斑图分析到锤形优化技巧,提供了完整的光学设计实战指南,帮助设计师快速定位问题并有效改善系统性能,特别适合光学设计工程师和Zemax使用者参考。

weixin_27134495的博客 231

Android Studio MAC M1 安装模拟器

这段时间被Androi studio的模拟器折磨的头疼。作为一名Android 开发者,怎么不能用模拟器呢。于是在网上追随了很久才弄出来的办法。借鉴了很多大牛的办法。 本人第一次出教程。说的不清楚的地方还望大家海涵。如果按照我的教程弄出来了,请给我评论一句老铁666. 关于Google在github发布的试用版本模拟器我是安装怎么都运行不起来。所以很纠结。正题。 1:打开AVD Mannger 点击Create 模拟器。 点击下一步。 将会看到这个界面,当然这个是安装成功..

qq_25912185的博客 6517

【Reality Capture 】01:Reality Capture1.5中文版安装教程(附安装包下载)

本文详细介绍了Reality Capture 1.5中文版的安装步骤。首先,下载并解压Reality Capture v1.4.0汉化版安装包,运行EpicInstaller并更改安装路径。接着,启动Epic Games Launcher,登录或注册账号后下载并安装软件。安装完成后,进入主界面并设置中文语言。此外,还提供了中文补丁的拷贝方法,将ui.xml和RealityCapture_CHS.exe文件分别放置到指定目录,并运行RealityCapture_CHS.exe以完成汉化。最后,文章提供了Rea

智慧空间实验室 1749

sd容量百分比 android,android手机4G内存和6G相差多少?

PC在我们的工作和生活中扮演着重要的角色,要想获得良好的体验,离不开核心硬件的支持。而如今的智能手机,完全可以称之为微型计算机,它有着跟PC非常相似的结构,CPU(处理器)、RAM(运行内存)和ROM(机身存储)都是耳熟能详的元件名称。而随着相关技术产业的进步,智能机的处理器采用14nm制程工艺、8核心结构和2GHz以上主频已经是喜闻乐见,对应的运存规格最高也已经达到6GB,甚至有搭载8GB运存机...

weixin_39620535的博客 277

HTML满屏跳动的爱心(完整代码)

HTML语言实现满屏跳动爱心的完整代码。

AIGC 12万+

四旋翼飞行器建模(一)

四旋翼飞行器的姿态运动学和姿态动力学建模方法。

加斯顿工程师的博客 685

鸿蒙HarmonyOS与Android开发选择哪个更合适?_android开发还是鸿蒙开发

508)]

2401_84160325的博客 895

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

2026年安卓跨端开发选型:主流框架优劣势与工程落地

在移动应用开发领域,如何平衡多端交付效率与原生体验,是团队技术决策的核心命题。跨端框架通过自绘渲染、原生桥接或共享业务逻辑等不同原理,试图在性能、包体积与开发成本之间寻找最优解。理解这些框架的技术价值,尤其是在安卓生态中面临的ROM碎片化、SDK适配与长期维护挑战,是进行技术选型的基础。从面向高频业务的UI框架到共享逻辑的工程方案,各具适用场景。本文聚焦安卓平台视角,系统对比Flutter与React Native等主流方案的核心差异、实践路径与性能优化经验,为团队和个人开发者在复杂的技术选项前提供一个务实

weixin_33806859的博客 319

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

移动端H5性能优化实战:从首屏加载到渲染卡顿的完整方案

移动端网页的流畅度直接决定用户体验,加载白屏、滑动掉帧、交互延迟等问题往往源于对关键渲染路径和浏览器渲染机制的理解不足。性能指标如LCP、FPS、INP是量化卡顿的标尺,而优化核心在于减少主线程负担、控制DOM规模、合理利用缓存与网络资源。通过关键CSS内联、图片懒加载、路由拆包、虚拟滚动、transform/opacity动画、passive事件监听等手段,可系统提升页面响应速度与稳定性。应用场景覆盖首屏加载、无限列表、交互动效及弱网环境,最终形成一套可量化、可复盘的移动端H5性能优化实践方法论,帮助开发

weixin_29535577的博客 221

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

受裁员大环境影响,2024年要不要入坑鸿蒙?_2024鸿蒙开发失业

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_84185145的博客 1244

PeekPili(羊壳),支持MPV,MDK,EXO内核,无广告,极致流畅的播放器

PeekPili(羊壳)是一款支持 MPV、MDK、EXO 三大内核的全能无广告播放器,聚合 B 站与 TVBox 全网影视资源,还能听音乐、看小说漫画,播放流畅无广告,功能丰富操作简单,一站式满足所有娱乐需求。

YouZuoGuiXiao的博客 7975
上一篇: 系统设计目标(一):如何提升系统性能?
下一篇: 执行 react-native run-android 时,如果出现以下错误,该怎么办
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值