- 博客(41)
- 收藏
- 关注
原创 Android 系统中,应用申请的权限相关信息介绍
在 Android 系统中,应用申请的权限 由 Android Framework 负责管理,并存储在 系统数据库和文件 中。android11 新版本,xml的attribute的名字换了,详情参考AppOpsService 的函数void writeState()由 Package Manager Service (PMS) 维护。记录用户对权限的操作(如“始终允许”/“仅在使用时允许”/“拒绝”)完整路径:/data/system/packages.xml。记录已安装应用的权限信息。
2025-03-27 11:40:13
391
原创 Abort message: ‘FORTIFY: pthread_mutex_lock called on a destroyed mutex的问题认识
这个错误表明 程序尝试锁定 (pthread_mutex_lock()) 一个已经被销毁 (pthread_mutex_destroy()) 的互斥锁(mutex)。互斥锁 被 pthread_mutex_destroy() 释放,但代码仍然尝试调用 pthread_mutex_lock()。0xb400007b225d1938 是出错的 互斥锁的地址,可能已经被释放或破坏。互斥锁可能 是动态分配的,但在仍然被使用时 其内存已经被 free() 释放了。一个线程销毁了互斥锁,而另一个线程仍在试图加锁。
2025-03-19 17:28:35
703
原创 探讨一个比较有趣的话题,float变量如何判断是否相等,史上最健壮的floatEquals代码实现(Android 13 google issue)
当然google的开发会认为brightnessDefault 一定会赋一个非Float.NaN的初始值,但是因为项目的差异性,不能靠理所当然去保证,提供的方法必现是健壮的。在 Java 中,由于浮点数的精度问题,直接使用 == 来比较两个 float 或 double 类型的值可能会导致不准确的结果。在 Java 中,Float.NaN 表示“不是一个数字”(Not a Number),它是一个特殊的浮点数值,用于表示未定义或不可表示的结果(例如 0.0f / 0.0f)。
2025-03-14 16:46:33
923
原创 android 通过action启动Activity拦截,Activity应用组件添加intent-filter priority(优先级)不生效
通过上面的dump可以看出来,adb install替换app的方式,PMS里面的控件已经发生了变化,但是为什么功能却不生效呢?通过跟踪priority的代码可知,intent-filter的priority会通过IntentFilter.setPriority进行修改,详情。通过堆栈信息,可知在install app的时候,会走进adjustPriority进行优先级的调整,并将priority设置成0,所以出现上述的不生效的情况。可以很清晰的看到,确实接收这个action的只有一个activity。
2025-03-14 11:37:03
426
原创 Android Configuration相关问题如何定位分析(中英文切换、黑夜白天模式等)
从dump WMS可以看出,系统侧的configuration是英文,也就是正常的,但是app侧确实中文,那么说明是app侧的问题。(3)分析app调用的接口,然后针对性的在framewrok加log和堆栈信息debug:定位app侧问题的手段。本文重点讲解Configuration问题的分析手段,并结合真实案例进行定位分析。(2)config debug如何开启config log:定位系统侧问题的手段。实际结果:1.语言模式显示中文,界面显示英文。1.语言模式切换英文,查看界面显示。
2025-03-06 16:11:29
532
原创 Android如何将原生的anr,tombstones,dropbox 换分区存储位置
这两条命令主要涉及 Linux/Android 系统中的目录创建、权限管理和挂载操作,通常用于 Android 设备的日志管理,特别是 ANR(Application Not Responding,应用无响应) 日志的存储。不会占用 /data 分区的空间,因为 mount none /log/anr /data/anr bind 只是绑定挂载(bind mount),而不是复制数据或移动数据。绑定挂载 /log/anr 到 /data/anr。/data/anr(目标目录)/log/anr(源目录)
2025-03-04 14:05:49
967
原创 8295智能座舱弹窗点击问题,点击window之外的区域,window不消失的问题。touchableRegion的问题分析(android 13)
wifi列表弹框,没有FLAG_NOT_TOUCH_MODAL ,且没有FLAG_NOT_FOCUSABLE,这样的行为,就是让所有的input event全部给这个window,所以出现bug这个的,点击window之外的区域,不会退出的现象。用户点击status bar的Wifi图标之后,会弹出wifi列表的window,而点击这个window之外的区域,wifi列表的窗口不会消失的问题。frame,也就是window的位置和大小:frame=[1677,127][2397,847]
2025-03-03 14:35:52
427
原创 一名老程序员对AI(OpenAI,Deepseek)冲击的深度思考:如何成为AI导师,让AI为我所用
例如:“请生成使用python脚本,python调用windows图形界面库,界面的功能是使用固定的jira账号,从用户输入的jira网址对应的网站内容中提取“单次用例执行日志(Windows共享目录)”的下一行内容,这个内容作为robocopy的源路径使用,然后使用robocopy工具执行这个源路径的文件下载功能,并加上robocopy的执行结果的进度条显示,并且目标路径也需要用户填写,默认值是“:\",如果目标路径不存在,能自动创建。这样的工具不仅能够大幅提升效率,还能为程序员创造更多的“喝茶时间”。
2025-02-24 17:51:28
290
原创 一种简单有效的分析qnx+android智能座舱项目中的画面闪烁的方法(8155平台)
针对这一难题,本文介绍了一种较为有效的分析方法,能够帮助开发团队快速识别并解决画面闪烁问题,从而提升智能座舱系统的稳定性和用户体验。DockedStackDivider 退出的时候,第二帧就出现了黑屏,是因为activity没显示出来,直到SurfaceView size正常了,activity才出来,显示恢复正常。【预期结果】分屏界面选择导航/音乐进行全屏显示时,音乐/导航显示部分不会短暂显示黑色背景。【实际结果】分屏界面选择导航/音乐进行全屏显示时,音乐/导航显示部分会短暂显示黑色背景。
2025-02-21 17:32:39
642
原创 【车载项目】 systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式“,会闪现一下负一屏下层的画面
这能够充分说明,这个问题与android动画有关,需要通过debug animation来定位问题。systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式”,会闪现一下负一屏下层的画面。通过逐帧播放视频,我们猜测,bug中的闪屏是指负一屏以下的layer的渐变的动画。
2025-02-11 20:05:17
764
原创 Android 通过systrace如何快速找到app的刷新率
官方提供了一个脚本record_android_trace,脚本位于android/external/perfetto/tools/目录下。andrdoid11以及以上的android版本都支持使用perfetto的方式抓取systrace,简单好用。方法二:(未验证,只是记录下)方法二、sf或者app的。的宽度,不要白色部分。
2025-01-15 13:57:18
383
原创 智能座舱天气appcpu loading太高优化
一、背景智能座舱在浏览天气weather app的时候,测试发现cpu loading过高,天气app的cpu负载110%左右,针对这种场景,需要优化这一特定场景的cpu 负载。二、问题分析以及修改方案在postCallbackDelayedInternal 函数,加上如下log。//android add for debug beginif (callbackType == CALLBACK_ANIMATION) {Log.d(TAG, Thread.currentThread().get
2024-12-19 18:06:40
559
原创 智能座舱media widget跑马灯功能cpu loading太高优化
智能座舱在播放音乐的时候,有歌曲名称的media widget,当歌曲名称比较长的情况下,会有走马灯Marquee的效果,然后在桌面待机状态下,测试发现cpu loading过高,总体cpu负载120%左右,针对这种场景,需要优化这一特定场景的cpu 负载。通过抓systrace分析可知,launcher3 的app刷新率是60fps,通过结合代码分析,是media widget跑马灯功能固定的60fps,导致cpu loading过高,要想办法将60fps降低到30fps。
2024-12-18 19:04:16
130
原创 renderthread卡在了dequeueBuffer,导致ANR的问题分享
error = -110:WOULD_BLOCK: -11, TIMED_OUT = -110根据定义是dequeueBuffer timeout导致的,dequeueBuffer 的timeout时间是4s。【问题现象】1.分屏界面,切换至全景泊车AVM界面,然后切换至车辆设置界面,打开音乐面板,点击副驾音乐面板,中控卡住,过几秒中控出现黑屏。正常情况下,dequeuBuffer非常快,500us内能执行完成,waiting for GPU用比较少。ANR类型是input ANR,超时时间是5s。
2024-11-29 16:52:27
975
原创 Mutex::Autolock 和 std::lock_guard 的区别
Mutex::Autolock 和 std::lock_guard 都是 C++ 中用于管理互斥锁(mutex)的一种方式,它们的目标是自动获取和释放锁,避免手动管理锁的复杂性,从而防止死锁和遗漏解锁等问题。通用性:std::lock_guard 是标准 C++ 库的一部分,适用于各种 C++ 应用程序(包括多线程应用),并且支持标准库中的多种锁类型,如 std::mutex、std::recursive_mutex 和 std::timed_mutex。
2024-11-27 21:26:19
698
原创 Android智能座舱,视频播放场景,通过多指滑屏退回桌面,闪屏问题的另一种解法
通过playExitAnimation实现冻屏或者刷帧的动作,最后测试发现,冻屏比较适合,也相对简单。刷帧的方式,因为不能很好的掌握UI的调整和显示的时间,无法正确确定刷帧的起始和结束的时机。通过录屏,然后一帧一帧播放的方式,发现闪屏是因为,多指的情况下,不仅触发了退回桌面的动作,还触发了调节视频app的亮度,以及视频的快进和快退的动作,几种UI刷新叠加起来,造成了闪屏的现象。除了调整手势识别的方法解决闪屏的问题,还有一种方式,就是退出页面的时候截屏,卡住UI的刷新,也能解决闪屏的问题。
2024-11-21 21:08:51
709
1
原创 智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题
2.通过堆栈信息可以知,切换语言----configchange----startFreezingScreen,通过log可知,当用户点击前排屏的时候,freezing的是前排屏,后排屏不会冻结,那么出现后排屏闪黑屏,一般是app relaunch 耗时导致的,需要app优化relaunch性能。从下面的log可以看出来,在主屏切换语言的时候,主,副屏的app都会relaunch,生命周期重走。当用户点击前排屏的时候,freezing的是前排屏。智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题。
2024-11-12 20:15:00
349
原创 Android智能座驾,carlink场景截屏黑屏问题
从dump信息来看,display和layer 都是secure的,所以需要将mAllowSecureLayers设置问题true,才能截取secure layer图片。接下来排查isSecure() 和 targetSettings.isSecure的来龙去脉。通过加log debug发现是如下红框部分进入了,出现了黑色图层。
2024-11-07 14:45:54
814
原创 唤醒车机时娱乐屏出现黑屏,卡顿的案例分享
从/android/frameworks/base/services/core/java/com/android/server/am/ProcessList.java。可以看到adj=100的定义:VISIBLE_APP_ADJ,从google的描述来看,adj=100的进程是可见activity对应的进程,不应被杀掉。测试在正常操作车机的时候,出现了:唤醒车机时娱乐屏出现连续两次黑屏,且发现系统有卡顿的现象。
2024-10-28 14:26:51
598
1
原创 Android系统高斯模糊背景的窗口,概率性出现显示残影的问题
在 Android 中,实现窗口(Window)的模糊背景效果,尤其是高斯模糊效果,常用于模糊背景以突出前景内容的 UI 设计。从Systrace来看,在执行高斯模糊背景之前,应该是有app在做刷新动作,最终排查发现,设置模糊背景的activity启动了两次,所以出现残影的问题。高斯模糊的过程就是将图像中的每一个像素都使用这个高斯函数进行加权平均,以该像素为中心,结合其邻近像素的值来计算新的像素值。高斯模糊的原理,高斯模糊的核心是高斯函数,它是一个钟形曲线,符合正态分布。
2024-10-18 16:07:05
1526
原创 手机通过carlink投屏到车机,播放QQ音乐卡顿问题分析
Carlink,点击或者静止(qq音乐自己播放)的情况下,app送图有卡顿,SF没有收到app送图下来,出现卡顿。框起来的部分,mediecodec没有queueBuffer下来。相信开车的朋友,都会使用carlink或者carplay功能,实现手机投屏到车机,用来导航或者播放音乐等,可能吐槽过这个投屏功能为什么会那么卡,那么卡。对比某M手机,MediaCodec queueBuffer就很均匀,60fps,没有丢帧的情况。
2024-10-10 17:09:56
1580
原创 Could not open temporary properties file: No space left on device问题分析以及解决方案
No space left on device 导致db文件无法正常创建保存,从而影响到LockSettingsService的启动,最终影响到TrustManagerService的启动,导致系统重启。通过分析,最终发现是MediaProvider开机扫描的时候会不停的创建log文件,最终因为创建了太多的log文件导致系统重启,最后通过google的修复方案解决这个问题。(2) du -sh * 查看当前目录下各个文件及目录占用空间大小,发现mediaProvider占用空间异常。
2024-09-27 14:30:24
1155
原创 首次开机android.intent.action.BOOT_COMPLETED开机广播发送慢的问题
行 33427: 01-01 08:00:37.224144 1014 1856 I PreBootBroadcaster: Pre-boot of {com.android.providers.media.module/com.android.providers.media.MediaUpgradeReceiver} for user 0。行 24354: 01-01 08:00:33.293553 1014 1288 I uc_finish_user_unlocked: 0。
2024-09-19 20:16:28
2367
原创 Android libui新加接口,编译报错:error: Please update ABI references
由于项目需要,要合入google的bug fix:https://cs.android.com/android/_/android/platform/frameworks/native/+/2c1782c6f986debe5ec89d5cdd3a3f08b08d5683。查看google的修改发现,对Transform.h 增加了一个方法:android::ui::Transform::det。输入上面指令之后,会输出如下结果,这说明上面的指令,会修改两个libui.so.lsdump文件。
2024-09-11 14:59:58
964
原创 android 媒体文件显示时间不对,date_added和date_modified分别代表什么含义。
在 Android 的 MediaStore 中,date_added 和 date_modified 是两个重要的时间戳字段,它们用于描述媒体文件(如图片、视频、音频)的不同时间属性。
2024-09-04 16:14:04
2341
原创 智能座舱Editor的share分享菜单显示流程,以及如何去掉分享菜单
在项目开发过程中,由于智能座舱的systemui都是各个主机厂定制的,会存在一些系统弹窗显示异常的情况。如下图所示,我们会发现,在app内部输入一段文字之后,选中,会弹出:复制,粘贴,全选,分享菜单,选中分享之后,会出现弹框显示不全的情况。基本分析:这个菜单是在EditText里面弹出来的,那么肯定与EditText控件有关,而EditText又继承至TextView,并且Editor 是TextView最核心的组件,所以分享菜单的显示流程,肯定与这三个类密不可分。
2024-09-03 19:48:26
662
原创 智能泊车里面的三个专业术语:AVM, BSV, APA, 以及智能座舱如何查看进程的gpu loading
AVM” 是 “Around View Monitor” 的缩写,称为全景泊车影像系统,用于车辆周围提供360度视图,帮助驾驶员查看盲区和周围的障碍物。它通过多个超大广角鱼眼镜头拍摄图像,经过数据处理和畸变矫正、图像拼接等技术,形成车辆周围的全景图像,为驾驶员提供360度的鸟瞰视图,帮助驾驶员消除视野盲区,特别是在泊车时提供有效的视觉辅助功能。“BSV” 是 "Blind Spot View"的缩写,称为盲区查看系统,常用于车辆的盲区监测系统。
2024-08-28 14:42:50
1506
原创 Android系统关机慢,关机过程中黑屏时间长
发生关机广播之后,调用AMS的shutdown,然后调用PMS的shutdown,接着是shutdownRadios,最后又调回PowerManagerService.lowLevelShutdown。umount分区的地方有timeout控制,可以通过减少这个timeout的时间做优化。在项目的开发过程中,往往会遇到这样的问题:Android系统关机慢,关机过程中黑屏时间长。通过sys.powerctl 会调用Reboot.cpp的DoReboot方法。
2024-08-23 19:29:18
526
原创 低内存low memory问题的分析步骤,以及经典案例:system_server_lowmem 有时并不是真正的low memory
在日常开发工作中,经常会收到low memory的bug,但是有时候发现,dropbox 里面有system_server_lowmem的dump,其实并不是真正的low memory的问题,那么到底是怎么一回事呢?(2)接下来查看ION的消耗情况,这部分问题是最常见的,基本50%的low memory都是这类问题导致的,一般ION消耗大于1.5G就可以认为出现了ION内存泄漏。(4)最后再看各个进程的内存消耗情况,看看是否出现内存消耗特别大的情况,如果存在,再结合hprof定位app的内存泄漏问题。
2024-08-15 14:49:31
1451
原创 Android Activity切换onstop的调用流程是怎样的
Android Activity切换onstop的调用流程是怎样的?1.activityIdle 触发。
2024-08-14 13:41:44
334
原创 android events log来龙去脉,以及activity stop timeout原理
到这里,疑问一应该比较清楚了,wm_stop_activity 是AMS 打印出来的,这个event log之后,app马上会执行onStop方法,且framework会为stop开启一个11s的timeout计时,如果11s的时间内都没有成功执行onStop方法,会执行activityStopped方法。从google的注释来看,这个timeout 11s是非常合理的,考虑到了app 10s的ANR的情况,多出1s是为了让系统有充足的时间dump anr信息。
2024-08-07 12:42:39
843
原创 Android Camera close异常导致app的input ANR案例分析
根据anr类型,我们可以知道,这个input event在anr发生的前5s触发,但是app一直没有响应,也就是app卡了5s,那么我们接下来要看anr发生时间点的前5s app在忙什么事情,我们可以通过pid=8838搜log,找到相关信息。如果超时不处理,就会发生ANR。从anr trace首先可以确定anr 发现的pid和process name,并能够找到anr dump的时间点,一般来说anr dump的时间点就是anr发生之后的时间点,与anr发生的时间点比较接近。
2024-08-05 16:42:02
1154
原创 BufferTX - SurfaceView[com.xxx/com.unity3d.player.UnityPlayerActivity](BLAST)#数量变化的来龙去脉二(更正)
相信有点开发经验的程序员都知道需要systrace或者perfetto来分析,一番折腾之后,好不容易抓到了问题场景的perfetto,但是打开之后,却不知道应该从哪里分析起,只会看简单的VSYNC-app和VSYNC-sf,发现确实有丢帧,但是查不出来到底是哪里的问题。往往这个BufferTX的数量变为0的时候,当Vsync-sf来到的时候,没有需要合成的buffer,导致丢帧的结果,这个时候,就需要查为什么app queueBuffer卡了。
2024-08-02 14:17:18
521
原创 Android app LocationManager.registerGnssStatusCallback(), 系统却没有回调onSatelliteStatusChanged(续集)
分析到这里,我们终于明白了,LocationManager的registerGnssStatusCallback的返回值,并没有接收LocationManagerService的registerGnssStatusCallback的返回值,而是默认返回的true。所以上集中解决方案有问题。Android Framework提供的很多binder接口都是有返回值的,app在使用这些binder接口的时候,要充分利用这些返回值,不能简单的认为,调用了框架接口,就一定能成功。
2024-08-02 10:35:28
749
原创 Android BinderProxy leak 原理分析
在结合压测的log,我们发现在压测的时候,有app会非常频繁的show toast。从目前的分析来看,还是因为压力测试,由于频繁使用binder调用,导致BinderProxy数据急剧增加,而GC又有滞后性,当Free RAM足够大的时候,GC的频率会降低,最终导致BinderProxy数量操过了系统的限制。说明问题点不在这里,通过上面的set方法,我们能够看到,当BinderProxy 的size操过20000之后,会有dump信息打印,接下来我们看看能不能通过dump信息看出什么端倪。
2024-07-31 19:03:58
2444
原创 Android app LocationManager.registerGnssStatusCallback(), 系统却没有回调onSatelliteStatusChanged
(3)通过log发现app注册gnss status callback的时间很早,在initializeGnss—mGnssManagerService初始化时间点之前,因为这个时间点mGnssManagerService还未初始化,导致初始化失败。Android Framework提供的很多binder接口都是有返回值的,app在使用这些binder接口的时候,要充分利用这些返回值,不能简单的认为,调用了框架接口,就一定能成功。
2024-07-29 16:53:55
1225
原创 Handler (android.os.Handler) {d795040} sending message to a Handler on a dead thread问题解决
可以看到mQuitting被设置为true的时候,在通过app sendMessage,就会打印上面的异常堆栈,那么又是哪里将mQuitting设置为true的呢?最终我们发现,当app调用了quit函数,就会设置mQuitting设置为true。也就是,当调用了quit函数之后,就不能继续往。从google源码可以看出来: 一般来讲prepare()函数跑在哪个线程,那么Handler的Message就执行在哪个线程。MessageQueue发送message了。
2024-07-26 16:45:09
1209
原创 Android 系统UID哪里定义的,system UID是多少?UID=2000是什么进程?
Android 系统UID哪里定义的,system UID是多少?UID=2000是什么进程?比较重要进程的UID定义。
2024-07-24 20:45:59
1007
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人