aosp15上自由窗口入口无法显示aconfig等新知识剖析

android自由窗口freeform模式的实现 freeform模式默认关闭,一些手机厂商开启了此功能,模拟器没有开启。 adb shell settings put global enable_freeform_support 1 adb shell settings put global force_resizable_activities 1 Intent intent = new Intent(MainActivity.this, FreeFormActivity.class); i 阅读详情
AI摘要

本文围绕AOSP15自由窗口问题展开。体验AOSP15功能时,发现自由窗口无入口,即便设置相关值仍无法显示。通过对源码分析,定位到控制选项及问题条件。还分析了aconfig对应的java代码位置,最后通过反编译jar查看源码,涉及新版本类似config机制。

背景:

上一篇文章已经带大家学习了aosp15的编译和运行,在体验aosp15的相关功能时候发现了自由窗口的一个问题:
发现自由窗口根本没有入口进行打开,这里只可以看到分屏相关。
正常要开放自由窗口需要把相关的settings值放开

adb shell settings put global enable_freeform_support 1

但是这里已经设置为了1,打开多任务可以看到显示依然是只有分屏,没有自由窗口。
在这里插入图片描述

问题源码分析:

在packages/apps/Launcher3/quickstep/src/com/android/quickstep/TaskShortcutFactory.java中有控制这个自由窗口的选项,具体代码如下:

    TaskShortcutFactory FREE_FORM = new TaskShortcutFactory() {
        @Override
        public List<SystemShortcut> getShortcuts(RecentsViewContainer container,
                TaskContainer taskContainer) {
            final Task task = taskContainer.getTask();
            if (!task.isDockable) {
                android.util.Log.i("lsm666","!task.isDockable");
                return null;
            }
            if (!isAvailable(container)) {
                android.util.Log.i("lsm666","!isAvailable(container)");
                return null;
            }

            return Collections.singletonList(new FreeformSystemShortcut(
                    R.drawable.ic_caption_desktop_button_foreground,
                    R.string.recent_task_option_freeform, container, taskContainer,
                    LAUNCHER_SYSTEM_SHORTCUT_FREE_FORM_TAP));
        }

这里最后只要可以通过getShortcuts走到底部的Collections.singletonList那就说明可以显示出来,所以这里显示不出来肯定是没有走到底部这个Collections.singletonList,说明是在前面的两个if返回了null,具体哪里返回了?那得加打印进行追踪,打印后发现是如下代码不满足

 if (!isAvailable(container)) {
    android.util.Log.i("lsm666","!isAvailable(container)");
     return null;
 }

这里详细看看isAvailable方法:

 private boolean isAvailable(RecentsViewContainer container) {
     return Settings.Global.getInt(
             container.asContext().getContentResolver(),
             Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0
             && !enableDesktopWindowingMode();
 }

可以看到这里条件只有2个:
1.settings值是否为1,就是上面说的enable_freeform_support这个
2.enableDesktopWindowingMode方法返回为false,即要求不允许桌面模式才可以开放自由窗口

这里明显就第2个条件不满足,那么来看看这里的enableDesktopWindowingMode方法的具体判断是啥。
遗憾发现enableDesktopWindowingMode根本没办法跳转,找不到源码

在这里插入图片描述这里可以临时修改方案:
在这里插入图片描述屏蔽掉这个判断,但还是要考虑分析看看有没有可以设置prop方式能成功就最好。

分析看看他的import
在这里插入图片描述
发现是在com.android.window这个包下,那么继续寻找一下看看这个路径是啥情况?

在这里插入图片描述
可以发现这里flags目录,居然没有一个java文件,全是一些aconfig文件,找到了一个相关的配置
在这里插入图片描述
猜测这里很可能是编译期间把aconfig转化成了java。

分析aconfig对应的java代码在哪?

这里因为看最后代码中还是使用的enableDesktopWindowingMode,即一个java方法,所以这里需要对这块进行寻找到它的java代码,一般这个需要去out生成代码目录查看,这里直接去grep看看情况如下:
在out/soong/.intermediates/frameworks目录进行grep “enableDesktopWindowingMode” ./ -rn
在这里插入图片描述

可以看到没有搜索到任何的java代码有这个enableDesktopWindowingMode方法。
但是看到末尾一个有相关的jar包com.android.window.flags.window-aconfig-java.jar里面有匹配到enableDesktopWindowingMode。

find -name com.android.window.flags.window-aconfig-java.jar
./base/com.android.window.flags.window-aconfig-java/android_common/javac/com.android.window.flags.window-aconfig-java.jar
./base/com.android.window.flags.window-aconfig-java/android_common/turbine-combined/com.android.window.flags.window-aconfig-java.jar
./base/com.android.window.flags.window-aconfig-java/android_common/turbine/com.android.window.flags.window-aconfig-java.jar

这里寻找到了3个一样名字jar,这里注意一般要使用体积大的可以反编译出源码具体的实现,其他小的反编译没有实现。

在这里插入图片描述
这里选着第一个路径如下:
out/soong/.intermediates/frameworks/base/com.android.window.flags.window-aconfig-java/android_common/javac/com.android.window.flags.window-aconfig-java.jar

反编译jar查看源码

先看看Flags这个类
在这里插入图片描述这里来看看FEATURE_FLAGS的具体实现:
在这里插入图片描述
哈哈,到这里大家是不是终于看到熟悉的Properties了,你是不是和马哥一样认为这里其实就是普通的prop,如果这样认为其实就是完全错误的哈,具体这里Properties是啥,这个就有需要了解新版本上使用的类似config机制。这个部分就太长了,后需要在考虑给vip学员们专门开一个文章吧。

更多framework请关注“千里马学框架”

Android P FreeForm自由窗口模式简单实现 开启系统FreeForm模式。 adb shell settings put global enable_freeform_support 1 adb shell settings put global force_resizable_activities 1 /frameworks/native/data/etc/android.software.freeform_window_manage... 阅读详情

相关推荐

解锁Android隐藏功能:Freeform自由窗口模式的终极配置指南(含系统API调用)

本文深入解析了Android系统隐藏的Freeform自由窗口模式,提供了从系统级启用到应用级调用的完整配置指南。通过ADB命令或系统API调用,开发者可以解锁这一功能,实现类似桌面操作系统的多窗口体验,并详细介绍了使用反射启动Activity、处理兼容性问题以及构建启动器应用的实战方法。

http9protocoller的博客 521

Android系统中部分config配置介绍

该功能屏蔽后会导致[MADA][M54]Dynamic color tonal palettes检查项不符合要求,不符合原因为彩蛋背景不会根据壁纸颜色改变而改变,请客户根据项目情况自行评估是否需要MADA测试,如不需要可将该flag 置为false ,屏蔽该功能!config_voice_capable的值改为false.修改后需要整个项目全编译,如果修改未成功,建议查看下是否存在 Overlay.默认设置壁纸主界面和锁屏会被放大1.10f倍显示,下拉通知栏,缩小到1.0倍,有一个壁纸的动画效果。

chengwenqiang222的博客 2322

第 23 章:窗口系统

Insets 代表屏幕被系统 UI(状态栏、导航栏、IME)或硬件特性(挖孔、圆角)占用的区域。窗口布局时需要避开这些区域。Insets 系统从旧演进到现代与。

dengfuma的专栏 368

android framework实战开发之WINDOWING_MODE_FREEFORM自由窗口相关

aosp默认并没有公开自由窗口模式,如果需要体验自由窗口模式必须要用如下命令进行开启输入完成后,可以在多任务的menu中发现freeform:点击这个freeform按钮即可以进入到自由窗口模式。

learnframework的博客 5151

第 25 章:View 系统与输入事件分发

LayoutInflater 运行时将 XML 布局资源转换成 View 对象,连接 res/layout 下声明式 XML 和内存中程序视图树。来源:frameworks/base/core/java/android/view/LayoutInflater.java (第 74 行)...创建自定义 View 需要理解并实现正确的回调方法。默认 onMeasure 实现 wrap_content 会填满父容器;自定义 View 需要正确处理测量模式。@Override// 固有尺寸像素。

dengfuma的专栏 538

第 17 章:传感器

Android传感器框架采用三层架构设计,通过标准化的接口和高效的数据传输机制实现全面的传感器支持。框架层(SensorManager)提供应用API,系统服务层(SensorService)负责事件管理和分发,HAL层(ISensors)对接硬件。关键特性包括:传感器融合算法实现虚拟传感器、低延迟的DirectChannel通道、支持动态传感器热插拔、完善的批处理机制优化功耗。Android 17新增冻结进程时暂停事件下发功能,并引入CHRE数据流机制提升nanoapp间数据传输效率。系统通过采样率限制、

dengfuma的专栏 264

Android Google XTS

GMS全称为Google Mobile Service,即谷歌移动服务。GMS是Google开发并推动Android的动力,是Google提供的Mobile Device上的一系列应用服务。

qq_27672101的博客 2199

第 36 章:电话与 RIL

无线接口层是 Java 电话框架和厂商调制解调器固件之间的桥梁。早期 RIL 是 C 语言守护进程 rild,通过 Unix 套接字、自定义二进制协议与框架通信。Android12 及以后迁移到稳定 AIDL HAL,把旧的单体 IRadio HIDL 接口拆分为多个按业务域划分的 AIDL 接口。# 列出全部radio‑hal aidl文件# 统计IRadioVoice接口方法数量# 统计IRadioData接口方法数量# 查看语音通话数据结构体Call.aidl。

dengfuma的专栏 265

Android代码中Aconfig的使用和分析方法

在新代码所在的目录中,创建一个扩展名为.aconfig的文件,如下所示:flag {上述是名为的aconfig配置,description中描述了这个是profiling相关api和功能相关的开关。

wuweikai0617的博客 1240

Android 系统自由窗口相关修改(AndroidQ)

自由窗口相关修改 AndroidQ 1 打开自由窗口相关配置 // frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java public void retrieveSettings(ContentResolver resolver) { // wugm: enable free form setting Settings.Global.putInt(resolver, D

wg_mlo的博客 4733

Android开发者必看:如何通过ADB命令一键开启Freeform自由窗口模式(附完整代码)

本文为Android开发者提供了通过ADB命令一键开启Freeform自由窗口模式的完整实战指南。详细解析了核心命令原理、常见问题排查方法,并附上了可直接集成到应用中的代码示例,实现动态窗口控制,助力开发者高效测试和开发多任务大屏应用。

weixin_29240711的博客 230

Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式

转载请注明出处:https://blog.csdn.net/sunmmer123 忙过一段时间后,新需求又来了“多个应用/页面间在不用退出或者切换的情况下,可同时操作” 咋一听是不是很迷惑,简单来说“此时你在爱奇艺刷着剧,不退出爱奇艺的情况下,照常能在微信聊着天” 这不是妥妥的时间管理大师嘛,众所周知,生活中我们也都是直接切到对应App中去,没有说同时不退出的情况下操作第二个App。 那么这种“高大上的”需求功能能实现么? 其实早在2016年5月19日, Google I/O 开发者大会中发布的A.

sunmmer123的博客 2万+

论文选题难?7种AI加持的万能选题法(全专业通用+工具实测)

AI时代学术选题新范式:7大智能方法破解研究痛点 传统选题方法面临范围失控、资料难寻、创新不足三大痛点,本文提出AI赋能的7种选题方法论: 1.现象+群体法:自动抓取热点与人群特征 2.理论+场景法:经典理论与新兴场景匹配 3.技术+问题法:前沿技术与领域痛点结合 4.对比+变量法:时空维度与变量关系分析 5.热点+理论法:事件传播与理论深挖融合 6.微调+变量法:已有选题变量置换创新 7.AI全流程法:关键要素智能迭代生成 同时警示AI使用的伦理边界,需规避虚构文献、伪造数据等风险,并提供针对本科生、研究

Conan_0728的博客 1883

android freeform模式定制桌面系统

本文基于android9.0来写的。 一、产品需求:如下图,类似mac的桌面系统 (1)区域1是系统标题栏。 (2)区域2是长显示的窗口。 (3)区域3 普通app显示的窗口。 (4) 区域4 也是一个上显示的窗口,主要用于应用的点击启动。 二、下图是根据Android系统特性画的草图: (1)区域1是系统statusBar。 (2)区域2是长显示的窗口,用WindowMana...

yiwuxue的专栏 1万+

Unity XR Interaction Toolkit(二)手柄交互

XR Interaction 手柄事件和抓取设置

qq_36608844的博客 8497

AT32F435/437开发实战:把SD卡变成U盘的完整指南(含源码解析)

本文提供了基于AT32F435/437微控制器将SD卡改造为U盘的完整实战指南。通过深入解析USB MSC协议与SDIO驱动的协同工作原理,详细介绍了硬件设计要点、软件架构融合、核心源码解析以及从编译到文件传输的完整调试流程,帮助开发者实现可靠的大容量存储设备扩展。

weixin_29159127的博客 410

华为emui10用adb开freeform(为了小窗)

adb settings put global enable_freeform_support 1 reboot

做一做笔记,做一做总结 3109

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3695

Android U 多任务启动分屏——Launcher流程(上分屏)

现在我们对桌面部分的流程进行分析。

yimelancholy的博客 2677

基于MATLAB的PDT DMR物理层仿真

PDT DMR物理层仿真的目标是评估系统的误码率(Bit Error Rate,BER),以及验证和优化各种调制方案、编码方案和信道模型。下面将介绍如何进行PDT DMR物理层的仿真,并提供相应的MATLAB源代码。通过上述步骤,我们可以进行基于MATLAB的PDT DMR物理层仿真,并评估系统的性能。根据实际需求,我们可以修改仿真参数和添加更复杂的信道模型,以更全面地评估系统性能。最后,我们可以将仿真结果进行可视化和分析。首先,我们需要设置仿真的参数,包括调制方案、编码方案、信道模型和信噪比等。

TechPulseZ的博客 459

YOLOv8改进:在C2F模块中引入RepGhost Bottleneck模块

C2F类是YOLOv8中的C2F模块的实现,它包含一个RepGhostBottleneck模块、一个卷积层和一个批归一化层。通过在C2F模块中引入RepGhost Bottleneck模块,我们可以在保持计算效率的同时提升模型的表达能力。这是因为RepGhost Bottleneck模块通过引入重复的卷积核来扩展模型的感受野,从而增加了模型对不同尺度目标的感知能力。RepGhost Bottleneck是一种用于卷积神经网络的改进模块,它可以在保持计算效率的同时提升模型的表达能力。希望以上内容对你有帮助!

IlgCrystal的博客 1307

Android U 自由窗口(浮窗)——启动流程

原生机在多任务中原本点击应用图标不会出现【自由窗口】的选项,通过命令开启后会显示出来。运行adb命令开启浮窗选项。

yimelancholy的博客 1450

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1196
上一篇: Ubuntu20.04编译安卓aosp 15源码编译到模拟器运行
下一篇: 安卓高级系统工程师必备技能-技术大佬成长必备技能
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值