打开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
  1. 之后的阶段就是有过几次事务状态变化,但是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分析相关推荐

  1. App性能分析数据监控

    App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...

  2. linux下电池测试软件,你们要的App电量分析测试来了

    原标题:你们要的App电量分析测试来了 Batterystats 是包含在 Android 框架中的一种工具,用于收集设备上的电池数据.您可以使用 adb 将收集的电池数据转储到开发计算机,并创建一份 ...

  3. 集美大学1414班软件工程个人作业2——个人作业2:APP案例分析

    一.作业链接 个人作业2:APP案例分析 二.博文要求 通过分析你选中的产品,结合阅读<构建之法>,写一篇随笔,包含下述三个环节的所有要求.  第一部分 调研, 评测 下载软件并使用起来, ...

  4. 苹果自带的APP下载分析统计工具

    对于APP运营的工作人员,查看APP的下载量和访问量是非常重要的.当然,我们开发人员有时候也会想看看自己开发的APP有多少人在使用,但是苹果开发者官网一直没有提供这个功能,一些第三方的网站,比如蒲公英 ...

  5. Android App 耗电量分析-1

    分为新老两个版本的SDK-TOOL,新版的放在另外一篇博客 Android App 电量分析https://blog.csdn.net/kan137g/article/details/84886277 ...

  6. 美团App用户界面分析

    关于美团 美团网成立于2010年,合并前是中国销售额最大的独立团购 App.美团网2014年全年交易额突破460亿元,较去年增长180%以上,市场份额占比超60%,用户数超2亿~ 美团 App 用户界 ...

  7. APP逆向案例之(二)对加固APP进行分析和破解

    说明:对加固APP进行分析和破解,对发现新版本提示关掉 1.先对APP窗口类行进HOOK,确定窗口提示用的是那个类. android hooking watch class android.app.A ...

  8. 交互设计:依据用户体验要素知识点,进行APP的分析和改良设计。

    设计题 依据用户体验要素知识点,进行APP的分析和改良设计. 设计要求: 1.选择一个APP,分析并绘制该APP的交互框架,包括信息架构.导航模式.页面结构,并分析其优点和不足. 2.图文并茂地分析该 ...

  9. 【该文章已被封禁】区块链钱包APP逆向分析及实现

    [区块链钱包APP逆向分析及实现]该文章已被封禁,需要看的兄弟姐妹们,请打开下面个人的博客进行查看: 0.原文链接:点击我进行打开: https://qqizai.gitee.io/qqizai/vi ...

  10. python 安卓app 缺点_用python对android APP进行分析2

    文章接着前一篇文章<用python对android APP进行分析1>的内容 转换其他列数据类型 data.Reviews=data['Reviews'].astype(np.int,in ...

最新文章

  1. ML之SVM(三种):基于三种SVM(linearSVR、polySVR、RBFSVR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
  2. 五、开始学习Excel函数,效率快速提高
  3. 搞笑之----普通话
  4. Jaxb对xml报文头的小修小改
  5. 【SPFA】重建道路(jzoj 1212)
  6. 公众号后台接管技术支持_哪些技术有望接管开源?
  7. 解决GD中文乱码问题
  8. NSTimer里的userInfo
  9. js与jquery对象的互转
  10. faiss python安装_如何在ubuntu 18.04上安装faiss GPU
  11. Scikit-learn:模型选择Model selection之pipline和交叉验证
  12. SQL server2005安装问题
  13. 拓端tecdat|R语言在BRFSS数据中可视化分析探索糖尿病的影响因素
  14. 阿里云ubuntu服务器安装使用mysql并配置远程连接记录
  15. EXTJS学习笔记:grid之分组实现groupingview
  16. SpringBoot-DDD领域驱动设计的概念
  17. idea java maven 打包,idea maven项目 基于idea自己打包方式 以及使用maven插件打包的三种方式...
  18. js获取时间、节假日、节气
  19. 融360 D轮融资超10亿 平台型互联网金融价值凸显
  20. 【PR】如何处理视频在最后时声音逐渐变小

热门文章

  1. 深度学习笔记(15) 人的表现
  2. win10系统电池图标不见了怎么恢复
  3. Oracle的SQL注入
  4. 解决Google Chrome添加快捷方式图标模糊
  5. 工业产品常用的长度单位有哪些?
  6. 解决Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
  7. Android Camera 预览及录制视频 附demo
  8. 采购者具体负责的问题
  9. 百度云语音合成 Python SDK
  10. 如何成为优秀的软件人才