内容目录
问题
自己的电脑控制手机软件在我自己手机升级后无法使用勒 ,分析发现系统升级到android 15,于是开始适配,我以为很简单结果发现搞了好几天才搞定。
过程
建立写一下过程,后续再进行补充
- SurfaceControl CreateDisplay 没有了,之前用这个创建Display
- 分析android 14 SurfaceControl CreateDisplay 代码
- 那我直接按照他的这个代码写就可以了
- 写完测试发现界面没有显示,取不出来帧的数据
- 分析scrcpy 最新的代码他反射DisplayManagerGlobal.java,本质跟我直接反射DispalyManager一样
- 我拿scrcpy代码反射还是不行,这样子陷入死循环了
- 分析系统日志,发现我创建Display state off,分析DisplayMangerService的代码,如果传入CreateDisplay 的Surface 为null,因为我之前代码传入null,于是传入surface就可以了
sufaceControl createDisplay代码
SurfaceControl.java - Android Code Search\
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.TIRAMISU,
publicAlternatives = "Use {@code MediaProjection#createVirtualDisplay()} or "
+ "{@code DisplayManager#createVirtualDisplay()} instead.",
trackingBug = 247078497)
public static IBinder createDisplay(String name, boolean secure) {
if (name == null) {
throw new IllegalArgumentException("name must not be null");
}
// We don't have a size yet so pass in 1 for width and height since 0 is invalid
VirtualDisplay vd = DisplayManager.createVirtualDisplay(name, 1 /* width */, 1 /* height */,
INVALID_DISPLAY, null /* Surface */);
return vd == null ? null : vd.getToken().asBinder();
}
我直接反射DisplayManager就可以了
总结
- 这种适配基本都要看android源代码
- 可以通过分析系统日志,进行跟进分析
- app 通过Displaymanger 通信到DisMangerService,android shell 程序本质和app一样,只是获取服务不一样,同时没有App context,这个scrcpy貌似也自己进行构建,可能方便一些系统。