- 博客(160)
- 收藏
- 关注
原创 【Android基础回顾】七:内存管理机制
Android 的内存管理机制是一个多层次的复杂系统,旨在高效利用有限的物理内存(RAM),在保证前台应用流畅运行的同时,尽可能在后台保留更多应用以提高启动速度(多任务)。它的核心机制结合了 Linux 内核的基础功能和 Android 特有的优化策略。
2025-06-05 17:08:38
763
原创 Android基础回顾】六:安卓显示机制Surface 、 SurfaceFlinger、Choreographer
在 Android 系统中,Surface 和 SurfaceFlinger 是图形渲染系统的核心组件,负责屏幕显示内容的合成与管理。它们协同工作,使各种 App 和系统界面能够高效地显示在屏幕上。
2025-06-05 16:13:24
653
原创 【Android基础回顾】五:AMS(Activity Manager Service)
Android 的 AMS(Activity Manager Service)是 Android 系统中的核心服务之一,负责管理整个应用生命周期、任务栈、进程和四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的运行。它运行在系统进程 system_server 中,是 Android Framework 层的关键服务。
2025-06-05 15:29:44
1015
原创 【Android基础回顾】四:ServiceManager
Android 中的 ServerManager 是 Android 框架中一个用于管理系统服务的核心机制。它是 Binder IPC 的一部分,用于在客户端和服务端之间建立联系,广泛应用于系统服务(如 ActivityManager、WindowManager 等)的注册与获取。
2025-06-05 14:49:45
1134
原创 【Android基础回顾】三:Android启动流程
Android 系统的启动流程主要包括从设备加电开始,到系统完全启动并进入用户界面这一全过程,涉及到多个阶段。
2025-06-05 14:47:58
1003
原创 【Android基础回顾】二:handler消息机制
Android 的 Handler 机制 是 Android 应用中实现线程间通信、任务调度、消息分发的核心机制之一,它基于 消息队列(MessageQueue)+ 消息循环(Looper)+ 消息处理器(Handler) 组成。
2025-06-05 11:56:25
901
原创 【Android基础回顾】一:Binder机制是什么?有什么用?
众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。
2025-06-05 09:45:11
843
原创 AI变得聪明的当前,我们怎么给产品设计AI语音方案?
本文分享了AI语音从0到1的开发实践过程。首先介绍了核心概念:AEC降噪、VAD语音检测(本地与云端方案对比)、STT语音转文字和TTS文字转语音。详细阐述了技术实现方案,包括麦克风硬件选型(单麦到8麦阵列)、收音组件选择、采用Silero VAD提升检测准确率、使用gRPC实现流式传输等关键环节。重点指出嘈杂环境下的拾音误触发是主要技术难点,涉及计算资源浪费和体验下降问题。文章提供了完整的开发流程参考和开源工具链接,为同类AI语音项目开发提供了实用指南。
2025-06-02 15:44:57
440
原创 一次跳槽,从16K到26K,我做对了这三件事
当暴风雨来临的时候我们需要躲进屋子里躲雨,当太阳升起的时候,我们需要出去向外奔跑寻求光明。AI正在争分夺秒地重构人类生活方方面面的范式,而我们当前正处于马车被蒸汽机取代的剧变期。要继续当马车夫,还是拥抱变化去学习驾驶技术实现阶层跃迁,这取决于我们的认知。毕竟当局者迷。这是个最好的时代,AI给我们普通人带来了太多的机会,让我们普通人只要抓住一两个大机会就可以跨级阶层。这也是个最坏的时代,因为如果我们抓不住机会,就会被沦为时代的弃子。无论我们从事的是哪一行哪一业,都应该理解AI、拥抱AI、使用AI。
2025-03-17 23:40:15
787
2
原创 【Android GUI】FramebufferNativeWindow与Surface
FramebufferNativeWindow是为surfaceflinger服务的,由Gralloc提供。surface虽然为应用程序服务的,但是本质上还是由surface flinger服务统一管理的。
2024-04-17 14:59:31
1390
原创 【Android GUI】从总体上了解Android的GUI体系
Android的HAL层提供了Gralloc,包括fb和gralloc两个设备。VSync是“Project Butter”加入的同步机制,可以通过硬件产生,也可以通过软件,即VSyncThread模拟。Framebuffer是内核系统提供的图形硬件的抽象描述,它占用了系统存储空间的一部分,是一块包含屏幕显示信息的缓冲区。Gralloc对应的模块是由FramebufferNativeWindow在构造函数中加载的。Android中,Framebuffer提供的设备文件节点是。
2024-04-17 11:57:25
1241
1
原创 【Android】Activity task和Instrumentation杂谈
Android不仅可以装载众多的系统组件,还可以将它们跨进程组成ActivityTask,这个特性使得每个应用都不是孤立的。
2024-04-16 15:03:40
1308
原创 【Android surface 】二:源码分析App的surface创建过程
我们来回顾和总结一路过来的分析,为后续破解surfaceflinger做准备。创建了一个SurfaeComposerClient,调用它的createSurface,拿到一个SurfaceControl对象。调用SurfaceControl的writeToParcel把信息写道parcel中。根据parcel的信息构造一个surface对象,并保存到java层的mSurface对象中。这样viewroot得到了一个native的surface对象。
2024-04-12 16:29:36
1531
1
原创 【Android Surface】从Activity的创建到Surface的创建,源码分析1
我们知道Android绘制图形依靠的是surface和surface flinger,但是当我说起这句话的时候,你脑海里面能复现出一幅图画,里面展示了Android绘制图像,然后渲染到屏幕这整个执行流程吗?如果没有,一起来研究研究Android的这个机制。我想,理清楚之后,作为Android开发的我们,必定获益良多。先看看surface系统的的整体关系:不论是使用Skia绘制二维图像,还是使用OpenGL绘制三维图像,APP都会Surface进行交互。
2024-04-12 11:09:51
1261
原创 【Android ServiceManager】从源码入手,剖析ServiceManager是如何处理客户端的请求的?
代码分析到这里,我们总结下,前面代码中ServicManager打开了binder设备,让自己成为manager,接着进入循环并通过ioctl与binder设备进行交互,用于来处理客户端发过来的消息。我们不禁去思考ServiceManager存在的价值是什么。ServiceManager可以通过字符串查找对应的Service,这个与DNS很类似。并且ServiceManager对服务进行了权限控制,使得并非所有服务都能进行注册,这无疑提高了Android的安全性和各种服务的条理性。
2024-04-03 13:50:42
910
原创 【Android Binder】从源码出发,剖析Binder机制的实现流程
在这里我们可以做一个总结:这行代码中创建了BpBinder对象,然后把BpBinder对象作为参数新建了了一个BpServiceManager对象。sm就是这个BpServiceManager对象。一个是BpBinder对象,它的handle值为0,。一个BpServiceManager对象,它的mRemote值为BpBinder对象。而且BpServiceManager实现IServiceManager接口,又有了BpBinder作为通信代表。到这里进行通信的准备做的差不多了。但是还差些什么。
2024-04-02 11:09:37
1401
原创 【Android Handler】从源码出发,一步步窥探Handler在Java层的数据结构关系和执行原理
Handler作为消息机制在整个Android系统里面起到了无可替代的作用,我们今天来探讨下这个无比重要的机制的实现细节。
2024-03-29 15:42:27
1075
原创 【Java 多线程】从源码出发,剖析Threadlocal的数据结构
ThreadLocal是个很重要的多线程类,里面数据结构的设计很有意思,很巧妙。但是我们平时使用它的时候常常容易对它的使用感到迷惑,因为它跟其它的API很不一样,使用很不一样,设计也很不一样。但是不用担心,这篇文章将从源码出发,一步步深入剖析ThreadLocal内部构造,理清楚它的来龙去脉。
2024-03-28 17:03:55
919
原创 【Android 内存优化】KOOM线程泄漏监控的实现源码分析
前面我们通过研究KOOM的开源代码,研究了关于Java层和native层内存泄漏监控的实现原理。还剩下线程泄漏这部分没有进行分析,今天来补全它。整体下来,相信我们对于内存监控在代码上的实现上会有一个较为体系化的了解。
2024-03-26 11:28:08
611
原创 【Android 内存优化】Koom核心内存指标分析
这就是KOOM在Java层内存监控拿到的内存指标。有了这些指标,可以比较清晰地知道当前机器和进程内存的情况。
2024-03-24 22:54:48
1232
1
原创 【Android 源码】Android源码下载指南
这是关于Android源码下载的过程记录。环境:Windows上通过VMware安装的Ubuntu系统。
2024-03-23 11:38:04
958
原创 【Android 内存优化】 native内存泄漏监控方案源码分析
Android的native泄漏怎么检测?下面通过研究开源项目KOOM来一探究竟。
2024-03-21 17:10:34
1472
原创 【CMake】Android native模块a调用native模块b,如何配置cmake?
Android项目中如何配置cmake,让module a的native代码调用module b的native代码?首先可以看看CMAKE_SOURCE_DIR的具体路径:定义子目录的路径把子模块的cmakelists添加关联接着根据自己项目的具体位置,找到实际上module a的代码路径。接着调用add_subdirectory,添加到对应的路径中。add_subdirectory的主要作用是添加另外一个cmakelist到当前的cmakelisk的搜索目录中。这里需要注意的是,这种情境下使用
2024-03-18 14:32:59
519
原创 【Android 内存泄漏】KOOM 怎么实现线程泄漏的监控?
前面分析了KOOM Java leak、native leak的监控思路,这篇继续分析它线程监控的整体思路。
2024-03-12 11:39:47
1231
原创 【C/C++ API】C++内存分配和释放函数分析
是一个 C 语言函数,用于分配一块内存,并保证返回的指针地址满足特定的对齐要求。指向的内存块,并使该内存块可用于后续的内存分配。字节,并返回一个指向重新分配后的内存块的指针。之后,我们检查是否分配成功,然后使用该内存,最后在不再需要时释放该内存。是 C 标准库中的一个函数,用于分配一块内存,并保证返回的指针地址满足特定的对齐要求。是 C 标准库中的一个函数,用于重新分配先前分配的内存块的大小。,即要释放的内存块的指针。是 C 标准库中的一个函数,用于动态分配内存,并将分配的内存空间初始化为零。
2024-03-11 15:41:08
1313
原创 【Android 内存优化】快手框架KOOM是怎么实现native层内存泄漏监控的?
我们可以大体总结一下KOOM监控native泄漏的大致原理:主要是通过加载需要监听的so,然后通过开源框架XHook来hook内存分配相关的调用函数,把hook获取到的信息回调给Java应用层,从而达到监控native内存的目的。
2024-03-11 14:43:22
1167
原创 【Android 内存优化】KOOM 快手开源框架线上内存监控方案-源码剖析
这篇文章主要剖析KOOM的Java层源码设计逻辑。【Android KOOM】KOOM java leak使用全解析/**/很简单的两行代码,里面包含了如此之多的业务逻辑和精彩的设计。很多时候,我们使用越是简单的开源框架,越是能证明作者的厉害之处。他们把繁杂的逻辑内聚到了框架里面,让使用者能用简单一两行代码实现复杂的逻辑业务。KOOM作为一个线上内存监控框架,有很多优秀的设计。这篇文章也只是在外层分析了一些表面的技术逻辑,至于更深入的内容,后续会继续更新。
2024-03-09 11:40:21
1781
原创 【Android studio 报错】Caused by: java.lang.reflect.InaccessibleObjectException 解决方案
经过一些尝试,上两图中修改的JDK version和Gradle version,可以编译通过。通过AI,大概了解报错的原因,高版本的JDK为了更好的高内聚和低耦合,引入了模块系统。
2024-03-01 11:40:08
2895
原创 【Android 需求方案实现】 在屏幕上画一条线的时候,如何把这条线经过的所有坐标点(高效&有序&完整)地发送出去?
*** 监听签名坐标*//*** click down的坐标*//*** touch move的坐标*/
2024-02-26 11:48:19
1301
原创 【Android内存优化】基础知识点:程序运行时加载并调用动态链接库中的函数
对于native层内存泄漏的监控,我们需要调用虚拟机的一些函数去获取对应的堆栈数据。总所周知,Java虚拟机,或者Android的ART、Davik虚拟机也都是用C/C++写的,这就需要我们调用通过Linux提供的一些接口去调用虚拟机的动态库,去执行对应的功能,在程序运行时加载并调用动态链接库中的函数。所以掌握动态链接这个知识点就显得很有必要。
2024-02-07 15:06:55
1040
原创 【C++】namespace命名空间
匿名命名空间是 C++ 中的一种特殊的命名空间,它没有名称,用于限定其中声明的变量、函数和类的作用域。通常情况下,匿名命名空间适用于那些在当前文件中定义的具有局部作用域的变量、函数、类等,而不需要在其他文件中引用或者暴露给外部的情况。在匿名命名空间中声明的变量、函数、类等只在当前源文件中可见,不能被其他源文件访问,所以不会与其他文件中的同名符号发生冲突。:在匿名命名空间中声明的变量、函数、类等的作用域被限制在当前文件中,对其他文件不可见。的命名空间,包含了一个整型变量。来访问命名空间中的成员。
2024-02-07 14:29:48
457
原创 【Android性能优化】9个方法避免内存泄漏
我们做开发的时候,很容易专注于做功能和业务层面的开发,而忽略APP的性能表现,今天来列出一些做Android开发的时候很容易出现内存泄漏的点。
2024-02-05 15:33:02
1804
原创 【Android性能优化】内存优化前置知识剖析
内存优化作为Android性能优化中非常重要的一环,这篇blog主要记录了跟内存优化相关的重要命令、核心指标、相关原理的解析。作为前置知识,起到奠基的作用。阅读完本篇内容,你将对于Android的内存优化有个大致的知识框架。更加详细的解析,会在后续blog中更新。
2024-02-01 16:23:21
1100
原创 【Java】Java的对象参数踩坑总结
今天写代码的时候,犯了一个很基础很低级的错误。实在惭愧,在此花点顺手记录一下,养成习惯。需求是需要把byte[]作为入参的同时,也作为出参,传一个空白的byte[]作为参数,在方法里面修改byte[],修改完毕后,外面方法获取到被修改后的参数,很简单吧。
2024-02-01 15:21:09
490
原创 【Android】Android 固件和内核启动过程概览
Android手机用来这么久,来了解下刷机的时候Android 固件和内核启动过程是怎么样的?
2024-01-26 11:32:34
1251
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人