一、描述
測試發現點擊進入媒體中心,屏幕右側抖動(明顯),在原生設置中關閉過渡動畫發現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)
發現我改的是對的,但是每次等屏亮後就被改了,或者待機開機又被改了
找打這個地方就知道怎麼修改了,但是我的兩天假期誰賠給我。。。。。。。。。。。。。。。。。。。。。。。。
心中一萬隻草泥馬在奔騰