App StartingWindow分析
打开WMS的staring window日志
设置WindowManagerDebugConfig的
static final boolean DEBUG_STARTING_WINDOW = true;
从log和代码分析
1.setAppStartingWindow
首先针对主题进行检查 有一些主题下是不能显示startingwindow的
final boolean windowIsTranslucent = ent.array.getBoolean(com.android.internal.R.styleable.Window_windowIsTranslucent, false);final boolean windowIsFloating = ent.array.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);final boolean windowDisableStarting = ent.array.getBoolean(com.android.internal.R.styleable.Window_windowDisablePreview, false);
如上面三种
另外对于设置了
final boolean windowShowWallpaper = ent.array.getBoolean(
com.android.internal.R.styleable.Window_windowShowWallpaper, false); 以背景为壁纸
还要设置
windowFlags |= FLAG_SHOW_WALLPAPER
检查完主题之后 根据主题设置依稀样式相关的数据 保存在StartingData 数据结构里面,然后抛出消息给mH所在线程处理
wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel,labelRes, icon, logo, windowFlags);Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);// Note: we really want to do sendMessageAtFrontOfQueue() because we// want to process the message ASAP, before any other queued// messages.if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");mH.sendMessageAtFrontOfQueue(m);
设置AppWindowToken.startingView 为创建的decorview
2.处理过程case ADD_STARTING
通过日志可以分析 首先创建window和viww 通过PhoneWindowManager创建window 和viewRoot,并且addWindow到WMS,
创建WindowState和surface数据 整个过程可以根据log看出
mPolicy.addStartingWindow(wtoken.token, sd.pkg, sd.theme,sd.compatInfo, sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.logo,sd.windowFlags, overrideConfig);
12-29 08:30:31.314 31101-32230/system_process V/WindowManager: setAppStartingWindow: token=Token{5108b27 ActivityRecord{cea59e6 u0 com.android.providers.downloads.ui/.activity.InterDownloadTaskDetailActivity t4}} pkg=com.android.providers.downloads.ui transferFrom=null
12-29 08:30:31.314 31101-32230/system_process V/WindowManager: Checking theme of starting window: 0x100d0017
12-29 08:30:31.314 31101-32230/system_process V/WindowManager: Translucent=false Floating=false ShowWallpaper=false
12-29 08:30:31.314 31101-32230/system_process V/WindowManager: Creating StartingData
12-29 08:30:31.314 31101-32230/system_process V/WindowManager: Enqueueing ADD_STARTING
- 之后的阶段就是有过几次事务状态变化,但是mDrawState=DRAW_PENDING 不做任何处理,直到客户端最后调用mWindowSession.finishDrawing(mWindow) 周后才会对动画状态进行切换,切换到COMMIT_DRAW_PENDING
12-29 08:30:31.344 31101-32230/system_process I/WindowManager: commitFinishDrawingLocked: Window{4730896 u0 Starting com.android.providers.downloads.ui} cur mDrawState=DRAW_PENDING
12-29 08:30:31.344 31101-32230/system_process D/WindowManager: updateWindows: starting Window{4730896 u0 Starting com.android.providers.downloads.ui} isOnScreen=false allDrawn=false freezingScreen=false
12-29 08:30:31.358 31101-32230/system_process I/WindowManager: commitFinishDrawingLocked: Window{4730896 u0 Starting com.android.providers.downloads.ui} cur mDrawState=DRAW_PENDING
12-29 08:30:31.358 31101-32230/system_process D/WindowManager: updateWindows: starting Window{4730896 u0 Starting com.android.providers.downloads.ui} isOnScreen=false allDrawn=false freezingScreen=false
12-29 08:30:31.360 31101-31218/system_process V/WindowManager: Finishing drawing window Window{4730896 u0 Starting com.android.providers.downloads.ui}: mDrawState=DRAW_PENDING
4 这是在进行事务处理的时候就会有所变化,切换到READY_TO_SHOW状态,但是由于现在app还没有准备好 mAppTransition.isReady() ==false 还不能绘制
12-29 08:30:31.360 31101-31218/system_process V/WindowManager: Draw state now committed in Window{4730896 u0 Starting com.android.providers.downloads.ui}
12-29 08:30:31.361 31101-31218/system_process I/WindowManager: commitFinishDrawingLocked: Window{4730896 u0 Starting com.android.providers.downloads.ui} cur mDrawState=COMMIT_DRAW_PENDING12-29 08:30:31.362 31101-31218/system_process V/WindowManager: performShow on WindowStateAnimator{7e561ed Starting com.android.providers.downloads.ui}: mDrawState=READY_TO_SHOW readyForDisplay=false starting=true
during animation: policyVis=true attHidden=false tok.hiddenRequested=true tok.hidden=true animating=false tok animating=false Callers=com.android.server.wm.WindowStateAnimator.commitFinishDrawingLocked:631 com.android.server.wm.WindowSurfacePlacer.applySurfaceChangesTransaction:761 com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementInner:324 12-29 08:30:31.362 31101-31218/system_process D/WindowManager: updateWindows: starting Window{4730896 u0 Starting com.android.providers.downloads.ui} isOnScreen=false allDrawn=false freezingScreen=false
12-29 08:30:31.365 31101-32230/system_process I/WindowManager: commitFinishDrawingLocked: Window{4730896 u0 Starting com.android.providers.downloads.ui} cur mDrawState=READY_TO_SHOW
5 直到handleAppTransitionReadyLocked被调用之后 app才准备好 readyForDisplay,就可以把状态切换为HAS_DRAWN
mDrawState = HAS_DRAWN
12-29 08:30:31.373 31101-32230/system_process V/WindowManager: performShow on WindowStateAnimator{7e561ed Starting com.android.providers.downloads.ui}: mDrawState=READY_TO_SHOW readyForDisplay=true starting=true during animation: policyVis=true attHidden=false tok.hiddenRequested=false tok.hidden=false animating=false tok animating=false Callers=com.android.server.wm.AppWindowAnimator.showAllWindowsLocked:458 com.android.server.wm.WindowSurfacePlacer.handleOpeningApps:1263 com.android.server.wm.WindowSurfacePlacer.handleAppTransitionReadyLocked:1197
6 真正的window启动之后,就会改变windowState的mAttrs.type 变成非TYPE_APPLICATION_STARTING的,
执行void onFirstWindowDrawn(WindowState win, WindowStateAnimator winAnimator)方法
该方法会把 方法哦WMS的mFinishString队列中 之后发送消息
void onFirstWindowDrawn(WindowState win, WindowStateAnimator winAnimator) {firstWindowDrawn = true;// We now have a good window to show, remove dead placeholdersremoveAllDeadWindows();if (startingData != null) {if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Slog.v(TAG, "Finish starting "+ win.mToken + ": first real window is shown, no animation");// If this initial window is animating, stop it -- we will do an animation to reveal// it from behind the starting window, so there is no need for it to also be doing its// own stuff.winAnimator.clearAnimation();winAnimator.mService.mFinishedStarting.add(this);winAnimator.mService.mH.sendEmptyMessage(H.FINISHED_STARTING);}updateReportedVisibilityLocked();}
12-29 08:30:31.486 31101-31218/system_process V/WindowManager: Finish starting AppWindowToken{8089f7d token=Token{5108b27 ActivityRecord{cea59e6 u0 com.android.providers.downloads.ui/.activity.InterDownloadTaskDetailActivity t4}}}: first real window is shown, no animation
7 之后WMS处理消息 case FINISHED_STARTING:
调用mPolicy.removeStartingWindow(token, view) 移除window
8 最后destorySurface的时候清理
App StartingWindow分析相关推荐
- App性能分析数据监控
App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...
- linux下电池测试软件,你们要的App电量分析测试来了
原标题:你们要的App电量分析测试来了 Batterystats 是包含在 Android 框架中的一种工具,用于收集设备上的电池数据.您可以使用 adb 将收集的电池数据转储到开发计算机,并创建一份 ...
- 集美大学1414班软件工程个人作业2——个人作业2:APP案例分析
一.作业链接 个人作业2:APP案例分析 二.博文要求 通过分析你选中的产品,结合阅读<构建之法>,写一篇随笔,包含下述三个环节的所有要求. 第一部分 调研, 评测 下载软件并使用起来, ...
- 苹果自带的APP下载分析统计工具
对于APP运营的工作人员,查看APP的下载量和访问量是非常重要的.当然,我们开发人员有时候也会想看看自己开发的APP有多少人在使用,但是苹果开发者官网一直没有提供这个功能,一些第三方的网站,比如蒲公英 ...
- Android App 耗电量分析-1
分为新老两个版本的SDK-TOOL,新版的放在另外一篇博客 Android App 电量分析https://blog.csdn.net/kan137g/article/details/84886277 ...
- 美团App用户界面分析
关于美团 美团网成立于2010年,合并前是中国销售额最大的独立团购 App.美团网2014年全年交易额突破460亿元,较去年增长180%以上,市场份额占比超60%,用户数超2亿~ 美团 App 用户界 ...
- APP逆向案例之(二)对加固APP进行分析和破解
说明:对加固APP进行分析和破解,对发现新版本提示关掉 1.先对APP窗口类行进HOOK,确定窗口提示用的是那个类. android hooking watch class android.app.A ...
- 交互设计:依据用户体验要素知识点,进行APP的分析和改良设计。
设计题 依据用户体验要素知识点,进行APP的分析和改良设计. 设计要求: 1.选择一个APP,分析并绘制该APP的交互框架,包括信息架构.导航模式.页面结构,并分析其优点和不足. 2.图文并茂地分析该 ...
- 【该文章已被封禁】区块链钱包APP逆向分析及实现
[区块链钱包APP逆向分析及实现]该文章已被封禁,需要看的兄弟姐妹们,请打开下面个人的博客进行查看: 0.原文链接:点击我进行打开: https://qqizai.gitee.io/qqizai/vi ...
- python 安卓app 缺点_用python对android APP进行分析2
文章接着前一篇文章<用python对android APP进行分析1>的内容 转换其他列数据类型 data.Reviews=data['Reviews'].astype(np.int,in ...
最新文章
- ML之SVM(三种):基于三种SVM(linearSVR、polySVR、RBFSVR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
- 五、开始学习Excel函数,效率快速提高
- 搞笑之----普通话
- Jaxb对xml报文头的小修小改
- 【SPFA】重建道路(jzoj 1212)
- 公众号后台接管技术支持_哪些技术有望接管开源?
- 解决GD中文乱码问题
- NSTimer里的userInfo
- js与jquery对象的互转
- faiss python安装_如何在ubuntu 18.04上安装faiss GPU
- Scikit-learn:模型选择Model selection之pipline和交叉验证
- SQL server2005安装问题
- 拓端tecdat|R语言在BRFSS数据中可视化分析探索糖尿病的影响因素
- 阿里云ubuntu服务器安装使用mysql并配置远程连接记录
- EXTJS学习笔记:grid之分组实现groupingview
- SpringBoot-DDD领域驱动设计的概念
- idea java maven 打包,idea maven项目 基于idea自己打包方式 以及使用maven插件打包的三种方式...
- js获取时间、节假日、节气
- 融360 D轮融资超10亿 平台型互联网金融价值凸显
- 【PR】如何处理视频在最后时声音逐渐变小