- 博客(402)
- 资源 (3)
- 收藏
- 关注
原创 重学wms:你知道什么是AdjacentTask吗?分屏模式的判断方法
但是大家注意哈,正常情况下确实一般分屏模式的两个task是mode为multi-window,但是大家注意mutilwindow却不一定为分屏模式哈,比如以前的车载桌面那个Activity嵌入显示的模式,也是multiwindow但不是分屏模式。这里的AdjacentTask属于熟悉而又陌生的方法,熟悉在于你经常见到它在framework代码中,陌生在于你可能没有本质理解它什么意思,想不到它的实际场景。简单说就是Task1和Task2分别设置对方成为自己的AdjacentTask,形成如下图的依赖模式。
2025-05-20 08:30:00
575
原创 开机性能优化时间对比法-通过events日志部分实战
在很多同学做开启时间性能优化相关工作时候,经常用的比较多的方法肯定是抓取开机的perfetto或者systrace方法,这种方法当然是比较准确,一般抓取这个时候都是开始准备比较细微的局部优化。AMS启动完成后开始屏幕,从此以后屏幕才能响应用户的触摸,它在WindowManagerService发出退出开机动画的时间节点之前,而真正退出开机动画还会花费少许时间,具体依赖animation zip 包中的desc.txt。上面都是毫秒为单位,有了这个时间指标就可以拿来作为优化前后对比,或者各个机器之间的䶏。
2025-05-19 14:52:57
488
原创 面试福利:安卓系统framework开发面试题目汇总
列出的面试题目大部分都是有答案的,答案可以vip群获取,有的是没有答案的,毕竟是去人家公司面试的,面试官也不是马哥,当然也就没有相关的答案,不过看到题目大家一般都可以有自己的答案,大家不确定的可以vip群中丢出来讨论。5、binder通信中不同进程的指向同一个Binder服务的客户端请求服务端时使用的handle是否是相等的呢?12、判断权限的时候,经常会传入一个uid,这个uid跟多用户的userId有什么联系吗?3、既然后黑屏冻屏的问题,你说说你分析的这个几个问题,是怎么分析的?
2025-05-16 12:58:24
329
原创 aosp14/15官方Freeform工具栏CaptionWindow显示不同步bug修复方案总结
成果展示:明显上图可以看出在拖动自由窗口过程中,已经没有出现工具栏和Activity显示宽度不一致的问题了。问题本质原因修复方案总结:核心问题就在于CaptionWindow在systemui中进行刷新,而Activity是在应用进程单独刷新,在拖动时候会不断修改Activity和CaptionWindow相关的bounds大小,但是二者又处于两个进程单独刷新,导致没有掌握好刷新节奏,这类问题在分屏课程,ShellTransition课程中其实也是有详细讲解的。
2025-05-15 11:06:19
862
原创 重学安卓14/15自由窗口freeform企业实战bug-学员作业
但是近来有学员朋友在对自由窗口进行相关的拖拽操作时候,有遇到这个工具栏相关的一个bug,刚好aosp上面也确实可以复现,这里就拿出来分享给各位学员朋友,刚好可以拿来尝试练手,从而巩固在aosp14/15上自由窗口相关的实战经验。明显看到上面的工具栏的大小在拖拽过程中和自由窗口Activity的宽度不一样大了,看起来就有错位现象,抓取出其中一帧有问题的看看。在aosp14版本及以后版本上,安卓的自由窗口部分的工具栏部分都有了较大的更新。1、课程的freeform相关知识。2、课程的Winscope的相关。
2025-05-12 16:41:08
492
原创 android使用uinput节点任意注入鼠标事件-重学安卓input子系统
但是明显只使用命令还是有以下问题,命令注入事件性能不够块,注入的事件需要提前准备好,相当于只能实现录制事件,然后播放录制事件这种,所以基于这个背景那就需要有一个非常灵活的方式通过uinput来实现对事件的自由控制,那么需要使用代码来实现对/dev/uinput节点直接进行相关的事件写入,这样事件发什么都是由代码自由控制,灵活性大大提高。下面就用代码实现注入鼠标设备,而且鼠标可以在拨号盘上面进行点击的功能。对应的Android.mk文件。
2025-05-08 10:17:20
422
原创 手把手教你uinput命令的使用方式-重学安卓input子系统
要使用uinput命令一共需要2个步骤:1、录制好相关的 evemu-record文件,这里需要使用。
2025-05-06 20:01:02
780
原创 重学input知识之探索uinput相关内容--学员作业
uinput通过创建一个虚拟的输入设备接口,允许用户在没有物理输入设备的情况下模拟输入操作。它允许开发者在软件层面模拟硬件设备的行为,这对于开发和测试涉及输入设备的软件非常有用。uinput支持多种输入事件,包括键盘按键、鼠标移动和点击等,使得开发者可以方便地测试和调试相关的应用程序。
2025-05-06 12:27:22
363
原创 安卓陌生知识点:IntentFirewall组件启动“防火墙”实战方式
源码位置:组件IntentFirewall的作用IntentFirewall是Android框架中的一个组件,它可以根据XML文件中定义的规则来控制Intent的发送和接收。Intent是Android中用于组件间通信和启动的一种消息对象,它可以携带动作、数据、类别等信息。IntentFirewall可以根据Intent的属性和调用者的信息,决定是否允许或拒绝Intent的传递,从而增强系统的安全性和灵活性。
2025-05-02 01:14:38
817
原创 aosp系统定制之如何高效的裁剪系统?
经常在企业做一个设备产品时候,都会有需要对原生的aosp进行相关的定制,定制中有一个很重要功能就是裁剪掉系统的很多没有用的模块,只留下自己最核心的一些模块。核心思路就是确定要删除的目标名字,去相关的devices或者build目录进行grep名字,然后找到对应的PRODUCT_PACKAGES列表,从列表中删除对应的目标。接下来的核心部分就是在mk中读取txt中这些要删除的目标,然后把这些目标赋值给一个全局PRODUCT_DEL_PACKAGES变量的变量。正常原生代码有很多个模块都集成的情况。
2025-04-28 00:33:36
436
原创 干货笔记:安卓系统开发工程师必须掌握常用命令汇总(不断更新)
经常在做系统开发需要使用一些命令来查看某个模块相关的信息,根据这些信息来清楚了解模块当前状态,比如常用的dumpsys activity,dumpsys SurfaceFlinger等命令,这些命令其实用多了自然就熟悉了。属于非常高频命令,主要用来展示当前设备上展示的画面,图层信息,一般用于调试,定位一些显示异常等疑难问题,属于做系统窗口和显示开发必须会的命令。这个命令内容太多,一般在想要展示所有信息时候使用,但是因为输出内容太多,一般会用他的子命令,更有目标性。1、某个apk是否安装,apk的安装路径。
2025-04-27 13:16:01
992
原创 system.img无法打包非PRODUCT_PACKAGES目标解析
不过在文件查找发现并没有我们新编译的目标没有加入PRODUCT_PACKAGES的文件,所以基本上我们就可以断定,aosp15相比aosp14就是在打包img时候,多了这个file_list.txt文件作为过滤依据,在打包img文件时候就是只会打包只有在file_list.txt文件中的,不在文件中也就不会打包。明显多了了个文件file_list.txt和file_list.txt.rsp,这里其实主要就是看file_list.txt文件既可以,可以看看它的内容。c.通过前置过滤机制保障输入目录纯净度。
2025-04-25 10:10:19
749
原创 为什么安卓aosp15打包system.img中无法包含没有在PRODUCT_PACKAGES定义的目标--学员作业
简单说就是为了方便,只会make xxx目标,,一般都会在system/bin目录或者system/app目录有对应程序,然后触发一下系统打包system.img,emulator启动后就可以在设备上看到编译的目标。但是经常我们有时候为了方便,自己写的一些简单的测试native,apk,可能只会进行的Module进行编译,不会把Moudle加入到PRODUCT_PACKAGES进行预制。接下来要触发系统打包system.img,一般这里采用touch一个系统一定会编译的cpp文件,然后进行make。
2025-04-24 14:44:25
407
原创 如何智能识别系统性能抓取对应perfetto trace然后方便分析trace-有源码的简单方案
正常我们抓取perfetto或者systrace都是采用的手动抓取方式,但是手动抓取方式一般适用于一些必现的场景,但是经常一些性能问题都不是必现的。本文就来带大家简单实现一个自动化监测系统性能,当性能低下时候可以实现对系统进行perfetto的抓取trace,方便分析问题。这里为了简单起见,我们就简单认为cpu使用率为性能低下的参考指标,也就是cpu使用率太高就代表当前系统性能低,要触发对应的perfetto来抓对应trace。1、cpu使用率过高,可以代表当前cpu负载太大,当前系统可能存在卡顿。
2025-04-23 15:08:03
357
原创 重学perfetto官方高级抓取方案-抓取更多的内容
难道都需要一个去网络找这个功能要抓取应该在perfetto后面加上什么参数么,这样肯定太低效,而且也很可能是错的,所以最权威的还是看看官网的是如何配置这些抓取参数。那么现在已经有了要抓取数据的配置config后,应该如何使用这个config进行trace的抓取呢?配置参数其实都不需要一个个手动添加,我们只需要在官网配置页面操作一个个开关按钮就可以。或者是分析trace时候可以看到调用的一些堆栈,都是一些新功能,需要额外配置参数。最常见的的就是ATRACE的TAG开启,这个也是我们老方法也会开启的。
2025-04-16 11:07:39
388
原创 性能优化:抓取开机trace给perfetto分析--Recording traces on Android boot
想要抓取开机启动整个过程的trace,放到perfetto上进分析,但是发现开机过程中无法连接上设备,没办法抓到完整的trace,所以perfetto无法分析出整个开机过程。准备好一个config文件,主要用于配置perfetto抓取时候的相关配置,比如要抓哪些tag等,是否也抓取日志等,这个配置官网给了一个最简单的版本。push boottrace.pbtxt文件到/data/misc/perfetto-configs/boottrace.pbtxt。重启设备,获取perfetto的trace文件。
2025-04-15 17:35:02
516
原创 Android.mk和Android.bp同时需要定义一个目标怎么办?
如果Android.bp和Android.mk同时存在情况下,什么也修改,那么会怎么样呢?明显报错already defined ,这个其实完全可以理解,因为Android.bp和Android.mk都同时哟定义目标linux_thread。所以Android.mk和Android.bp要同时存在的话,必要考虑解决重复定义的问题,即一套代码只能允许一个生效,要么是Android.mk生效,要么Android.bp生效。
2025-04-14 12:50:55
796
原创 Android.bp中添加条件判断编译方式
面临上面要适配多个机型差异的问题,大家可能第一时间会想到用不同的代码分支不就行了么,但是大家注意如果用不同的代码分支同时意味着每个分支的代码你都需要进行维护,维护工作量极大,也就是经常可能修改了一个bug,做了一个新需求,你不得不同步一遍到多个分支,这样一旦机型多了,差异多了,你的维护成本会越来越多。情况2:代码编译依赖api或者库都有差异,即会有编译上的差别情况,那么这种就一定需要通过Android.mk,Android.bp中进行相关的条件判断才可以。案例1:使用不通过的依赖代码文件夹。
2025-04-11 12:42:15
932
原创 来看看文件监听的FileObserver的底层原理inotify实战demo
上面可以看出FileObserver本质都是调用的linux相关inotify接口,下面针对linux的inotify监听文件变化采用一个demo实战案例方便大家立即。1、自定义一个DataFileObserver继承FileObserver类,重写onEvent方法,一旦有文件相关变化时候就会回调这个方法。上面原理主要方法也有注释,这里可以看出ObserverThread主要还是一个线程类,主要核心业务方法都是调用到了native层面。在我们构造对应的FileObserver最后会调用到下面。
2025-04-09 10:11:19
534
原创 android多屏情况如何让壁纸支持多屏异显-学员作业
明显可以看出当前的多屏情况下,壁纸都是展示的一张,无法实现对每个屏幕有单独壁纸的展示,但是在多屏情况下毕竟属于两个独立的屏幕,所以用户肯定会有想法让多屏展示有差异,这里的壁纸差异化的多屏展示就是很重要的一个需求。所以基于以上的学员提出的需求,马哥评估后感觉难度一般,所以给大家布置成学员作业给大家,希望大家积极的参与这个作业的完成,在vip群中秀出你的多屏壁纸异显的实战成果,看看你们谁先完成这个作业哈。明显看到主屏和副屏壁纸可以展示不同的壁纸,也app也可以单独进行设置对应的屏幕的壁纸。
2025-04-08 10:53:31
354
原创 Ninja,Kati,Soong等知识深入扫盲
最开始,Ninja 是用于Chromium 浏览器中,Android 在7.0 中也引入了Ninja,因为随着Android系统和应用程序的增长,这种构建方式变得越来越慢,尤其是在大型项目中。为了解决这个问题,Google开始引入新的构建系统来提高编译速度和效率。Ninja是一个小型的、专注于速度的构建系统,最初由Google的程序员Chris Manson开发,最初用于加速Chrome浏览器的构建过程。Ninja的设计思路简化构建过程,通过精确指定输入和输出关系,实现快速增量构建。
2025-04-07 01:27:57
741
原创 Android.bp如何快速掌握经验分享
定位与作用:Android.bp 是 Android 构建系统(Soong)的核心配置文件,用于定义模块的构建规则及依赖关系。它替代了传统的 Android.mk 文件,语法类似 JSON,但更简洁高效,支持模块化管理。发展历程:从 Android 7.0 开始引入,Android 8.0 后成为默认配置,基于 Ninja 构建框架,通过 Blueprint 解析,最终生成 Ninja 文件执行编译。
2025-04-06 01:05:51
992
1
原创 android如何不修改系统代码拦截Activity启动禁止打开某些应用在车机行车过程?-学员答疑总结
这个学员大概思路就是,可以在桌面applist图标点击进行屏蔽,这个明显不行哈,首先不说改了Launcher代码,最重要是只是applist点击进行屏蔽根本无法覆盖,你能保证你的app启动都是通过桌面点击么,完全有可能其他场景,比如后台service启动,或者其他Activity拉起。注释明显看出IActivityController实际上是监测AMS一些实际的发生接口,一般用于一些测试来监测系统的Activity的一些状态,这个不针对普通第三方app,属于一个隐藏api,不过对于系统app肯定是可见的。
2025-04-02 12:32:14
757
原创 自由开发者aosp源码修改部分如何提交保存上传服务器?-记录AI帮助我们实现过程
虽然AI无法完美满足你的实战需求代码,但是AI确实可以给你生成一个基本上可以用的成品代码,这个已经最少帮你节省了%70以上时间了,万事开头难,AI都帮助你开好了头,也帮你实现了一个基本可用的代码,你只需要在这个基础上改善完善他的功能,修复一些bug既可以,所以AI完全替代程序员这个事情是不太存在的,但是AI可以大大提升我们每个程序员的开发效率,让AI做出一些基本可用的模块类工作,节省我们大量的时间成本,我们程序员注意力集中在更高难度的一些AI无法实现需求和bug上。下面介绍2种常见方案来解决该痛点。
2025-04-01 11:25:58
1015
原创 android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
针对上面的问题,大家第一反应可能会说,既然eng版本没有问题,那么是否可以考虑编译一个整体eng的包不就行了?这种方法其实有条件情况下确实是一个最省事方法,但是很多时候出版本的不一定是自己,大家可能都是取公司编译好的版本用,然后修改自己模块push进去就行,所以很多时候不一定有完全eng的大版本可以使用。因为我们都是使用模拟器居多,模拟器编译的版本一般都是eng版本,所以没有这个同学问题,针对这样一类问题一般都是可能和自己的手机设备版本类型有关系,这个有问题版本确定是一个userdebug版本。
2025-03-28 13:37:56
599
原创 聊一聊安卓WallpaperService壁纸窗口触摸事件接收原理-第一篇
1、壁纸窗口本身在创建时候就已经有创建好对应的InputChannel,而且也会和正常窗口一样会有InputWindow在InputDispatcher,而且位置一般处于最底层2、要让壁纸可以接收事件,需要调用 setTouchEventsEnabled(true),主要是把Window不进行设置NOT_TOUCHABLE的flag。
2025-03-26 11:32:43
1149
原创 wms窗口/多窗口/自由窗口systemui侧边栏手势退出实战-学员作业
简单说就是学员朋友反应自由窗口置顶后,发现无法通过systemui的侧边栏返回手势进行返回了。课程时候,有一个需求就是实现自由窗口置顶的功能,这个需求实现后,自由窗口就会一直处于顶端,不会因为打开其他Activity导致自由窗口退出。明显看到焦点输入在自由窗口上,但是操作侧边栏依然是底部的联系人窗口退出的,自由窗口的联系人无法退出。2、设置自由窗口为置顶模式,让自由窗口处于顶部,具体方法可以看马哥分屏课程自由窗口最后一节。可以看到要实现的目标就是侧边栏滑动后退出是有焦点顶部自由窗口Activity。
2025-03-25 10:11:35
374
原创 安卓15/aosp15/lineage21使用brunch编译老是报错OOM内存不足
原理:因为breakfast,brunch其实属于lineage os自定义的函数帮助我们包装了一些操作而已,本身aosp是没有的,lineage os本质还是基于aosp的,所以自然aosp的所有编译命令也可以正常使用。1、物理解决方法,直接增加内存条,把内存变成64G,这种方式可能最简单啥也不需要改变,不过很多同学可能也有条件限制不一定可以,比如内存插槽不够,或者是内存条贵。2、增加swap虚拟内存,这种方法也是可以的,但是也需要消耗相关的硬盘空间等,需要重新扩展swap。
2025-03-19 16:22:12
595
原创 安卓面试题:第三方App如何ANR监听之SIGQUIT信号方案
正常在产生ANR时候,都会发送一个SIGNAL_QUIT信号给app进程来实现退出,所以就是抓住这个信号的发送与接受作为切入点来实现监测ANR。
2025-03-19 01:14:46
820
原创 安卓黑屏,空白屏,不显示等系统疑难问题-千里马直播讲解带你解决
工程师来说可能根本不知道如何入手分析这类黑屏,白屏,不显示等系统疑难问题,马哥也对这块非常重视,无论是vip课程还是平时vip群讨论,都给大家准备了很多实战案例给大家进行实战解决这类疑难问题,不完全统计这类案例数量大于10个,目的增加vip学员们这块疑难问题的实战能力。在作业布置出去后,很多vip学员们也纷纷尝试分析解决该问题,因为说实话这类问题确实是不可多得的实战机会,所以vip学员朋友们都非常珍惜,广大非学员网友也请珍惜,这种问题后续可能马哥这边就只对vip内部进行分享,不再公开哈。
2025-03-15 12:17:41
433
原创 聊一聊binder传递文件fd原理及新版本性能优化
上面可以看出与老版本巨大差别在于,新版本根本没有直接在binder_translate_fd中获取target_fd和install target_fd到file,只是构造了binder_txn_fd_fixup对象,赋值file后,然后加入到事物t的fd_fixups列表中。收集阶段:在源进程的 Binder 线程中,通过 binder_translate_fd 收集所有待映射的 fd,形成 fd_fixups 链表。下面看看真正干活的binder_apply_fd_fixups。
2025-03-13 15:45:19
1157
原创 看一看系统Task都为啥不显示的问题--学员作业
这个MyTaskOrganizer主要就是在构造时候有调用registerTaskListener,这个最后会调用到TaskOrganizer自带的registerOrganizer方法中去。其实从修改可以看出来,只是简单的构造了一个MyTaskOrganizer就会导致桌面Task无法显示,整个复现过程其实都属于程序员正常写代码行为,但是就是出现了个Task不显示问题。上面现象可以看到明显系统启动后桌面已经不显示了,那么就是针对这样一个桌面不显示问题作为学员作业布置给大家来进行探索。
2025-03-11 09:45:38
264
原创 做一做native层面消息实战Looper,Handler,Message
在了解了整个消息机制的原理后,可能大家对消息机制都有了一个新的高度。但是想要进一步的深刻理解消息机制的作用,那么还是需要针对消息机制进行相关的实战使用。大家在java层面经常都会使用到Hander,Message,Looper,但是学习了前面的消息机制后,其实native层面也是完全可以和java层一样使用消息机制,所以本文主要在native层面来使用Looper,Message,Handler组成的消息机制。回顾了Java端的消息机制使用流程后,再来写native的就方便多了。
2025-03-10 00:57:06
352
原创 聊一聊 Android 的消息机制
在 Android 平台上,主要用到两种通信机制,即 Binder 机制和消息机制,前者用于跨进程通信,后者用于进程内部通信。从技术实现上来说,消息机制还是比较简单的。从大的方面讲,不光是 Android 平台,各种平台的消息机制的原理基本上都是相近的,其中用到的主要概念大概有:1)消息发送者;2)消息队列;3)消息处理循环。示意图如下:图中表达的基本意思是,消息发送者通过某种方式,将消息发送到某个消息队列里,同时还有一个消息处理循环,不断从消息队列里摘取消息,并进一步解析处理。
2025-03-09 09:56:22
1061
2
原创 安卓binder驱动内核日志调试打印开放及原理(第二节)
这里看到binder_debug_mask赋值一共两个地方,有一个初始值,有一个传递到module_param_named方法中的,其实binder_debug_mask的改变就是靠这个module_param_named方法,下面我们来重点讨论一下module_param_named方法。当通过echo xxx > debug_mask命令,会触发动态修改module_param_named的第二个参数binder_debug_mask值进行改变,一旦binder_debug_mask改变就会。
2025-03-07 15:10:03
746
原创 用IdleHandler来性能优化及原理源码分析
因此,在 UI 主线程相对繁忙时,通过 IdleHandler 来分摊任务,可以让系统先处理用户的核心交互,就比如onCreate是生命周期方法,如理里面初始化太多东西影响冷启动速度,针对一些可以延后不那么紧急任务可以待系统空闲时再处理任务,充分利用 CPU 空闲时间。它允许开发者在主线程处于空闲时,执行一些低优先级的任务。3、如果IdleHandler的queueIdle返回false则会从mIdleHandlers删除,下次空闲就不会在执行这个IdleHandler,否则true的话会每次空闲都执行。
2025-03-06 21:41:57
1114
原创 安卓binder驱动内核日志调试打印开放及原理(第一节)
经常有学员朋友在做系统开发时候,有时候遇到binder相关的一些问题,这个时候可能就需要比较多的binder相关日志,但是正常情况下这些binder通讯的的内核日志都是没有的打印的,因为经常binder通讯太过于频繁,如果正常版本都开放出来这些binder调试日志,那样会让系统卡顿,影响性能。所以只需要对debug_mask写入 8既可以实现让binder的中所有BINDER_DEBUG_OPEN_CLOSE相关binder_debug打印出来。下面给大家介绍一下相关的打开日志的命令。
2025-03-04 00:39:55
831
原创 桌面最近任务展示Task缩略图源码剖析
这里主要是通过ActivityManagerWrapper.getInstance().getTaskThumbnail接口来进行ThumbnailData获取,ThumbnailData就是代表缩略图相关的对象,获取到了ThumbnailData数据后就可以进行对应缩略图展示。反正最后调用putSnapshot进行缓存当前taskId的Snapshot,那么接下看看这里的Snapshot是怎么来的就相对简单了。这里又会调用到TaskSnapshotCache的,注意这里这些注释时时刻刻体现不要持有大锁。
2025-03-03 01:46:08
1087
千里马android framework学习课程资料下载
2023-06-28
新加一个app源码到packages/apps编译Android.mk
2022-04-16
haxm-windows_v7_5_1新版本github.zip
2021-06-04
Android Framework学习资料,系统开发,Framework开发
2021-05-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人