miui+ 协同软件 多窗口技术研究

背景

miui+ beta 软件貌似出来蛮久了,这个技术原理和scrcpy差不多,只是miui+ beta是系统软件,所以他可以直接反射,而不需要开发者权限才能反射。

优点

  1. 支持最多3个独立窗口【APP 独立窗口,不会在手机物理屏幕显示】
    不过一些程序屏蔽多个窗口,比喻腾讯视频就不可以,貌似不是技术原因,因为一些斗鱼,虎牙视频类可以开启独立窗口,我用JB逆向分析看他是写了包名做过滤而已,
  2. 复制程序比较方便
  3. 不用蓝牙就可以传递声音
  4. 不用开启开发者模式
    编码声音传递

    缺点

  5. 每次连接基本都要扫码,很容易连接不上,这点我是非常不能理解,我是小米笔记本,这么大一个公司,基本功能做的非常不稳定,所以他的beta 一直没有去掉。貌似起码都出来一年多,产品还这么不稳定,这个点我实在想不明白,我不知道小米投入多少开发,但感觉不应该,一个扫码总是出不来,PC 没有技术兼容性,本身就是只是渲染层,如果考虑其他平台的话,PC端都做不好,其他有什么用呢???
  6. 不能像scrpcpy类产品直接黑屏,miui+ 只是不锁屏,屏幕还是或多或少亮着,可能考虑安全考虑,但只是wifi能连接,我觉得这个问题不是很大,但有通知提醒,可以一键点击退出,所以安全考虑有点站不住脚。大不了加一个开关,默认关闭,只有需要协同必须手动开启即可。
  7. 连接必须开启gps定位,这个是我不能忍的功能点,如果安全考虑,为什么要定位呢?难道手机定位移动超过一定范围就停掉吗?但不是只能wifi吗?安全也可以加默认开关,开启gps就会耗电,用一些程序就会获取实时定位,但有的时候并不像开启定位。
  8. 最新版本不能设置右键快捷,因为我希望返回右键。
  9. 不能走usb传输数据,必须开启wifi

    miui+ 总结

    miui+ 用起来还可以,只能说够用,现在改名小米妙传,Miui+ beta 官方不提供现在,酷安有人提供小米妙传的地址, https://www.aliyundrive.com/s/teDgZazeWU5
    安装包会检测机型,可以在cmd 拖入安装包,然后增加参数 /i 就可以自动按照。安装后删除miui+ 前一个版本。
    目前用自己的协同软件非常舒服,感觉速度比alink和 miui+速度要快一点,我不知道为什么,难道是c++ 性能就是快吗?
    自己

我自己的win32+ffmepg api+sdl开发。

miui+ 多窗口技术

我一次用窗口,这样子手机可以同时跑几个APP,好处有什么用,我可以一边看视频,一边微信回复,可以不用小窗口,因为我都用PC,我窗口已经非常大了,我可以放几个窗口。

过程

我要探索这个技术,那么就有逆向miui+ apk

  1. 我搜索miui+ apk,网上找到一些版本
  2. 用jadx逆向分析
  3. 具体代码在display, mirror 包下面

创建窗口逻辑

  1. 创建virtualdisplay
  2. 创建成功然后启动指定APP【指定display id】
  3. 模拟点击和按键要指定display id
    如果不指定display id,那么就是默认物理屏幕去了。

技术验证

用最简单代码验证这个逻辑

  1. 开启手机模拟辅助显示设备【开发者模式】
  2. 用adb命令找到这个窗口display
    dumpsys window displays
    找到非0 那个 Display: mDisplayId=57 rootTasks=1
    我找到57,你的可能大于0任意一个数字
  3. 写代码启动知乎到57

    PackageManager packageManager = getPackageManager();
        String packname = "com.zhihu.android";
        Intent intent = packageManager.getLaunchIntentForPackage(packname);
    
        Bundle opts=ActivityOptions
                .makeBasic()
                .setLaunchDisplayId(57)
                .toBundle();
    
        startActivity(intent, opts);

    这里注意android 是12的话要设置权限获取知乎权限,可以另外代码方式启动知乎。packageManager.getLaunchIntentForPackage(packname); 这个 android 12需要权限。

  4. 效果图

可以看到副窗口显示知乎,主窗口是没有改变。这个功能有点像小窗口功能,说不定这个技术就是这个原理。

总结

后续我会在自己的写的协同软件增加窗口功能,自己开发软件想加什么功能就加上什么功能。别人写的软件或者功能很难满足自己的需求。

Miui+ 开发者,我感觉他们开发者自己都不怎么用这个产品,做技术的人,应该多用自己开发产品,同时用同类产品。否则很难知道什么是好,是什么是坏。可能小米发展太快,估计只是周边产品,没有投入太多精力。