差满多乃几

Android设置为动态壁纸,使用后,壁纸有被恢复成静态壁纸

原因是由于WallpaperServiceManager 有检查到同一个wallpaper对应的Service,在10秒内,有两次died,会默认的将壁纸设置为静态壁纸。具体的代码可以参考WallpaperServiceManager.java中的如下代码:

public void onServiceDisconnected(ComponentName name) {

            synchronized (mLock) {

                mService = null;

                mEngine = null;

                if (mWallpaper.connection == this) {

                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent);

                    if (!mWallpaper.wallpaperUpdating

                            && (mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME)

                                > SystemClock.uptimeMillis()

                            && mWallpaper.userId == mCurrentUserId) {

                        Slog.w(TAG, "Reverting to built-in wallpaper!");

                        clearWallpaperLocked(true, mWallpaper.userId, null);

                    }

                }

            }

        }

 

具体壁纸的Service为什么出现频繁的died,有可能是low memory或者是Wallpaper apk 本身不稳定。

对于low memory的情况:

1.请从kernel log中,查找low memory killer关键字,看是否有wallpaper service被kill掉。

例如有如下的trace

kernel log:

–<4>[ 1397.294958] (0)[362:BinderThd_AP355]======low memory killer=====

–<4>[ 1397.295741] (0)[362:BinderThd_AP355]select 2337 (droid.wallpaper), adj 1, size 6539, to kill

–<4>[ 1397.295772] (0)[362:BinderThd_AP355]send sigkill to 2337 (droid.wallpaper), adj 1, size 6539 

对于low memory kill的情况,需要看当前的是否有运行耗很多memory的应用,且手机配置的memory就不够,这种情况下,由于hw 本身限制,没有好的解决方法。而如果是memory leak导致的low memory ,需要具体问题具体分析。

 

2.对于壁纸apk自己本身的问题,可以查看main log,看是否该apk有发生Exception,导致process died,如果是第三方apk的source code内发生了JE等,需要找第三方apk的Vendor协助解决。