小鱼塘--自说自话的地方

  • 小玩意
  • 小想法
记录自己技术和想法地方
  1. 首页
  2. 产品
  3. xscr
  4. 正文

android 15 createDisplay 适配

26 3 月, 2025 392点热度 0人点赞 0条评论
内容目录

问题

自己的电脑控制手机软件在我自己手机升级后无法使用勒 ,分析发现系统升级到android 15,于是开始适配,我以为很简单结果发现搞了好几天才搞定。

过程

建立写一下过程,后续再进行补充

  1. SurfaceControl CreateDisplay 没有了,之前用这个创建Display
  2. 分析android 14 SurfaceControl CreateDisplay 代码
  3. 那我直接按照他的这个代码写就可以了
  4. 写完测试发现界面没有显示,取不出来帧的数据
  5. 分析scrcpy 最新的代码他反射DisplayManagerGlobal.java,本质跟我直接反射DispalyManager一样
  6. 我拿scrcpy代码反射还是不行,这样子陷入死循环了
  7. 分析系统日志,发现我创建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就可以了

总结

  1. 这种适配基本都要看android源代码
  2. 可以通过分析系统日志,进行跟进分析
  3. app 通过Displaymanger 通信到DisMangerService,android shell 程序本质和app一样,只是获取服务不一样,同时没有App context,这个scrcpy貌似也自己进行构建,可能方便一些系统。
标签: android
最后更新:26 3 月, 2025

小鱼儿

爱研究技术,爱玩LOL

点赞
< 上一篇

COPYRIGHT © 2022 小鱼塘. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

湘ICP备18005349号