自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xiaoyantan的博客

居安思危,思则有备,有备无患

  • 博客(75)
  • 资源 (1)
  • 收藏
  • 关注

原创 ANR原理及分析

分析ANR步骤确定ANR基本信息先搜索am_anr 确定ANR时间点,进程id ,以及什么类型ANR,等待了多久等03-04 13:45:03.781 1000 1199 14667 I am_anr : [0,2900,com.android.systemui,551042573**,Input dispatching timed ou**t (StatusBar, b49ba2b StatusBar (server) is not responding. Waited 8001ms for Mot

2021-07-05 17:33:57 3779

原创 了解AsyncRotationController

基于android 15.0, 以从强制横屏App上滑退回桌面流程来分析AsyncRotationController 是一种控制器,用于处理设备显示屏旋转时非活动窗口的异步更新。这种控制器通过异步处理来优化屏幕旋转或应用过渡动画的启动延迟,确保窗口在旋转过程中能够平滑过渡,避免闪烁或延迟问题。在旋转变化时处理窗口的淡出和淡入效果。隐藏和显示目标窗口以匹配新的旋转角度。使用同步事务管理无缝旋转,确保窗口能够平滑过渡到新的旋转状态。

2024-07-11 23:00:00 332

原创 WM Shell多动画场景处理

Track是一组连续且按顺序执行的transitions,如果一个transition与所有其他的transition并行(在动画就绪时),那么他将被分配一个新的track。然而,对于真正独立的transitions,他们的动画可以独立的运行。READY 及之后的生命周期按“track”进行管理,在一个track中,所有动画都按描述的方式进行排序,一个track内,一次只能有一个transition处于active状态;如果它不与他们重叠,它可以并行动画,在这种情况下,它将被分配一个新的track。

2024-05-08 20:03:34 1264

原创 android U广播详解(二)

/ 用作单个进程批量分发receivers,已被丢弃// 主要逻辑所在类,包括入队、分发、结束等// 进程队列,分发广播时的单位// 之前的BroadcastQueue// 决定是否跳过分发当前receiver// 默认使用modern Queue} else {......

2023-10-16 21:36:37 1402

原创 android U广播详解(一)

BroadcastQueueModernImpl 的设计围绕着为设备上的每个潜在进程维护一个单独的 BroadcastProcessQueue 实例。表明用于传送到特定进程的Pending {@link BroadcastRecord} 条目队列。整个类都标记为 {@code NotThreadSafe},因为调用者有责任始终与持有的相关锁进行交互。

2023-10-12 21:04:09 2031 2

原创 Configuration Change派发到App进程

其它Activity会在下次resume的时候再触发relaunch,跟上面两个不在同一线程以及同一时间执行,如果想查找relaunch的具体原因,需要向前时间查找对应的configuration_changed的log,具体参考https://blog.csdn.net/xiaoyantan/article/details/126292133。针对Activity级别的处理,relaunch当前Activity或触发当前Actiivty回调onConfigurationChanged方法,只会发生其一。

2023-10-11 21:30:00 755

原创 Activity生命周期递归问题查看

这类问题一般比较难分析,符合以下情况的才有可能分析出来:能够复现并调试有问题时的堆栈以及对应的event logTaskFragment#shouldSleepActivities 方法导致递归There is a recursion among check for sleep and complete pause during sleeping关键log01-08 08:45:42.946 1941 5167 I wm_finish_activity: [0,240239432,518

2023-09-14 21:18:48 558

原创 Bubbles原理解析

气泡使用户可以轻松查看和参与对话。 气泡内置于通知系统中。 它们漂浮在其他应用程序内容之上,无论用户走到哪里都会跟随他们。 气泡可以展开以显示应用程序功能和信息,并且可以在不使用时折叠。 当设备被锁定或始终显示处于活动状态时,气泡会像通常的通知一样出现。 气泡是一种选择退出功能

2023-01-14 00:15:00 1407

原创 后台执行限制总结

针对后台Service针对后台启动Activity针对后台启动FGS/后台启动FGS的while-in-use权限。

2023-01-08 00:30:00 1563

原创 android 11+后台启动FGS的while-in-use权限限制

为了帮助保护用户隐私,Android 11(API 级别 30)对前台服务何时可以访问设备的位置、摄像头或麦克风进行了限制。

2023-01-08 00:00:00 1496

原创 临时白名单

前两个临时白名单可以豁免后台启动Service、豁免uid后台1min后进入idle状态等,最后一个临时白名单可以后台启动FGS.

2023-01-07 00:00:00 1055

原创 android 12+从后台启动FGS限制

以 Android 12(API 级别 31)或更高版本为目标平台的应用在后台运行时无法启动前台服务,少数特殊情况除外。如果应用程序在后台运行时尝试启动前台服务,而前台服务不满足其中一种异常情况,系统将抛出 ForegroundServiceStartNotAllowedException。注意:如果一个应用调用 Context.startForegroundService() 来启动另一个应用拥有的前台服务,则这些限制仅适用于两个应用都以 Android 12 或更高版本为目标的情况。

2023-01-03 11:28:09 7147

原创 android 10+从后台启动 Activity 的限制

Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity 的时间施加限制。这些限制有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:

2022-12-25 09:30:00 10255 1

原创 android 8.0+后台广播限制

如果应用注册为接收广播,则在每次发送广播时,应用的接收器都会消耗资源。如果多个应用注册为接收基于系统事件的广播,则会引发问题:触发广播的系统事件会导致所有应用快速地连续消耗资源,从而降低用户体验。为了缓解这一问题,Android 7.0(API 级别 24)对广播施加了一些限制,如中所述。Android 8.0(API 级别 26)让这些限制更为严格。适配 Android 8.0 或更高版本的应用无法继续在其清单中为隐式广播注册广播接收器。_隐式广播_是一种不专门针对该应用的广播。

2022-12-24 00:15:00 2508

原创 android 8.0+后台Service限制

每次在后台运行时,应用都会消耗一部分有限的设备资源,例如 RAM。这可能会影响用户体验,如果用户正在使用占用大量资源的应用(例如玩游戏或观看视频),影响会尤为明显。为了提升用户体验,Android 8.0(API 级别 26)对应用在后台运行时可以执行的操作施加了限制。在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。Android 8.0 有一项复杂功能:系统不允许后台应用创建后台 Service。

2022-12-24 00:00:00 4966

原创 BackgroundLaunchProcessController 介绍

Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity 的时间施加限制。这些限制有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。为了改进应用性能和用户体验,以 Android 12 或更高版本为目标平台的应用无法从用作通知 trampoline 的服务或广播接收器中启动 activity。换言之,当用户点按通知或通知中的操作按钮时,您的应用无法在服务或广播接收器内调用 startActivity()。

2022-12-14 21:17:08 866

原创 进程被杀&Task被移除

forceStop时传入killPackageProcessesLSP的参数setRemoved为true,会提前将相关进程对应的Activity mark finish(避免进程又因为next top被重新拉起),等待进程死亡时去执行finish操作。当Task处于前台&Task中唯一的activity不处于onStop(可能处于onResume/onPause等)状态时,当前进程被kill查杀,当前activity会被finish导致task中因无activity而被移除。

2022-12-09 19:15:52 1359

原创 窗口的显示过程

app进程执行完当前Activity的onResume方法后,会通过ViewRootImpl去告诉system server进程添加当前activity的窗口。窗口surface已经绘制完成,正在等待布局系统进行提交;suface创建完成后等待绘制。上次的Vsync信号来临主线程执行doFrame操作,并通过系列回调执行下一次的sheduleVsync。给窗口创建一个空白的surface,但是还没有开始绘制,所以surface是隐藏的。窗口对应surface的默认绘制状态为NO_SURFACE。

2022-10-14 14:30:07 1928

原创 android T分屏流程

android T上对分屏流程进行了重构,之前用WINDOWING_MODE_SPLIT_SCREEN_PRIMARY等windowingMode来判断当前窗口是否分屏已经失效;分屏的触发操作放在了wm shell下,运行在systemui进程;将分屏涉及到的reparent、reorder等系列操作封装到WindowContainerTransaction中通过WindowOrganizer的applyTransaction来通知system server进行相关处理实现分屏。

2022-09-28 20:57:10 4922 3

原创 Activity Stop条件及原理

在遇到窗口显示相关问题时,Activity Stop慢总是被先关注到,但是很多情况下Stop慢只是问题的结果并非原因。本文阐述Activity stop需要满足的条件,帮助分析Activity stop慢的原因。

2022-09-22 10:09:05 1230

原创 如何分析Activity被relaunch原因

Activity莫名被relaunch了导致功能异常,本文简单明确讲述了如何查看问题原因并解决

2022-08-12 10:19:42 1742

原创 Service重启流程

了解什么情况下进程被杀后Service能重启?什么时候重启?不同返回值的重启有什么区别?Service重启时序图onStartCommand不同返回值有什么不同的效果?START_NOT_STICKY进程被杀后Service不会被重启 : 因为这里stopIfKilled赋值为true。START_STICKY_COMPATIBILITYService被杀死后会重启(执行了onCreate方法),但是onStartCommand方法没有被执行。START_STICKY进程被杀后S

2022-07-07 17:53:42 2677

原创 android studio编译安装apk失败

上午11:17 Failed to commit install session 1012874714 with command cmd package install-commit 1012874714. Error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl1012874714.tmp/base.apk (at Binary XML file line #30

2022-07-02 11:23:20 1949

原创 restartProcessIfVisible的流程

restartProcessIfVisible 方式重启当前app的进程

2022-06-22 20:09:29 306

原创 前台Service发展历史

启动和移除启动通常在Service的onStartCommand()方法中回调startForeground()方法,避免10s超时发生ANR。Context context = getApplicationContext();Intent intent = new Intent(...); // Build the intent for the servicecontext.startForegroundService(intent);startForeground()方法中需要传入唯一标识

2022-05-01 16:28:56 2425 1

原创 android T 后台限制

简化应用程序限制:标准化一组应用限制级别在后台设置功耗限制提供保护有效用例的机制提高及时通知的可靠性(FCM 配额)豁免重要用例(音乐、导航等)更好的工作优先级 监控并自动限制或显示滥用应用程序在后台应用程序消耗 X%(即 2%)的电池电量时,移动它到受限存储分区在 BG 和 FGS 状态下,应用程序消耗的电池电量占 Y%(即 4%)时,通过有关高功耗的通知警告用户级别无限制优化(自适应存储分区)受限存储分区(非常有限的后台工作)后台限制(无 FGS,延迟 BOOT_C.

2022-04-26 21:10:10 4118

原创 android T 前台Service

https://developer.android.com/about/versions/13/get用户控制: 用户在长时间运行的应用程序上获得更多透明度和控制权:前台服务仍然需要包含通知,并且应用程序必须请求权限才能显示通知。FGS 通知现在可以被用户关闭而不影响 FGS用户可以在任务管理器中查看长时间运行的应用列表任务管理器还允许用户停止应用程序通知权限介绍https://developer.android.com/reference/android/Manifest.

2022-04-26 20:33:05 2655

原创 Framework常用命令集合

AMS相关Activity相关功能命令AMS所有信息adb shell dumpsys activityActivity相关信息adb shell dumpsys activity activities查看当前前台焦点页面adb shell dumpsys activity a查看当前可见页面adb shell dumpsys activity a查看top页面的详细信息adb shell dumpsys activity top-resumed

2022-03-09 17:18:25 3400

原创 ContentProvider详解

本文基于android 12.0主要讲解的是A进程访问B进程的ContentProvider的流程进程A查询ContentProvider运行在A进程中, 主要涉及到的类如下:frameworks/base/core/java/android/content/ContentResolver.javaframeworks/base/core/java/android/app/ContextImpl$ApplicationContentResolver.javaframeworks/base/cor

2022-03-01 16:06:08 4314

原创 Activity生命周期基础知识

一些基础类介绍ClientTransactionItem:能够被计划和执行的客户端回调消息ActivityLifecycleItem activity生命周期回调项,是个抽象类,继承自ClientTransactionItem,每个子类有target stateClientTransaction 是个持有一系列消息的容器,可以将消息发送给客户端,包括一个callbacks列表和一个最终的生命周期状态ClientTransaction封装一系列消息的容器,由system server端构建并通过

2021-09-15 20:59:16 278

原创 framework 广播基础知识和常见问题

基础知识framework层广播相关的逻辑主要在AMS.java和BroadcastQueue.java中,代表一个广播的是BroadcastRecord。分类注册方式:静态注册: android manifest文件注册,常驻广播,分发慢。动态注册:代码中注册,非常驻,分发快。接收者:显示广播:指定接收方的class类型隐式广播:只指定action,uri等, android 8.0开始限制了隐式广播的接收发送方式:静态注册的广播,一律按照串行广播处理,因为可能会设计到拉

2021-08-30 16:55:14 1671

原创 framework层Service的基础知识和常见问题

简介framework层Service相关的逻辑主要在ActiveServices类中。分类启动方式start方式启动:onCreate() → onStartCommand() → stopService → onDestroy()bind方式启动:onCreate() → onBind() → unbindService → onUnbind() → onDestroy()运行方式(优先级)前台Service:会在通知栏显示通知,优先级较高;anr超时时间为20s后台Servi

2021-08-30 11:12:07 2512

原创 线程池原理

类图Executor -> ExecutorService -> AbstractExecutorService -> ThreadPoolExecutor线程池的主要任务是将“任务”和“线程”解偶,生产者-消费者模式线程池状态管理高3位保存线程池的运行状态runState,低29位保存有效线程数量workerCount @ReachabilitySensitive private final AtomicInteger ctl = new AtomicInteg

2021-07-28 20:56:10 186

原创 从系统看进程

一些常用命令进程相关命令作用命令查看lru listadb shell dumpsys activity lru查看总体进程相关信息adb shell dumpsys activity processes查看某个进程的详细信息adb shell dumpsys activity p processName查看进程的oomadb shell dumpsys activity oom内存相关命令作用命令查看历史Lmk查杀对应级别数量

2021-07-06 11:48:59 1972

原创 从系统看ContentProvider

查询ContentProvider : adb shell content query --uri uriCONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG 消息超时为10s,在AMS的attachApplicationLocked发出,在app端回调后在AMS的publishContentProviders中移除。若10s内未执行上述publish过程会杀掉此进程。08-17 20:21:30.081 1000 1534 1737 I am_proc_start: [0,

2021-07-06 10:31:44 2072

原创 从系统看Broadcast入队与分发流程

一些基本信息查看广播记录的命令:dumpsys activity broadcasts 相关结构:Registered Receivers:Receiver Resolver Table:Historical broadcasts [foreground]Historical broadcasts summary [foreground]Historical broadcasts [background]Historical broadcasts summary [background

2021-07-05 18:27:20 2876 1

原创 android如何分析进程被杀问题

查看进程被杀的3个步骤确定被杀进程的包名有人给出直接用百度搜索app对应的包名确定进程被杀的精确时间点有进程被杀时间点及原因包名,则直接用log中搜索正则表达式(gedit支持正则)am_proc_died: [0,[0-9]*,xxxx,,xxxx代表包名 ,拿到这行log的时间点以及进程pideg: 08-19 10:06:55.302 1000 1699 12137 I am_proc_died: [0,9307,com.quark.browser,905,11]如上栗子:

2021-07-05 15:27:58 33725 6

原创 android 如何分析卡顿问题

根据App包名 & uid 通过时间点附近的上下文找到App的pid下面仅举例(其他方式获取也可以)Package [com.miui.weather2] (5c2d4cd):userId=10072表示天气的uid为1007208-05 12:26:47.543 10072 26818 26818 I wm_on_create_called:[0,com.miui.weather2.ActivityWeatherMain,performCreate,86]表示天气App的uid

2021-07-05 14:28:25 2446

原创 Framework层分析按下返回键退出桌面流程

将Home stack移到前台并开始pause app的Activity04-12 11:18:06.601 1851 4006 I wm_finish_activity: [0,251368919,44,com.miui.gallery/.activity.HomePageActivity,app-request]04-12 11:18:06.615 1851 4006 I wm_focused_stack: [0,0,1,44,finish-top adjustFocusToNextFocusab

2021-07-05 10:54:02 1757

原创 Framework层Config Change流程

Framework层Config Change流程更新DisplayContent的override configurationRelaunch Or schedule configuration change处理topActivity的流程处理其他Activities的流程app端执行Relaunch或onConfigurationChanged流程Activity的重建onConfigurationChanged更新DisplayContent的override configuration// A

2021-07-05 10:42:22 1966

plantuml17929373002095501803.png

完整的Activity启动的时序图,包括上一个Actiivty的pause stop和下一个activity的create resume

2020-06-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除