优化
文章平均质量分 87
锐湃
这个作者很懒,什么都没留下…
展开
-
垃圾回收原理-流程篇
当垃圾回收算法是 CC(并发复制)的时候,compactiing_gc 是true,从 compacting 这个词加上过去一些垃圾回收算法八股文的学习,我们可以推测,这个代表的应该是是否移动对象,压缩碎片空间的意思。kGcCauseForNativeAlloc: NativeAllocationGcWatermark 超出的时候调用的,这个涉及到native分配的机制,感兴趣的也可以研究一下。返回了本次gc的类型。分别是不执行gc、回收本次分配的对象、回收ZtgoteSpace之外的对象、完整的回收。转载 2024-09-30 10:54:46 · 33 阅读 · 0 评论 -
主线程锁监控原理和实现
到这里我们基本把主线程锁等待监控的方案思路和关键技术点过了一遍,通过上述方法,我们就能实现我们自己的主线程锁监控。Android主线程锁监控原理和实现。转载 2024-09-30 10:49:15 · 53 阅读 · 0 评论 -
Android系统进程优先级策略-ADJ
进程-Process 是程序的一个运行实例。通常会有唯一一个pid与之对应。但pid不是绝对唯一的,当进程死亡后pid会被回收给另外的进程使用。在Android世界里,App开发者很容易认为系统的四大组件就是进程的载体,实际上,它们不能算是完整的进程实例,最多只能算是进程的组成部分。转载 2024-09-23 15:57:15 · 311 阅读 · 0 评论 -
Android Context动态升降级与Context权限范围限定
Android 的 Context 大家肯定是不陌生了,它是安卓开发中不可或缺的概念,它允许我们访问系统资源,管理应用程序的生命周期,并与系统交互。实际开发中我们在使用 Toast,使用 Dialog,启动 Activity 与 Service ,加载资源,操作数据库,获取 App 相关的文件路径,创建 View 等操作时,都会涉及到一个 Context 引用。转载 2024-09-23 10:05:58 · 251 阅读 · 0 评论 -
为什么View的 onDetachedFromWindow 方法不一定执行
其实 setView 是在 onResume 方法之后,内部流程是通过 PhoneWindow 获取 WindowManagerImpl 来调用 addView 方法,其内部会调用 WindowManagerGlobal.addView 方法,最后调到 ViewRootImpl 的 setView 方法。从源码中可以看到,View 的 onDetachedFromWindow 方法其内部是由 View 的 dispatchDetachedFromWindow 调用的。转载 2024-09-10 14:46:48 · 44 阅读 · 0 评论 -
动态权限申请 | 2次不允许权限导致申请权限不再弹框
shouldShowRequestPermissionRationale() 是 Android 系统中的一个 API,用于检查用户是否应该看到权限请求解释. 当您第一次请求一个危险权限时,系统会自动显示一个解释对话框,说明该权限的用途以及为什么您的应用需要它。14平台,录音应用需要申请麦克风权限,点击录音按钮时候会先检测是否有麦克风权限,如果有则直接开始录音,否则申请麦克风权限,当用户测试时候2次出现权限申请弹框都都选择不允许,第三次次就不再权限申请弹框。false: 表示用户不应该看到权限请求解释。转载 2024-09-06 20:07:52 · 145 阅读 · 0 评论 -
大厂 Android 可视化埋点实现
viewID是根据view的层级来确定的,如果项目进行重构或者变更层级,相同view的viewID就会变化,导致很多view要重新配置,有一种约束ID的方案,就是单独生成一个view与viewID的对应表,但是这样在添加新view时又要做相应的对应,也会带来开发上的不便利,所以目前还是维持现有的生成viewID的方案,当遇到重构或者层级变动的问题时就只能将上报的点迁移并重新生成viewID再上报,这是一个待优化的方向,后续想到合适的方案时会将其优化。然后在回调中做相应的操作,可以实现代码解藕。转载 2024-09-06 10:38:30 · 676 阅读 · 0 评论 -
不同版本上 Bitmap 内存分配与回收对比
到这里,Bitmap 的分配和回收过程就分析完了。你会发现在 Android 8.0 以前的版本,Bitmap 的像素数据是存在 Java 堆的,Bitmap 数据放在 Java 堆容易造成 Java OOM,也没有完全利用起来系统 Native 内存。那么,有没有可能让低版本也将 Bitmap 数据存在 Native 层呢?关注我,带你建立核心竞争力,我们下次见。参考资料管理位图内存 —— Android 官方文档。转载 2024-09-05 16:27:11 · 383 阅读 · 0 评论 -
Android 15 大变更:支持 16K 内存分页,所有 native app 必须重编译~
一直以来,Android 系统仅支持 4KB 的内存分页大小,这在一定程度上限制了整体的性能。而随着设备制造商不断打造具有更大物理内存 (RAM) 的设备,这些设备中的许多可能会配置 16 KB(最终更大)的分页大小,作为 Android 系统设计者,是时候考虑是否需要支持 16KB 的设备了。所以,Google 团队的和于 2023 年针对 16KB 分页大小的 Android 性能表现进行了详细测试。转载 2024-09-05 16:20:54 · 512 阅读 · 0 评论 -
启动优化实践 - 秒开率从17%提升至75%
启动性能是App使用体验的门面,耗时过长会降低用户使用兴趣。对于开发者来说,通过各种技术手段来提升启动性能缩减启动时长,对整站业务的各项指标提升都会有较大帮助。因此,秒开率优化也成为了各个客户端团队在体验优化方向上十分重要的一环。本文将会结合我自己在项目中优化启动速度的经验,跟大家分享下,我眼里的科学的启动速度优化思路。在我的眼里,科学的优化策略是通用的,不管是针对什么性能指标不管是针对什么课题,思路是差不多的。比如这期的分享是启动优化,其实跟上期分享的。转载 2024-09-05 11:04:27 · 498 阅读 · 0 评论 -
包体积优化 · 彩蛋篇 · Android编译期PNG自动化转换WEBP
大家都知道 png 是比较占用App体积的,有没有工具可以在打包前(比如 assembleDebug、assembleRelease)自动去转化所有的 png 图片,包括第三方依赖库里面的呢?之前不经意间发现有一个神器cwebp 转化工具,是不是可以借鉴这种工具自己写个Plugin完成图片转换,同时支持检查大图片,图片大小可配置。话不多说,说干就干~编写插件前,需要思考几个业务痛点怎么拿到所有的 res 资源呢?自动化转换工具Task 的执行时机点?转载 2024-09-05 10:52:44 · 93 阅读 · 0 评论 -
Android - 修改屏幕的density,竟然会导致获取的dimension是错误的?
最后,我们来做个总结。在我们修改屏幕的density之后,仅更新Java层的值,并没有更新C++层。所以导致在获取dimension时,C++层用的是旧值去判断,所以导致dimension获取的不对。在我们更新完density之后,需要调用Resource的方法,去更新C++层的屏幕宽度(dp单位)额外补充两句,可能大家在实际开发过程中很少遇到这种问题,原因应该是,系统默认的屏幕宽度和我们修改density之后的屏幕宽度都比指定的values-wxxdp要大,或者要小,所以难以发现这个问题。转载 2024-08-28 16:39:06 · 53 阅读 · 0 评论 -
ART堆内存系列:GC抑制从入门到精通
本文从线下发现的GC导致主线程卡顿的问题入手引出抑制GC解决问题的思路,并对ART虚拟机执行GC的类型和触发时机做了详细的分析。从第一性原理出发,寻找可能的两种解决思路,分别是增大并发GC阈值和阻塞ConcurrentGCTask执行,并在这两种思路下探讨可落地的方案,最终成功找到阻塞ConcurrentGCTask执行的方案,并上线通过AB实验验证收益。转载 2024-08-22 17:30:40 · 51 阅读 · 0 评论 -
单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒
大小、请求数、加载时间都大大减少注意优化后的时间chunk-vendors.js和app.js加载一共耗时1.59s,不是1.11+1.59,chunk-vendors的下载解析会阻塞app.js的下载解析,所以一共1.59s。前:image.png后:单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒。转载 2024-08-22 11:24:13 · 40 阅读 · 0 评论 -
功耗优化 · 方案篇 · Android功耗优化指导规范
Android功耗优化是指优化Android APP在运行过程中的电量消耗,以获得更长的电池续航时间和更优秀的用户体验。功耗优化包括:设备的动态调频、网络优化、电池感知、界面优化、后台活动优化和内存优化等Android功耗优化指导规范就讲解完毕了,简单的总结一下: Android功耗优化指导规范主要分为五部分内容,第一部分内容是5W2H分析功耗优化。第二部分内容是功耗优化技术方案。第三部分内容是功耗优化方案分析。第四部分内容是功耗APM监控建设。最后一部分内容是总结与展望。转载 2024-08-22 11:20:53 · 391 阅读 · 0 评论 -
性能优化(一): 启动优化理论与实践
本文章总结了目前市面上常见的一些启动优化常用手段,开发和面试必备哦。首先要做应用启动优化,你得对应用启动流程有个整体甚至细化的了解。转载 2024-08-21 10:42:19 · 47 阅读 · 0 评论 -
得物App弱网诊断探索之路
因此,思路1不合适。到这里,我们已经能采集到很多HttpRTT样本、throughput样本了,现在我们要考虑下怎么将这些样本综成计算出一个可以代表设备普遍意义上的HttpRTT、throughput,然后再归类出设备网络类型(慢的网络、一般的网络、快的网络、很快的网络...)。需要注意的是,当我们结束一个时间窗口的时候,需要立刻检测当前并发是否5个以上,而不是等到新的请求到来时,这样能避免类似(图2:时间窗口2)的采样机会被浪费掉,而采样成功的样本数越多,越有利于最终结论的准确性(后面策略层会讲原因)转载 2024-08-19 16:24:13 · 44 阅读 · 0 评论 -
内存泄露(十)-- KOOM(高性能线上内存监控方案)
用于监控应用的 Java 内存泄漏问题,它的核心原理:周期性查询Java堆内存、线程数、文件描述符数等资源占用情况,当连续多次超过设定阈值或突发性连续快速突破高阈值时,触发镜像采集镜像采集采用虚拟机supend->fork虚拟机进程->虚拟机resume->dump内存镜像的策略,将传统Dump冻结进程20s的时间缩减至20ms以内基于shark执行镜像解析,并针对shark做了一系列调整用于提升性能,在手机设备测即可执行离线内存泄露判定与引用链查找,生成分析报告。转载 2024-08-13 17:02:42 · 40 阅读 · 0 评论 -
KOOM Java层泄漏使用全解析
要研究内存泄漏框架,KOOM是个不可忽略的优秀开源框架,由快手开源。这将是一个系列的文章。这篇文章作为开篇,来看看KOOM框架的demo是怎么制造Java层面的leak的。下面通过官方给出的Demo代码作为入口,来分析和学习这个开源框架。初始化。转载 2024-08-13 16:54:18 · 29 阅读 · 0 评论 -
适用于线上内存监控框架KOOM源码分析 dump文件(.hprof)
APM,全称是Application Performance Management,也就是应用性能管理,这与我们平时写的业务可能并不相关,但是却承载着App线上稳定的责任。当一款App发布到线上之后,不同的用户有不同场景,一旦App出现了问题,为了避免黑盒,找不到头绪,就需要APM出马了。对于App的性能,像CPU、流量、电量、内存、crash、ANR,这些都会是监控的点,尤其是当App发生崩溃的时候,需要回捞到当前用户的日志加以分析,找到此问题崩溃的堆栈,完成修复。转载 2024-08-13 16:27:35 · 47 阅读 · 0 评论 -
Android生成heap dump文件(.hprof) 使用koom实现(快手)
Add a fast dumper with HeapDumper API转载 2024-08-13 16:22:07 · 51 阅读 · 0 评论 -
LeakCanary 你真的了解么?看看这些高级用法
众所周知,Square 出品的内存泄漏检测工具 LeakCanary 可以很方便的检测出 App 中存在的内存泄漏问题。当我们决定要不要在项目中引入 LeakCanary 的时候,经常也会听到声音:• “LeakCanary 接入简单,无需手动初始化。• “LeakCanary 虽好,但就是太卡。• “LeakCanary 虽好,但无法线上使用。一度我也是这么认为的,直到我认真研究了下才发现,事实可能并没有那么简单。本文就是尝试从 LeakCanary 的一些高级用法,来重新论证上述的观点。转载 2024-08-13 10:49:38 · 185 阅读 · 0 评论 -
用final声明的局部变量,能提升性能吗
因为当方法执行结束时,方法内的参数和局部变量会跟着方法一起结束,都会被回收,而内部类的生命周期可能比方法长(例如:线程)。如果允许修改外部局部变量,而外部方法已经结束,变量可能已经被回收,这会导致数据不一致和不可预测的结果。由于匿名内部类可能会在不同的线程中被执行,如果允许修改外部局部变量,可能会引发线程安全问题。的局部变量编译后的 Class 文件都是一样的,因此访问效率都是一样的。,可以确保在匿名内部类中使用的变量值在其创建时就被固定下来,不会在后续发生变化。的局部变量通常不会直接带来显著的性能提升。转载 2024-08-13 10:01:23 · 26 阅读 · 0 评论 -
打造丝滑的Activity recreate重建(主题切换)过渡动画
当应用程序支持多种语言或主题时,切换语言或主题通常需要重新启动 Activity 以重新加载配置。虽然 recreate 是一种常用的重建 Activity 方法,但它不支持像在 Activity 之间切换时那样使用过渡动画。特别是在切换 浅色/深色 主题时,由于缺乏过渡动画而显得很生硬。为了提升改善这一点,只能自己实现过渡动画以提供更流畅的用户体验。转载 2024-08-12 11:30:09 · 31 阅读 · 0 评论 -
如何让Android客户端暴瘦了100M
传统的图片压缩、冗余资源移除、代码混淆等优化手段可以在一定程度上降低安装包大小,但是在面对大型复杂应用的时候,效果往往很有限,本文将详细介绍我们在中原银行手机银行包大小优化方面的实践经验,并通过一系列技术手段实现了显著的包体积缩减。分包下载:需要移除的so库和assets文件按功能模块进行分包,首次使用时再去下载对应的资源包,这样能确保功能模块依赖的云端资源尽可能的小,大幅降低下载时间,提升下载成功率,减少用户等待时间。商业转载请联系作者获得授权,非商业转载请注明出处。作者:jack5288。转载 2024-08-12 11:24:22 · 24 阅读 · 0 评论 -
Android RecyclerView宫格拖拽效果实现
本篇到这里就结束了,我们利用RecyclerView实现了宫格图片的拖拽效果,主要是借助ItemTouchHelper实现,从ItemTouchHelper中我们能看到很多巧妙的的设计,里面有很多值得我们学习的技巧,特别是对事件的处理、绘制顺序调整的方式,如果做吸顶,未尝不是一种方案。另外,在本篇,我们还需要注意的是数据和UI一致性问题,因为在移动的过程中,数据的索引位置可能和UI产生差异需要主动优化,以及notifyItemMoved和notifyItemRemoved的用法。转载 2024-08-09 10:31:15 · 55 阅读 · 0 评论 -
Android应用保活全攻略:30个实用技巧助你突破后台限制
目录1. 前台服务(Foreground Service)2. 双进程守护3. 使用系统广播拉活5. 白名单6. 第三方推送服务7. 静态广播监听8. 合理利用Activity9. 使用AlarmManager定时唤醒10. 合理设置进程优先级11. 使用sticky广播12. 使用WorkManager13. 合理使用WakeLock14. 合理使用SyncAdapter15. 使用AccountManager16. 适配Doze模式和App Standby。转载 2024-08-09 10:22:17 · 182 阅读 · 0 评论 -
用Kotlin改造AsyncLayoutInflater
Coroutine可以提供解析的子线程和切换到主线程,使用挂起函数就不需要接口回调了,并且可以自由的取消任务。所有工作就可以了,复制一份AsyncLayoutInflater代码改造,代码一下子少了很多。中不断从队列中获取布局的解析任务放在子线程中执行,解析完成变成 View 之后通过。,而且不太建议同时间内大量使用,会频繁的切换线程导致CPU碎片时间过多反而会卡顿。当我们的UI布局因为过于复杂,影响冷启动或者用户体验的时候,可以用。,如果大家需要单独定义一个线程池或者添加线程名称等,可以这样操作。转载 2024-08-08 14:26:24 · 48 阅读 · 0 评论 -
Android生成heap dump文件(.hprof)
它保存为一种叫做HPROF的二进制格式。对于Android运行android.os.Debug.dumpHprofData(hprofPath)方法后所生成的文件,须要把.hprof文件从Dalvik格式转换成J2SE HPROF格式。使用AndroidSDK提供的hprof-conv工具可运行该转换操作。一个heap dump就是一个程序heap的快照,能够获知程序的哪些部分正在使用大部分的内存。转载 2024-06-25 10:54:01 · 179 阅读 · 0 评论 -
Android编译优化之kapt优化
注解处理器(Annotation Processor)是一种在编译时扫描和处理注解的工具,它可以自动化生成代码、检查代码的正确性、生成文档等。在Android中使用过四种注解处理器:在Android平台,最先支持注解生成代码的库,是由个人开发者提供的一个插件,即android-apt。它只支持javac的方式,使用时需要引入插件 'com.neenbedankt.gradle.plugins:android-apt:1.8'。APT。转载 2024-06-20 14:00:12 · 242 阅读 · 0 评论 -
性能优化之道:深入剖析Android应用性能优化技巧与策略
智能手机已成为人们日常生活不可或缺的一部分,而Android作为主流移动操作系统,为用户提供了丰富多样的应用体验。然而,随着应用功能的不断复杂化和用户需求的日益提升,Android应用的性能优化也变得越来越重要。流畅的应用体验不仅能够提升用户满意度,更能为应用赢得更多用户和良好的口碑。1.1 什么是性能优化?性能优化是指通过各种手段和策略,提升应用的运行效率和响应速度,从而改善用户体验的过程。1.2 为什么需要进行性能优化?进行性能优化可以带来以下好处:• 提升应用流畅度,改善用户体验。转载 2024-06-12 16:36:20 · 141 阅读 · 0 评论 -
TouchDelegate详解及优化,view点击区域扩展
因为我们为View1设置了TouchDelegate,所以会进入TouchDelegate的onTouchEvent(),如果这个方法返回了ture,View1的onTouchEvent()也会返回true并到此结束,对外宣称View1消费了这个事件,但实际上并不会触发View1的onClick();,阅读View.java的onTouchEvent()源码可知,这种情况下View1的performClick()不会被调用,也就不会触发View1的onClick()转载 2024-06-06 10:40:17 · 154 阅读 · 0 评论 -
扩大View点击区域TouchDelegate
开发过程中经常会遇到如下这种场景,对于CheckBox而言,整体较小,然后为了用户体验--“好点”,往往需要扩大点击区域。通常的做法就是给CheckBox增加Padding以达到扩大点击区域的目的,但是为了对齐UI,往往需要一通计算跟调整才能“如愿以偿”,可谓哭笑不得。那怎么样可以优雅的解决这个问题呢?可以配合实现在xml上的直接处理。转载 2024-06-05 21:08:39 · 98 阅读 · 0 评论 -
removeCallbacksAndMessages(null)的含义
这样做的好处是在Acticity退出的时候,可以避免内存泄露。如果参数为null的话,会将所有的。和Messages全部清除掉。转载 2024-06-05 13:43:37 · 44 阅读 · 0 评论 -
有隙可乘 - Android 序列化漏洞分析实战
读第二个key-value:由于读第一个时少读了一个0,剩余的0变成了第二个key-value的内容,整体内容错位,由于遵循TLV的格式,错位之后,0和13变成了第二个key-value的key,恶意KEY-INTENT前的所有值都变成了第二个key-value的value;这个漏洞核心就是前后一共经历了两次序列化和反序列化。当然实际上不对称的类还有很多,大家可以看下网上泄露出来的漏洞利用源码,有很多这样的类,这里就不列出来了,知道了漏洞的本质是因为Parcel读写不对称,我们接下来看一下其中的原理。转载 2024-06-05 13:23:39 · 102 阅读 · 0 评论 -
查看特定应用占用的CPU资源
对于内存信息,请确保你的应用具有查看信息的权限。如果你需要监视实时的CPU和内存使用情况,你可能需要使用。这将显示特定应用的内存使用详情,包括所占的堆内存大小、分配的线程数等。对象来获取当前运行的应用的CPU和内存使用情况。请注意,获取系统级别的信息可能需要相应的权限,在。如果你想在代码中实现类似的功能,可以使用。来查看特定应用的CPU和内存使用情况。在Android中,你可以使用。表示top命令只更新一次。转载 2024-05-27 20:18:27 · 96 阅读 · 0 评论 -
空间换时间-五秒出解:从900ms到5ms的幕后优化大揭秘
为什么要写这个记录,都是一个非常简单的场景及使用方式,但是从发现这个问题到思考怎么解决却是一次算法学习的实际应用。我们在开发中,不会经常使用算法,但是像这种问题,我们可以用算法的角度去分析优化,这大概就是算法学习的意义作者:麦客奥德彪链接:https://juejin.cn/post/7261448895686852668来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2024-05-27 20:11:31 · 67 阅读 · 0 评论 -
ViewModels:Dos和Don‘ts
以上是Android ViewModels使用的关键点的全部内容。通过遵循这些关键点,您可以更好地利用ViewModels来管理应用程序的UI状态和业务逻辑,从而开发出更加健壮和高效的Android应用程序。深入Android ViewModels:Dos和Don'ts。转载 2024-05-13 10:11:14 · 57 阅读 · 0 评论 -
项目到底要不要引入单元测试
有些同学看到这里紧张了,以为我要开始搬定义了。然而并非如此,接下来我要分享的所有都是我自己的心路历程,也是我自己对单元测试从完全不 care 到至少入门的过程。所谓“单元测试”,顾名思义就是对软件的一个个最小单元进行模块化测试。在《给安卓开发小白们的unit test指南 - 这也能测?这也要测?这篇文章里,阿庆哥给出了一张软件工程金字塔结构图,可以清楚看到单元测试直接位于这座金字塔的最底层!常言道万丈高楼平地起,可见如果单元测试做得很稳健的话,对于整个软件项目的稳健性一定是收益最大的。转载 2024-05-09 11:00:43 · 52 阅读 · 0 评论 -
Perfetto 系列 3:熟悉 Perfetto View
上面分享了 Perfetto 基本的界面和操作,以及分享了一些比较常用的 Perfetto 的技巧。Google 目前在积极推广和维护 Perfetto,很多新功能指不定哪天就蹦出来了,到时候觉得有用我也会更新上来。至此 Perfetto 基础篇就结束了,后续就是通过 Perfetto 这个工具,来了解 Android 系统运行的基本流程,以及使用 Perfetto 以及 Perfetto SQL 来分析遇到的性能、功耗等问题。转载 2024-04-28 11:27:30 · 495 阅读 · 0 评论