Adroid M過場動畫引出SettingsProvider的整個邏輯

一、描述

測試發現點擊進入媒體中心,屏幕右側抖動(明顯),在原生設置中關閉過渡動畫發現OK
要求framework給關閉關閉過場動畫

二、關閉轉場動畫方法

一開始的思路是:修改原生設置中對應的默認值
這個思路在在Android O上,下面這樣修改是OK的

<item name="config_appTransitionAnimationDurationScaleDefault" format="float" type="dimen">0.0</item>

在Android M上,修改DatabaseHelper.java,替換上去不好使,這什麼鬼?!

packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadFractionSetting(stmt,Settings.System.TRANSITION_ANIMATION_SCALE,R.fraction.def_window_transition_scale, 0);

services/core/java/com/android/server/wm/WindowManagerService.java    
float mTransitionAnimationScaleSetting = 0.0f;

三、SettingsProvider邏輯

只能添加日誌看代碼邏輯了,中間遇到ftp拷貝文件,而文件md5不一致的現象,需要改用二級制傳輸
(1)SystemServer啓動後,調用ActivityManagerService.installSystemProviders()安裝SettingsProvider
(2)走到com.android.providers.settings.SettingsProvider.onCreate()後,創建SettingsRegistry
(3)SettingsRegistry初始化過程中創建migrateAllLegacySettingsIfNeeded(),並把數據庫轉爲xml文件
這個過程中會創建數據庫助手SQLiteOpenHelper的具體類DatabaseHelper
(4)執行DatabaseHelper.onCreate()中,會loadSystemSettings、loadGlobalSettings
而transition_animation_scale在system中,後面會遷移到global中

那對應的修改方案在loadSystemSettings、loadGlobalSettings都改了,應該OK了吧
替換上還不好使!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider: loadGlobalSettings 
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider: java.lang.Exception
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.DatabaseHelper.loadGlobalSettings(DatabaseHelper.java:2678)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.DatabaseHelper.loadSettings(DatabaseHelper.java:2409)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.DatabaseHelper.onCreate(DatabaseHelper.java:247)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.SettingsProvider$SettingsRegistry.migrateAllLegacySettingsIfNeeded(SettingsProvider.java:1559)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.SettingsProvider$SettingsRegistry.<init>(SettingsProvider.java:1385)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.providers.settings.SettingsProvider.onCreate(SettingsProvider.java:218)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.app.ActivityThread.installProvider(ActivityThread.java:5167)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.app.ActivityThread.installContentProviders(ActivityThread.java:4762)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at android.app.ActivityThread.installSystemProviders(ActivityThread.java:5348)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.server.am.ActivityManagerService.installSystemProviders(ActivityManagerService.java:10409)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.server.SystemServer.startOtherServices(SystemServer.java:515)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.server.SystemServer.run(SystemServer.java:291)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.server.SystemServer.main(SystemServer.java:189)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at java.lang.reflect.Method.invoke(Native Method)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider:      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider: loadFractionSetting, key=window_animation_scale, value=0.0, stmt=SQLiteProgram: INSERT OR IGNORE INTO global(name,value) VALUES(?,?);
[13:33:32]01-01 20:02:16.590  1930  1930 E SettingsProvider: loadFractionSetting, key=transition_animation_scale, value=0.0, stmt=SQLiteProgram: INSERT OR IGNORE INTO global(name,value) VALUES(?,?);
[13:33:32]01-01 20:02:16.607  1930  1930 E SettingsProvider: migrateLegacySettingsLocked, name=window_animation_scale, value=0.0
[13:33:32]01-01 20:02:16.607  1930  1930 E SettingsProvider: migrateLegacySettingsLocked, name=transition_animation_scale, value=0.0

四、WindowManagerService邏輯

之前一直懷疑修改的地方不對,根本沒往wm上懷疑
算了直接發大招吧,直接在Settings.java加上日誌打印看看都誰調用的

[13:27:38]01-01 20:00:21.487  1854  1875 E Settings: putStringForUser
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings: java.lang.Exception
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.provider.Settings$Global.putStringForUser(Settings.java:8003)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.provider.Settings$Global.putString(Settings.java:7996)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.provider.Settings$Global.putFloat(Settings.java:8231)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:8261)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.os.Handler.dispatchMessage(Handler.java:102)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.os.Looper.loop(Looper.java:148)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at android.os.HandlerThread.run(HandlerThread.java:61)
[13:27:38]01-01 20:00:21.487  1854  1875 E Settings:      at com.android.server.ServiceThread.run(ServiceThread.java:46)
[13:27:38]01-01 20:00:21.487  1854  1875 V Settings: Global.putString(name=transition_animation_scale, value=1.0 for 0

finishActivity中會改這個值

01-01 20:04:31.335  1754  2081 E WindowManager: mTransitionAnimationScaleSetting=1.0
01-01 20:04:31.335  1754  2081 E WindowManager: java.lang.Exception
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.wm.WindowManagerService.setAnimationScale(WindowManagerService.java:5750)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityStack.destroyActivityLocked(ActivityStack.java:3543)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:3073)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:3016)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityStack.requestFinishActivityLocked(ActivityStack.java:2832)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityManagerService.finishActivity(ActivityManagerService.java:4412)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:350)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2526)
01-01 20:04:31.335  1754  2081 E WindowManager: 	at android.os.Binder.execTransact(Binder.java:453)

systemReady也會這個值

[16:42:17]01-01 20:00:10.287  1770  1770 W WindowManager: turn off transition_animation_scale if in user mode
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager: mTransitionAnimationScaleSetting=1.0
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager: java.lang.Exception
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.server.wm.WindowManagerService.setAnimationScale(WindowManagerService.java:5750)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.server.wm.WindowManagerService.systemReady(WindowManagerService.java:7943)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.server.SystemServer.startOtherServices(SystemServer.java:1140)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.server.SystemServer.run(SystemServer.java:291)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.server.SystemServer.main(SystemServer.java:189)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at java.lang.reflect.Method.invoke(Native Method)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
[16:42:17]01-01 20:00:10.288  1770  1770 E WindowManager:         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)

發現我改的是對的,但是每次等屏亮後就被改了,或者待機開機又被改了
找打這個地方就知道怎麼修改了,但是我的兩天假期誰賠給我。。。。。。。。。。。。。。。。。。。。。。。。
心中一萬隻草泥馬在奔騰

五、參考

https://blog.csdn.net/zhoumushui/article/details/51684984

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章