【安卓13】谷歌原生桌面launcher3源码修改,修改桌面布局(首屏应用、小部件、导航栏、大屏设备任务栏)

前言

近期接到一个关于谷歌EDLA认证的需求,我负责的是谷歌原生桌面布局的修改,通过研究源码,将涉及到了一些修改思路发出来,大家可以参考一下有没有对你有用的信息。主要修改内容有:

1、搜索栏、底部导航栏未居中
2、中部应用未按要求排布,详情请参考摹客
3、在原生Google桌面未添加中性S-write和投屏Kshare、欢迎页应用

现状图:

参考图:

一、谷歌搜索框的修改

涉及修改的地方有:

1、Launcher3\res\xml\device_profiles.xml

2、com/android/launcher3/Workspace.java

1、首先观察device_profiles.xml代码,一般大屏(平板)设备会加载6*5的布局,手机设备会加载手机的布局,该文件里定义了4个不同的布局类型,如何确定设备加载哪个布局呢?你可以在桌面长按应用图标,然后观察可以移动多少个格子,然后根据行列数找到要修改的布局位置。比如我设备是加载6 * 5布局,我修改这里**launcher:numSearchContainerColumns=“5”**修改谷歌搜索框占据5个格子(横屏总共7个格子)

<--这个行数可以根据自己想要的效果修改,比如我就改了7*6布局,6行7列--/>	<grid-optionlauncher:name="6_by_5"launcher:numRows="6" launcher:numColumns="7"launcher:numSearchContainerColumns="5"launcher:numFolderRows="3"launcher:numFolderColumns="4"launcher:numHotseatIcons="0"launcher:hotseatColumnSpanLandscape="2"launcher:numAllAppsColumns="6"launcher:isScalable="true"launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"launcher:devicePaddingId="@xml/paddings_6x5"launcher:dbFile="launcher_6_by_5.db"launcher:defaultLayoutId="@xml/default_workspace_6x5"launcher:deviceCategory="tablet" ><display-optionlauncher:name="Tablet"launcher:minWidthDps="900"launcher:minHeightDps="820"launcher:minCellHeight="120"launcher:minCellWidth="102"launcher:minCellHeightLandscape="104"launcher:minCellWidthLandscape="120"launcher:iconImageSize="60"launcher:iconTextSize="14"launcher:borderSpaceHorizontal="16"launcher:borderSpaceVertical="64"launcher:borderSpaceLandscapeHorizontal="64"launcher:borderSpaceLandscapeVertical="16"launcher:horizontalMargin="54"launcher:horizontalMarginLandscape="120"launcher:allAppsCellWidth="96"launcher:allAppsCellHeight="142"launcher:allAppsCellWidthLandscape="126"launcher:allAppsCellHeightLandscape="126"launcher:allAppsIconSize="60"launcher:allAppsIconTextSize="14"launcher:allAppsBorderSpaceHorizontal="8"launcher:allAppsBorderSpaceVertical="16"launcher:allAppsBorderSpaceLandscape="16"launcher:hotseatBarBottomSpace="30"launcher:hotseatBarBottomSpaceLandscape="40"launcher:canBeDefault="true" /></grid-option></profiles>

2、谷歌搜索框的位置在workspace.java里面修改,在该类里面查找这个方法:bindAndInitFirstWorkspaceScreen,定位到这里

    public void bindAndInitFirstWorkspaceScreen() {if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {return;}// Add the first pageCellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount());// Always add a first page pinned widget on the first screen.if (mFirstPagePinnedItem == null) {// In transposed layout, we add the first page pinned widget in the Grid.// As workspace does not touch the edges, we do not need a full// width first page pinned widget.mFirstPagePinnedItem = LayoutInflater.from(getContext()).inflate(R.layout.search_container_workspace, firstPage, false);}int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;//格子数从0开始算,这里表示搜索框位置从X轴第2格子,y轴第3个格子算起,x轴占据5(cellHSpan)个格子,y轴占据1个格子CellLayoutLayoutParams lp = new CellLayoutLayoutParams(1, 2, cellHSpan, 1, FIRST_SCREEN_ID);lp.canReorder = false;if (!firstPage.addViewToCellLayout(mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");mFirstPagePinnedItem = null;}}

提示:如果一开始桌面没有谷歌搜索框,可以使用微件的形式添加,添加微件这里又分为两种情况,具体使用哪种方式得看系统有没有去读取配置文件,没有的话就使用第一种,一种是直接在布局文件里面添加,比如res/xml/default_workspace_6x5.xml里面添加:

<appwidgetcontainer="-100"screen="0"x="1"y="2"spanX="5"spanY="1"packageName="com.google.android.googlequicksearchbox"className="com.google.android.googlequicksearchbox.SearchWidgetProvider"/>

另外一种方式是在google_gms包下的配置文件里面添加:release\vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml\partner_default_layout.xml,例如

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2017 Google Inc. All Rights Reserved. -->
<favorites><!-- Hotseat (We use the screen as the position of the item in the hotseat) --><!-- Dialer Messaging Calendar Contacts Camera --><!--<favorite container="-101" screen="0" x="0" y="0" packageName="com.google.android.dialer" className="com.google.android.dialer.extensions.GoogleDialtactsActivity"/>--><!--<favorite container="-101" screen="1" x="1" y="0" packageName="com.google.android.apps.messaging" className="com.google.android.apps.messaging.ui.ConversationListActivity"/>--><!-- <favorite container="-101" screen="0" x="0" y="0" packageName="com.android.settings" className="com.android.settings.Settings"/> --><!-- <favorite container="-101" screen="1" x="1" y="0" packageName="com.android.deskclock" className="com.android.deskclock.DeskClock"/> --><!-- <favorite container="-101" screen="2" x="2" y="0" packageName="com.google.android.calendar" className="com.android.calendar.event.LaunchInfoActivity"/> --><!-- <favorite container="-101" screen="3" x="3" y="0" packageName="com.google.android.contacts" className="com.android.contacts.activities.PeopleActivity"/> --><!-- <favorite container="-101" screen="4" x="4" y="0" packageName="com.android.camera2" className="com.android.camera.CameraLauncher"/> --><!-- In Launcher3, workspaces extend infinitely to the right, incrementing from zero --><!-- Google folder --><!-- Google, Chrome, Gmail, Maps, YouTube, (Drive), (Music), (Movies), Duo, Photos --><folder title="@string/google_folder_title" screen="0" x="1" y="3"><favorite packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchActivity"/><favorite packageName="com.android.chrome" className="com.google.android.apps.chrome.Main"/><favorite packageName="com.google.android.gm" className="com.google.android.gm.ConversationListActivityGmail"/><favorite packageName="com.google.android.apps.maps" className="com.google.android.maps.MapsActivity"/><favorite packageName="com.google.android.youtube" className="com.google.android.youtube.app.honeycomb.Shell$HomeActivity"/><favorite packageName="com.google.android.apps.docs" className="com.google.android.apps.docs.app.NewMainProxyActivity"/><favorite packageName="com.google.android.apps.youtube.music" className="com.google.android.apps.youtube.music.activities.MusicActivity"/><favorite packageName="com.google.android.videos" className="com.google.android.videos.GoogleTvEntryPoint"/><favorite packageName="com.google.android.apps.tachyon" className="com.google.android.apps.tachyon.MainActivity"/><favorite packageName="com.google.android.apps.photos" className="com.google.android.apps.photos.home.HomeActivity"/></folder><favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/><appwidget screen="0" x="2" y="0" packageName="com.android.deskclock" className="com.android.alarmclock.DigitalAppWidgetProvider" spanX="3" spanY="2" /><appwidget screen="0" x="1" y="2" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" spanX="5" spanY="1" />
</favorites>

注释掉的内容是定义桌面的hotSeat显示的应用,其中,添加小部件使用的是appwidget标签,桌面时钟就可以这样添加,folder标签定义的是一个桌面文件夹,里面可以定义文件夹要存放的应用。

二、首屏应用位置修改

和谷歌搜索框一样,也是在device_profiles.xml文件里面定义桌面的行列数,然后根据系统是否会读取partner_default_layout.xml布局文件来决定修改的位置;(1)如果读取,则在partner_default_layout.xml里面定义应用的包名和类型以及位置信息例如<favorite screen="0" x="5" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>表示在screen=“0”(第一屏)的第6列格子,第4行格子添加谷歌商店app。(2)如果不读取partner_default_layout.xml布局文件,则在对应的X×X.xml里面修改应用的位置。

三、底部任务栏和导航栏修改

如果设置了hotSeat应用在底部,即在partner_default_layout.xml定义的container="-101"的标签(文件里被注释掉的部分代码),那么在桌面是显示的是底部固定的应用,不会展示最近任务栏,如果屏蔽掉了hotSeat固定的应用,则默认显示最近任务栏去替换掉固定的应用,最近任务栏显示图标的数量与**device_profiles.xml文件里的launcher:numHotseatIcons="0"**属性有关,这里我设置numHotSeatIcon=0表示不显示最近任务栏,如果你想去掉任务栏,可以使用这种方式,有其他博客**去掉任务栏的方法是将isTablet的属性设置为false**,意思是将设备设置为手机屏幕,手机屏幕不显示最近任务栏,导航栏也会默认居中,我试过该方法在大屏设备上行不通,达不到想要的效果,大家可以去看看他写的:[大屏设备导航栏居右](https://blog.csdn.net/jydzm/article/details/132849460)
如果使用我的方法,即将hotSeat显示的图标数量设置为0:`launcher:numHotseatIcons="0"`

如果直接编译,运行时会发生运行时异常,通过抓log发现,在源码中有多处地方在计算布局的时候,都会去除以numHotseatIcons,而我们知道,除数不能为0,所以报错桌面闪退。这个时候,我们需要将引发异常的地方修改一下(注意numHotseatIcons设置为1和0都会引发异常,因为有个地方对numHotseatIcons做了-1操作),修改位置如下:
com/android/launcher3/DeviceProfile.java
在这类里面按ctrl+F查找numShownHotseatIcons,将涉及到numShownHotseatIcons的计算都做一层判断,如果为0,则换一种算法

也可以先在device_profiles.xml里面全局查找追踪numHotseatIcons这个变量,一步步追踪到DeviceProfile.java这个类,这样会对整个流程更清楚

这里是我修改的具体位置,截图有行号,给大家参考:

注意到这个方法,里面也用到了

修改这两个计算方法

修改到这里,我们已经把最近任务栏去掉啦!!

四、接下来就是要把导航栏居中

首先我们观察device_profiles.xml文件,注意到有这个变量

查找这个变量,追踪代码发现,这个变量控制着底部导航栏距离右边框的dp值,数值越大,越往中间靠拢,有了这个思路,让导航栏居中也就不难实现了,首先我们知道,导航栏居右是因为系统判断为大屏设备tablet,我们既然要保留tablet这个属性,就不能通过改变设备为手机模式来控制导航栏居中,所以就可以控制右边距啦!

而改变这个值很简单,只需要改变引用的资源值即可

我们进入该文件,改变右边距

这个值大家可以慢慢调试,我这里是居中了。

五、总结

写个总结:首先判断系统是否加载partner_gms里面的布局文件,再修改布局代码,这个源码我研究了一周多,网上关于安卓13的launcher3资料不全,最终还是得自己研究源码追踪代码,期间编译调试了几十次吧!!
最终效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain应用全解析

一、Langchain基础 1.Langchain简介 (1)替换模型 from langchain.prompts import ChatPromptTemplatechat ChatOpenAI(temperature0) 使用代理ip llm ChatOpenAI(model_name"gpt-3.5-turbo", max_tokens2048, temperature0.5,openai_api_keyapi_key,openai_ap…

论文阅读:PVT v2: Improved Baselines with Pyramid Vision Transformer

来源&#xff1a;PVTv1 和PVTv2 链接&#xff1a;https://arxiv.org/pdf/2102.12122.pdf 链接&#xff1a;https://arxiv.org/pdf/2106.13797.pdf PVTv2是在PVTv1基础上&#xff0c;所以先介绍PVTv1 Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction…

windows上运行yolov3代码详解(小白)

batch_normalize1 # 是否做BN 代码链接 环境配置 没有Anaconda的话可以安装下 首先创建虚拟环境&#xff0c;名称随意&#xff0c;版本3.9.我觉得挺好的 激活虚拟环境 conda activate 刚刚创建的环境名称 切换到requirements.txt目录下&#xff0c;直接vscode打开yolov3文件…

【操作系统面试题(32道)与面试Linux命令大全】

文章目录 操作系统面试题引论1.什么是操作系统&#xff1f;2.操作系统主要有哪些功能&#xff1f; 操作系统结构3.什么是内核&#xff1f;4.什么是用户态和内核态&#xff1f;5.用户态和内核态是如何切换的&#xff1f; 进程和线程6.并行和并发有什么区别&#xff1f;7.什么是进…

ThinkPHP图片处理之压缩图片大小,图片处理之图片水印(添加平铺文字水印,并设置文字之间的间距和文字的角度)

安装扩展 使用Composer安装图像处理类库 composer require topthink/think-image在对应的控制器内引入Image use think\Image;图片处理之压缩图片大小 public function upload(){$file request()->file(image);// 将前端传过来的图片移动到项目目录下$info $file->…

web前端开发第4次Dreamweave课堂练习/html练习代码《出版界推出一批纪念抗美援朝胜利70周年主题图书》

目标图片&#xff1a; 文字素材&#xff1a; 出版界推出一批纪念抗美援朝胜利70周年主题图书 2023-08-01来源&#xff1a;新华社 为纪念抗美援朝战争胜利70周年&#xff0c;出版界集中推出了“抗美援朝亲历记丛书”《新中国立国之战——抗美援朝战争的回顾与思考》《毛泽东与…

C 语言 goto 语句

C 语言 goto 语句 在本教程中&#xff0c;您将学习在C语言编程中创建goto语句。此外&#xff0c;您还将学习何时使用goto语句以及何时不使用它。 goto语句使我们可以将程序的控制权转移到指定的label 标签。 goto语句的语法 goto label; ... .. ... ... .. ... label: sta…

Leetcode—2471.逐层排序二叉树所需的最少操作数目【中等】(置换环解法!)

2023每日刷题&#xff08;二十七&#xff09; Leetcode—2471.逐层排序二叉树所需的最少操作数目 置换环解题思想 参考自网络 总交换次数 每一层最小交换次数之和 每一层元素个数 - 置换环数 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* …

docker通过nginx代理tomcat-域名重定向

通过昨天的调试&#xff0c;今天做这个域名就简单了&#xff0c; 正常我们访问网站一般都是通过域名比如&#xff0c;www.baidu.com对吧&#xff0c;有人也通过ip&#xff0c;那么这个怎么做呢&#xff1f;物理机windows可以通过域名访问虚拟机linux的nginx代理转向tomcat服务…

【LeetCode刷题-二分查找】--658.找到K个最接近的元素

658.找到K个最接近的元素 方法一&#xff1a;二分查找双指针 假设数组长度为n&#xff0c;数组arr已经按照升序排序&#xff0c;可以将数组arr分为两部分&#xff0c;前一部分所有元素[0,left]都小于x&#xff0c;后一部分[right,n-1]都大于等于x&#xff0c;left与right都可以…

Windows10 安装 Ubuntu(WSL2)

Windows10 安装 Ubuntu(WSL2)&#xff1a;因为 Ubuntu(WSL1) 不具备调试功能&#xff0c;所以尽可能安装 Ubuntu(WSL2)。 具体流程如下&#xff1a; 1. 什么是WSL Windows Subsystem for Linux&#xff08;简称WSL&#xff09;&#xff0c;Windows下的 Linux 子系统&#xff…

YOLO目标检测——猫狗目标检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;宠物识别、猫狗分类数据集说明&#xff1a;猫狗分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有猫和狗图片标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xm…

【Linux】初识进程地址空间

❤️前言 大家好&#xff01;这里是好久没有营业的大懒虫lion&#xff0c;今天要和大家聊的内容是我最近新学习的关于进程地址空间的相关知识。 正文 当我们使用C/C语言进行内存管理时&#xff0c;经常会接触到这样的一张图片&#xff1a; 它常常被我们称作程序地址空间&#…

druid连接池异常GetConnectionTimeoutException(原创)

问题描述 有天&#xff0c;测试同学突然反馈系统页面查询缓慢&#xff0c;影响使用&#xff0c;我查了日志报&#xff1a; druid 连接池异常 GetConnectionTimeoutException wait millis 9120, active 20, maxActive 20 creating 0 结论先行 经一系列排查&#xff0c;得出数…

面试10000次依然会问的【ThreadLocal】,你还不会?

ThreadLocal简介与基本概念 ThreadLocal&#xff0c;即线程局部变量&#xff0c;是Java语言中用于实现线程数据隔离的一个重要类。这种机制允许在多线程环境中&#xff0c;每个线程都有自己的变量副本&#xff0c;从而使得每个线程都可以独立地改变自己的副本&#xff0c;而不…

css实现div倾斜效果

效果如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head> <style> *{margin:0;padding: 0;} .box1{margin:30px 100px;width:100px;height:200px;background:blueviolet;} …

【信息安全原理】——传输层安全(学习笔记)

&#x1f4d6; 前言&#xff1a;为保证网络应用&#xff0c;特别是应用广泛的Web应用数据传输的安全性&#xff08;机密性、完整性和真实性&#xff09;&#xff0c;可以在多个网络层次上采取安全措施。本篇主要介绍传输层提供应用数据安全传输服务的协议&#xff0c;包括&…

使用 HTTP Client 轻松进行 API 测试

在开发过程中&#xff0c;我们经常需要测试 API 接口以确保其正常工作。JetBrains 的集成开发环境&#xff08;IDE&#xff09;如 CLion、IntelliJ IDEA、PyCharm 等&#xff0c;默认内置了 HTTP Client 插件&#xff0c;可以方便地进行API测试。本文将介绍如何使用HTTP Client…

2023年【汽车驾驶员(高级)】找解析及汽车驾驶员(高级)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;高级&#xff09;找解析是安全生产模拟考试一点通总题库中生成的一套汽车驾驶员&#xff08;高级&#xff09;复审考试&#xff0c;安全生产模拟考试一点通上汽车驾驶员&#xff08;高级&#…

Xilinx FPGA平台DDR3设计详解(一):DDR SDRAM系统框架

DDR SDRAM&#xff08;双倍速率同步动态随机存储器&#xff09;是一种内存技术&#xff0c;它可以在时钟信号的上升沿和下降沿都传输数据&#xff0c;从而提高数据传输的速率。DDR SDRAM已经发展了多代&#xff0c;包括DDR、DDR2、DDR3、DDR4和DDR5&#xff0c;每一代都有不同的…