背景:
有學員朋友在學習馬哥的分屏pip自由窗口專題時候,做相關分屏做小桌面項目時候,因為原來課程版本是基于android 13進行的講解的,但是現在公司已經開始逐漸進行相關的android 14的適配了,但是android 14這塊相比android 13還是有一些差異,適配起來有點難度,剛好借此機會給大家分享一下。
分屏小桌面最后成果:
差異核心點
aosp13版本上
這個地方是有直接的splitscreen可以獲取,所以當時使用的是splitscreen
后面在SplitScreen加入了相關的接口
aosp14版本上
可以看出和aosp13版本確實差異有點大,已經直接看不到對應的SplitScreen相關的接口了
那么如何進行修改呢?
aosp14適配方案思路
切入點:
目標就是為了可以調用ISplitScreen相關接口,aosp13的SplitScreen其實本質也是調用的ISplitScreenImpl的接口
ISplitScreenImpl實際是ISplitScreen的aidl的服務端,所以目的是用來提供給桌面等可以跨進程通訊用的。那么桌面本身可以啟動分屏,本質就是因為傳遞了相關的ISplitScreen的binder對象給了桌面,所以順著找這個ISplitScreen的binder實體傳遞思路尋找到,其實如下代碼進行binder對象傳遞:
都是基于aosp14代碼
frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java
可以看到是在這里進行的putBinder對象,放到了Bundle傳遞到了launcher進行
對于ISplitScreen相關binder的key是如下:
知道了這個key然后代碼中grep結果如下:
看看這個方法:
再看看createExternalInterface
哈哈是不是看到和aosp13版本一樣的對象了。
再看看addExternalInterface
明顯看出了addExternalInterface就是前面源頭
到這里就已經基本上找到了可以獲取ISplitScreen接口方法了
解決獲取ISplitScreen接口案例
只需要在params填入數據完成后在獲取既可以
打印結果如下:
正常獲取了接口,接下來也可以通過ISplitScreen接口直接進行接口調用
本文章更多詳細代碼和資料需要購買課程獲取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
其他課程七件套專題:
點擊這里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
視頻試看:
https://www.bilibili.com/video/BV1wc41117L4/