您的位置:首页 > 其它

通过日志快速分析动画资源来自哪里

2016-09-09 20:11 681 查看
通过日志快速分析动画资源来自哪里

分析步骤:
    ①首先打开WMS中所有日志开关,对于MTK平台,使用“adb shell dumpsys window -d enable a”便可打开WMS的日志开关。

    ②抓取日志,在日志中搜索“Setting animation in”关键字,定位到目标窗口日志行,再向上翻日志查到最近的“applyAnimation:”、“Loading animations: picked package=”和“Loading animations:”关键字;

    ③“Loading animations:”关键字
    如果关键字是“Loading animations: layout params pkg=”,那么resId取自某个窗口的WindowManager.LayoutParams.windowAnimations值(可通过“adb
shell dumpsys window w”打印窗口的属性查看究竟是哪个窗口的LayoutParams.windowAnimations值)。如果((resId&0xFF000000) == 0x01000000)为true,那么资源取自系统自带,否则取自应用程序。

    如果关键字是"Loading animations: package=" ,那么该资源resId是应用程序调用overrideInPlaceAppTransition()或overridePendingAppTransition()接口传进来的,该resId自然取自应用程序。

    ③“Loading animations: picked package=”关键字
    关键字后面接的就是这个动画资源来自哪里。如果"package = android"那这个可能是不准的,需要自己用((resId&0xFF000000) == 0x01000000)公式来算比较靠谱;如果package = 应用包名,那么资源就取自应用程序。

    ④“applyAnimation:”关键字
    关键字可以判断出这个动画是什么类型的:如果后面接的是“win=”,那么就是窗口动画;如果后面接的是" anim=",那么就是Activity切换动画,对于Activity切换动画,这条日志可以推出更多的信息,比如transit值等;

    下面是三份日志,第一份是设置Activity切换动画,第二份是设置PopupWindow窗口动画,第三份是设置Activity切换动画。读者可尝试根据上面所说的自行分析动画资源究竟取自哪里。

[java] view
plain copy

10-16 08:40:27.149   825   917 V AppTransition: Loading animations: package=com.meizu.flyme.launcher resId=0xa040040  

10-16 08:40:27.149   825   917 V AppTransition: Loading animations: picked package=com.meizu.flyme.launcher      //关键字“Loading animations: picked package=”  

10-16 08:40:27.149   825   917 I AppTransition:  id = a040040 overlayId = 0  

10-16 08:40:27.151   825   917 V AppTransition: applyAnimation: anim=android.view.animation.AnimationSet@11689517 nextAppTransition=ANIM_CUSTOM transit=12 isEntrance=true Callers=com.android.server.wm.WindowManagerService.applyAnimationLocked:3878 com.android.server.wm.WindowManagerService.setTokenVisibilityLocked:4991 com.android.server.wm.WindowManagerService.handleAppTransitionReadyLocked:10053   

10-16 08:40:27.151   825   917 V WindowManager: Loaded animation android.view.animation.AnimationSet@11689517 for AppWindowToken{1281e4b token=Token{234d731a ActivityRecord{1c78edc5 u0 com.android.mms/.ui.ConversationList t106}}}  

10-16 08:40:27.151   825   917 V WindowManager: java.lang.RuntimeException  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.applyAnimationLocked(WindowManagerService.java:3886)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.setTokenVisibilityLocked(WindowManagerService.java:4991)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.handleAppTransitionReadyLocked(WindowManagerService.java:10053)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedInner(WindowManagerService.java:10788)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedLoop(WindowManagerService.java:9601)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLocked(WindowManagerService.java:9543)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.access$700(WindowManagerService.java:182)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:8457)  

10-16 08:40:27.151   825   917 V WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:111)  

10-16 08:40:27.151   825   917 V WindowManager:     at android.os.Looper.loop(Looper.java:192)  

10-16 08:40:27.151   825   917 V WindowManager:     at android.os.HandlerThread.run(HandlerThread.java:61)  

10-16 08:40:27.151   825   917 V WindowManager:     at com.android.server.ServiceThread.run(ServiceThread.java:46)        //“Setting animation in”关键字  

10-16 08:40:27.151   825   917 V AppWindowAnimator: Setting animation in AppWindowToken{1281e4b token=Token{234d731a ActivityRecord{1c78edc5 u0 com.android.mms/.ui.ConversationList t106}}}: android.view.animation.AnimationSet@11689517 wxh=1080x1920 isVisible=true  

10-16 08:40:27.151   825   917 V AppWindowAnimator: Updating layer Window{1e5b3c6c u0 Starting com.android.mms}: 22015  

   上面这份日志表明动画资源取自com.meizu.flyme.launcher。

[java] view
plain copy

10-16 16:48:12.874   825  1863 V AppTransition: Loading animations: layout params pkg=com.android.mms resId=0x7f0e0087  

10-16 16:48:12.874   825  1863 V AppTransition: Loading animations: picked package=com.android.mms  

10-16 16:48:12.874   825  1863 I AppTransition:  id = 7f050018 overlayId = 0  

10-16 16:48:12.875   825  1863 V WindowStateAnimator: applyAnimation: win=WindowStateAnimator{8c23690 PopupWindow:2d5ab621} anim=0 attr=0x1 a=android.view.animation.AnimationSet@8928a66 transit=2 isEntrance=false Callers com.android.server.wm.WindowManagerService.removeWindowLocked:3022 com.android.server.wm.WindowManagerService.removeWindow:2977 com.android.server.wm.Session.remove:193   

10-16 16:48:12.875   825  1863 V WindowStateAnimator: Loaded animation android.view.animation.AnimationSet@8928a66 for WindowStateAnimator{8c23690 PopupWindow:2d5ab621}  

10-16 16:48:12.875   825  1863 V WindowStateAnimator: java.lang.RuntimeException  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at com.android.server.wm.WindowStateAnimator.applyAnimationLocked(WindowStateAnimator.java:1947)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at com.android.server.wm.WindowManagerService.removeWindowLocked(WindowManagerService.java:3022)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2977)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at com.android.server.wm.Session.remove(Session.java:193)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:233)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at com.android.server.wm.Session.onTransact(Session.java:136)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator:   at android.os.Binder.execTransact(Binder.java:451)  

10-16 16:48:12.875   825  1863 V WindowStateAnimator: Setting animation in WindowStateAnimator{8c23690 PopupWindow:2d5ab621}: android.view.animation.AnimationSet@8928a66  

    上面这份日志表明动画资源取自com.android.mms。

[java] view
plain copy

10-16 16:58:18.414   825   917 V AppTransition: Loading animations: layout params pkg=android resId=0xa1000d4  

10-16 16:58:18.414   825   917 V AppTransition: Loading animations: picked package=android  

10-16 16:58:18.414   825   917 I AppTransition:  id = a04002d overlayId = 0  

10-16 16:58:18.415   825   917 V AppTransition: applyAnimation: anim=android.view.animation.AnimationSet@185fc32b animAttr=0x4 transit=6 isEntrance=true Callers=com.android.server.wm.WindowManagerService.applyAnimationLocked:3878 com.android.server.wm.WindowManagerService.setTokenVisibilityLocked:4991 com.android.server.wm.WindowManagerService.handleAppTransitionReadyLocked:10053   

10-16 16:58:18.416   825   917 V WindowManager: Loaded animation android.view.animation.AnimationSet@185fc32b for AppWindowToken{3583ca17 token=Token{987e96 ActivityRecord{233b49b1 u0 android/com.android.internal.app.MzResolverActivity t109}}}  

10-16 16:58:18.416   825   917 V WindowManager: java.lang.RuntimeException  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.applyAnimationLocked(WindowManagerService.java:3886)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.setTokenVisibilityLocked(WindowManagerService.java:4991)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.handleAppTransitionReadyLocked(WindowManagerService.java:10053)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedInner(WindowManagerService.java:10788)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLockedLoop(WindowManagerService.java:9601)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.performLayoutAndPlaceSurfacesLocked(WindowManagerService.java:9543)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService.access$700(WindowManagerService.java:182)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:8457)  

10-16 16:58:18.416   825   917 V WindowManager:     at android.os.Handler.dispatchMessage(Handler.java:111)  

10-16 16:58:18.416   825   917 V WindowManager:     at android.os.Looper.loop(Looper.java:192)  

10-16 16:58:18.416   825   917 V WindowManager:     at android.os.HandlerThread.run(HandlerThread.java:61)  

10-16 16:58:18.416   825   917 V WindowManager:     at com.android.server.ServiceThread.run(ServiceThread.java:46)  

10-16 16:58:18.416   825   917 V AppWindowAnimator: Setting animation in AppWindowToken{3583ca17 token=Token{987e96 ActivityRecord{233b49b1 u0 android/com.android.internal.app.MzResolverActivity t109}}}: android.view.animation.AnimationSet@185fc32b wxh=1080x1920 isVisible=true  



    上面这份日志表明动画资源取自android/com.android.internal.app.MzResolverActivity窗口,说明MzResolverActivity这个Activity肯定是内部重新设了窗口的Activity切换动画资源,检查源码果然发现在onCreate()函数内部使用setTheme(com.flyme.internal.R.style.Theme_Flyme_Resolver)重置了Activity切换动画。

    最后总结一下:Activity切换动画可能来源包括系统默认、调用startActivity()或overridePendingAppTransition()指定、应用Activity内部重置窗口LayoutParams.windowAnimations值(可通过setTheme()来重置),这三者取其一,互斥关系;窗口动画来源包括:系统默认、窗口指定的LayoutParams.windowAnimations。




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐