Android14 系统Wallpaper详解 壁纸窗口分析 (一)

一、壁纸显示说明

通过dumpsys window windows确定壁纸显示信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以确定壁纸显示控制是在systemui进程中的ImageWallpaper

另外说明:

静态壁纸运行在systemui,由systemui实现WallpaperService

动态壁纸运行在各业务进程,由各业务进程实现WallpaperService

二、壁纸窗口源码分析

1、ImageWallpaper.java

./frameworks/base/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java

public class ImageWallpaper extends WallpaperService {

}

./frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

public abstract class WallpaperService extends Service {
    public class Engine {
        //token属性
        IBinder mWindowToken;
        IWallpaperEngineWrapper mIWallpaperEngine;
        void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
            mLayout.x = 0;
            mLayout.y = 0;
            mLayout.format = mFormat;
            mLayout.flags = mWindowFlags
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                    | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
            mLayout.privateFlags = mWindowPrivateFlags;
            mLayout.memoryType = mType;
            //这里看到了token,我们分析下token是怎么来的
            mLayout.token = mWindowToken;
            // Add window
            mLayout.type = mIWallpaperEngine.mWindowType;
            mLayout.gravity = Gravity.START|Gravity.TOP;
            mLayout.setFitInsetsTypes(0 /* types */);
            mLayout.setTitle(WallpaperService.this.getClass().getName());
            mLayout.windowAnimations =
                    com.android.internal.R.style.Animation_Wallpaper;
            //发现在这里进行了addToDisplay,窗口添加操作,关键参数mLayout
            if (mSession.addToDisplay(mWindow, mLayout, View.VISIBLE,
                    mDisplay.getDisplayId(), WindowInsets.Type.defaultVisible(),
                    inputChannel, mInsetsState, mTempControls, new Rect(),
                    new float[1]) < 0) {
                Log.w(TAG, "Failed to add window while updating wallpaper surface.");
                return;
            }
            mSession.setShouldZoomOutWallpaper(mWindow, shouldZoomOutWallpaper());
            mCreated = true;
        }
        
        //谁调用了这个方法,给mWindowToken赋值的呢?
        void attach(IWallpaperEngineWrapper wrapper) {
            //mWindowToken赋值
            mWindowToken = wrapper.mWindowToken;
            mIWallpaperEngine = wrapper;
            mConnection = wrapper.mConnection;
        }
    }
}

调用Engine的attach方法

./frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

public abstract class WallpaperService extends Service {
    class IWallpaperEngineWrapper extends IWallpaperEngine.Stub
            implements HandlerCaller.Callback {
        final IWallpaperConnection mConnection;
        final IBinder mWindowToken;
        final int mWindowType;
        IWallpaperEngineWrapper(WallpaperService service,
                IWallpaperConnection conn, IBinder windowToken,
                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding,
                int displayId, @SetWallpaperFlags int which) {
            mConnection = conn;
            mWindowToken = windowToken;
            mWindowType = windowType;
        }
        
        private void doAttachEngine() {
            //这里调用了Engine的attach方法
            engine.attach(this);
        }    
    }
}

创建IWallpaperEngineWrapper对象

./frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

public abstract class WallpaperService extends Service {
    class IWallpaperServiceWrapper extends IWallpaperService.Stub {
        private final WallpaperService mTarget;
        
        public IWallpaperServiceWrapper(WallpaperService context) {
            mTarget = context;
        }
        
        //发现token是从这里传递过来的,以及windowType
        @Override
        public void attach(IWallpaperConnection conn, IBinder windowToken,
                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding,
                int displayId, @SetWallpaperFlags int which) {
            //这里创建了IWallpaperEngineWrapper对象
            IWallpaperEngineWrapper engineWrapper =
                    new IWallpaperEngineWrapper(mTarget, conn, windowToken, windowType,
                            isPreview, reqWidth, reqHeight, padding, displayId, which);
        }
    }
}

很明显这里的IWallpaperServiceWrapper是Bn端,那么就存在Bp客户端调用服务端的attach方法

那么我们找到这里的Bp端

./frameworks/base/core/java/android/service/wallpaper/WallpaperService.java

public abstract class WallpaperService extends Service {
    //直接在WallpaperService的onBind方法中返回了IWallpaperServiceWrapper,那么就需要看看谁绑定了WallpaperService
    @Override
    public final IBinder onBind(Intent intent) {
        return new IWallpaperServiceWrapper(this);
    }
}

最终在源码中查找到Bp端是WallpaperManagerService,也即system_server进程

2、WallpaperManagerService.java

./frameworks/base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java

public class WallpaperManagerService extends IWallpaperManager.Stub
        implements IWallpaperManagerService {
    //发现IWallpaperConnection在这里做为Bn端,那么就存在Bp端
    class WallpaperConnection extends IWallpaperConnection.Stub
        implements ServiceConnection {
        IWallpaperService mService;
        WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper, in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值