- 博客(24)
- 收藏
- 关注
原创 android系统启动
在Boot阶段init进程通过class_start core接口启动SurafceFlinger进程,然后调用ctl.start接口通知init进程启动bootaniamtion service(开机动画)3.android启动:init进程、zygote进程(systemserver进程)、挂载文件系统、serviceManager、 SurfaceFlinger、MediaServer。2.Linux启动:kernel启动:kernel_init,完成设备驱动程序初始化。init进程号为:1。
2025-02-07 16:33:03
160
原创 抓取并解析进程的native heap
链接: https://pan.baidu.com/s/1wv6O_IiNt72qJzj7QO5eXg?pwd=sap9 提取码: sap9。使用源码中的native_heapdump_viewer.py解析脚本。通过网盘分享的文件:native_heapdump_viewer.py。可以加上symbols文件 --symbols SYMBOL_DIR。-n表示只抓取native heap。打开相关DEBUG(会影响性能)–来自百度网盘超级会员v3的分享。上层重启,不是底层重启。
2025-01-15 16:39:19
213
原创 SurfaceFlinger---应用到SF
来到cpp文件:android_view_SurfaceSession.cpp的nativeCreate。参考博文:https://juejin.cn/post/7414734191194046500。执行到WMS的addWindow的win.attach()方法。创建SurfaceSession对象。
2025-01-09 14:30:43
218
原创 WMS创建及一些重要成员变量
在DisplayThread的handler的runWithScissors方法中通过工厂模式创建WMS对象,因此WMS是运行在android.display线程中的。WMP是一个接口,init方法在PhoneWindowManager中,PMW在andorid.ui线程中init。WindowToken作用:窗口令牌,app想要向WMS申请Window是,需要出现有效的WindowToken。DisplayThread是一个单例的前台线程,线程名为android.display。WMS的main方法。
2025-01-08 14:49:29
170
原创 Window与WindowManager(二)
执行到Activity的onResume方法后,会调用到makeVisable()方法,DecorView会真正的完成添加和显示,到这里之后Activity的视图才能被用户看到。Activity实现了Window.Callback接口,因此当Window的状态改变时,Activity的方法会进行回调。在Activity的attach方法里,系统会创建Activity所属的Window对象并为其设置回调接口。最终还是需要跨进程调用到windowmanager,传入DecorView和PhoneWindow。
2025-01-02 15:48:51
285
原创 Window与WindowManager(一)
Window:Window只是一个抽象概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View是通过ViewRootImpl建立联系,Window是以View的形式存在的。Window是分层,每一个Window都有对应的z-ordered,层级高的会覆盖在层级小的上面。Android中所有的视图都是通过Window来呈现,Window是View的直接管理者。Session对象最后调用的是WMS的addWindow完成window的添加。
2025-01-02 14:06:03
331
原创 插入SD卡后设备异常重启
但是,只发了一次ACMD41后,卡回复busy状态之后,主机就复位重新发CMD0了,正常情况应该是发送一次ACMD41,卡回复busy后,host再重复多发几次ACMD41,直到卡ACMD41的响应显示初始化完成,不处于busy状态。202407221502_ylog_重启\ap\006-0722_145915_poweron\traces\07-22_150054–anr_2024-07-22-15-00-53-958.log。这个方法调用前的log正常打印了,但是后面这个log没有打印。
2024-12-27 14:42:42
827
原创 Android进程通信(常见的四种)
Intent ContentProvider Massger Broadcast AIDL等等都需要基于Binder机制完成跨进程通信。AIDL(Android Interface Definition Language):接口描述语言,生成的代码封装了binder。在内核空间,负责各个用户进程通过Binder实现通信的内核模块成为Binder Driver。binder主线程是在进程创建时创建的,在进程销毁前不会退出。Binder线程的创建是在所在进程创建的过程中创建的。Zygote创建进程。
2024-09-20 14:38:10
422
原创 Input模块流程(基于AndroidT)
一旦对应的设备上有可读的input事件,epoll_wait就会返回并待会deviceid,找到具体的device。InputManager 的构造函数中创建了InputDispatcher 和InputReader对象,并把InputDispatcher作为参数传递给InputReader对象。InputManagerService:负责InputReader 和InputDispatcher的创建,并提供policy用于events的预处理。
2024-09-05 17:57:48
1407
原创 Input流程---客户端向系统端注册
2.WindowSession.addToDisplayAsUser 通过此方法在WMS中构造服务端和客户端的InputChannel对象,并将客户端的InputChannel对象进行赋值;3.创建客户端的WindowInputEventReceiver对象,并将客户端的fd加入MessageQueue的looper监听中。在activity的Resume方法会调用,系统为其创建ViewRootImpl对象。此时客户端的InputChannel成功创建。1.创建空的InputChannel对象;
2024-08-28 15:08:31
228
原创 抓取WMS 日志Protolog
链接:https://pan.baidu.com/s/1a2imJPpEntBoAy-PoDRtcQ?(WM_DEBUG_RECENTS_ANIMATIONS TAG 这个就是需要抓取的TAG 给其使能)抓取到pb日志,使用winscope.html打开进行分析。通过百度网盘分享的文件:winscope.html。protolog log抓取及查看。–来自百度网盘超级会员V5的分享。
2024-08-27 16:16:13
224
原创 Activity界面显示到Window过程梳理
1*因此调用的是PhoneWindow的setContentView方法。调用到父类Activity的setContentView方法。走到MainActivity的onCreate方法。
2024-08-27 16:06:37
234
原创 老化休眠唤醒测试异常失败
在系统中搜索WAKE_REASON_GESTURE,可以看到有多处传入此reason的调用,其他地方调用PMS的wakeup方法,是通过PowerManager去获取并调用的,因此在PowerManager中添加堆栈打印。分析如上,看下来是在一次测试过程中,调用到了PMS的wakeup,传入的reason是WAKE_REASON_GESTURE。这里对应的是原生Setting的Display的高级设置Lift to wake。修改为默认关闭即可解决此问题。可以看到问题复现后的堆栈。版本此值是默认打开的。
2024-08-27 15:02:30
214
原创 记录一次系统短时间内发生多次ANR
查看连续几次ANR的Cpu Total值都在96% 98% 100%,iowait值并不高,且kswapd0占Top2,基本可以确认此问题是Low Memory问题。可以看到短时间内连续发生多次进程的ANR,类似于这种连续的ANR需要分析第一次的ANR原因,先解决掉第一次ANR再测试此问题是否还会再次复现。客户报的问题:后台在下载多个应用时,正常使用设备,发生"System UI isn’t responding"可以看到/proc/pressure/memory的压力值比较大。1.2这两项一般很少修改。
2024-08-19 15:31:15
490
原创 App创建后MainActivity加载到界面
item.execute 实际上调用的是LaunchActivityItem的execute方法。AppDeathRecipient定义在AMS中,实现了IBinder。AppBindData 是ActivityThread的静态内部类。Activity的attach应该做的是window相关的操作。跨进程调用的AMS的attachApplication方法。回到进程的ActivityThread。回到ActivityThread。
2024-08-17 14:45:52
272
原创 记录一次三方App ANR分析过程
1.在Monkey error中查看com.google.android.apps.adm ANR时候的cpu loading,cpu loading都比较低,大概在20%-30%,应该跟系统负载无关。2.分析了两次ANR,发现都是com.google.android.apps.adm的MainActivity的绘制存在异常,导致input超时。Monkey 测试出现多次com.google.android.apps.adm ANR。
2024-07-24 16:58:39
1321
原创 App进程创建代码分析(基于Android 14)
开机过程中已经启动ZygoteServer的runSelectLoop方法并创建ZygoteConnection。调用到Process的start方法,创建了一个ZygoteProcess对象并调用start方法。点击桌面启动一个进程(pid:5636 包名:com.example.test111)调用到ProcessList.java的startProcessLocked方法。调用到AMS的startProcess方法。
2024-07-15 17:55:43
279
原创 从系统侧设置开机三方应用自启动
2.对于没有源码的三方应用,无法直接在开机的时候直接启动创建进程,因此想到的解决方式是按照有源码的三方应用的persistent检测并创建进程的流程,强制加入需要的三方应用的信息并创建进程。1.对于有源码的三方应用,可以在/package/XXX/XXX/AndroidMannifest.xml中添加属性。以上满足了两种三方应用的开机自启动,测试再次打开应用后测试为温启动不是冷启动,满足对于打开应用速度拆帧要求。当进程设置为常驻进程后,adj的值比较高,不容易被ActivityManager kill掉。
2024-07-09 10:35:40
542
原创 移除SafeMode
移除SafeMode第一次尝试的方法是在systemui下面直接将ShutDownAction的onLongPress和onPress方法回调都执行shutdown流程。客户不同意在SystemUI目录下做此修改。尝试第二中修改方案。查看/data/system/users/0.xml文件。增加DISALLOW_SAFE_BOOT。
2024-07-09 10:32:42
236
原创 长按Power键关机流程
调用到ShutdownThread的实现方法,长按Power off传入的safeMode值为true,执行rebootSafeMode方法;最终都调用的是ShutdownThread的shutdownInner方法,若是safemode则进行弹窗提示。客户提出去除Safe Mode需求,这个是在长按Power键跳出Power off按钮,再长按Power off后会弹出Safe Mode 进入提示框,然后点击之后就会重启进入Safe Mode模式。长按到界面出现Poweroff 弹窗逻辑梳理。
2024-07-04 19:30:03
461
原创 解析Hprof文件
解析Hprof文件1.安装MemoryAnalyzer-1.15.0.20231206-win32.win32.x86_642.打开报错:Version1.8.0 of the jvm is not suitable for this product,Version17 or greater isrequired配置java位置MemoryAnalyzer.ini文件中添加:-vmC:Files。
2024-07-02 16:39:52
6070
1
原创 DropBoxManagerService源码
调用DropBoxManager的addText,进而调用到DropBoxManagerService服务。DropBoxManagerService创建。
2024-07-01 18:05:21
237
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人