一、壁纸显示说明
通过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