MTKAndroid13-Launcher3 屏蔽部分app不让显示
实现Launcher3 桌面屏蔽部分内容,不让显示
文章目录
- 修改文件路径-实现方式
- 基础-源码模块配置
- Launcher3 源码位置
- 编译模块配置
- 配置如下参数 属性配置:
- 默认的Launcher3 选项配置
- GMS的Launcher3 配置
- 第三方Launcher需要默认为Launcher时候-系统Launcher3 的配置
- 参考资料
- 实现方案
- 源码分析
- Launcher
- LauncherModel
- addCallbacksAndLoad 方法
- startLoader
- LoaderResults
- BaseLoaderResults
- bindAllApps
- AllAppsList
- 修改实现-举例说明
- 总结
修改文件路径-实现方式
/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AllAppsList.java在copyData 方法中过滤public AppInfo[] copyData() {AppInfo[] result = data.toArray(EMPTY_ARRAY);/* Arrays.sort(result, COMPONENT_KEY_COMPARATOR);return result;*/List<AppInfo> updatedAppInfos = new ArrayList<>();for(AppInfo info:result){if(info.componentName!=null){if(info.componentName.getPackageName().equals("com.android.documentsui")){Log.d(TAG,"info. filter :"+info.componentName.getPackageName());}else{Log.d(TAG,"info nofilter:"+info.componentName.getPackageName());updatedAppInfos.add(info);}}}AppInfo[] result1= updatedAppInfos.toArray(new AppInfo[0]);Arrays.sort(result1, COMPONENT_KEY_COMPARATOR);return result1;}
基础-源码模块配置
源码里面的Launcher3 有 非GMS的和GMS的,特别对于MTK、高通、展讯 手机相关平台方案,两个类型Launcher3 模块共存的。 对于 RK 、全志下的大多工控产品下,源码是没有 GMS一说的。
Launcher3 源码位置
MTK 平台 非GMS 源码路径如下:
/vendor/mediatek/proprietary/packages/apps/Launcher3
MTK 平台 GMS包 下
/vendor/google/apps/SearchLauncher
/vendor/google/overlay/gms_overlay/vendor/google/apps/SearchLauncher
在GMS 情况下,为什么会有两个 SearchLauncher, 这是系统的机制而已, gms_overlay 文件夹下的app 包会覆盖非GMS的软件包。
编译模块配置
路径:
\device\mediatek\system\common\device.mk
配置如下参数 属性配置:
默认的Launcher3 选项配置
#PRODUCT_PACKAGES += Launcher3
如果要使用MTK的GMS 包的 Launcher ,可以配置如下
#PRODUCT_PACKAGES += MtkLauncher3QuickStep
对应的源码位置是如下两个,具体可以查阅下并进行实验:
/vendor/google/apps/SearchLauncher
/vendor/google/overlay/gms_overlay/vendor/google/apps/SearchLauncher
其实这样配置的Launcher3 本身是属于GMS的,所以发现实际跑起来的Launcher是gms包,还带有开机向导。
GMS的Launcher3 配置
GMS 情况下,配置好GMS编译环境即可, 这样就会加载 gms 文件下的所有app 包,里面就有gms 包的Launcher3
\device\mediatek\system\mssi_64_cn\SystemConfig.mk 文件下,配置BUILD_GMS = yes
第三方Launcher需要默认为Launcher时候-系统Launcher3 的配置
实际工控产品或者消费产品非GMS产品中,客户自定义的Launcher 软件,那么如何配置默认的Launcherne ?
一般有两种解决方案:
- 系统默认Launcher存在,在源码Framework层默认第三方Launcher为系统Launcher
- 系统原生Launcher3 也编译到系统里面去,但是去掉Home 属性。
如下:
参考资料
Android11.0内置第三方Launcher并设置为默认,保留Launcher3并可切换
设置三方应用为默认Launcher
动态设置默认Launcher
android 13.0-launcher3中workspaceapp列表页不显示某个app图标
Android13设置默认Launcher分析
其它相关Launcher 资料相关参考:
Launcher3 相关资料参考
菜鸟成长之路-源码分析专栏
Android Launcher3 简介
Launcher3 高端定制
Launcher3 开发
Launcher3 Android Code Search在线源码查看
Launcher3 xref 在线源码查看
Launcher3 RK 源码查看
Launcher3 解析
Launcher3 AndroidP AS版本
谷歌Launcher3 Android13源码修改
Launcher3 和 Launcher3QuickStep 区别
Android14 不分Launcher3修改
Launcher3 LoaderTask 的数据加载
Android14 浅析Launcher
Android O Launcher3-Workspace加载
- 上面参考资料都是两种Launcher情况下默认其中一个Launcher 作为默认Launcher; 我们上面分析的是保证一个Launcher 即可,系统Launcher 其实去掉了HOME属性。
- 系统Launcher3 开发,强烈建议多了解下Launcher3 相关的基础知识,数据架子-布局加载-框架相关基本内容,方便分析代码、实现功能,有相关思路。
实现方案
源码分析
Launcher
在onCreate 方法中,有下面这段代码,见名知意 module 相关
private LauncherModel mModel;@Override@TargetApi(Build.VERSION_CODES.S)protected void onCreate(Bundle savedInstanceState) {...mModel = app.getModel();if (!mModel.addCallbacksAndLoad(this)) {if (!internalStateHandled) {// If we are not binding synchronously, show a fade in animation when// the first page bind completes.mDragLayer.getAlphaProperty(ALPHA_INDEX_LAUNCHER_LOAD).setValue(0);}}...}
LauncherModel
addCallbacksAndLoad 方法
/*** Adds a callbacks to receive model updates* @return true if workspace load was performed synchronously*/public boolean addCallbacksAndLoad(Callbacks callbacks) {synchronized (mLock) {addCallbacks(callbacks);return startLoader(new Callbacks[] { callbacks });}}
startLoader
看这个方法里面的注释:
// Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems
private boolean startLoader(Callbacks[] newCallbacks) {// Enable queue before starting loader. It will get disabled in Launcher#finishBindingItemsItemInstallQueue.INSTANCE.get(mApp.getContext()).pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);synchronized (mLock) {// If there is already one running, tell it to stop.boolean wasRunning = stopLoader();boolean bindDirectly = mModelLoaded && !mIsLoaderTaskRunning;boolean bindAllCallbacks = wasRunning || !bindDirectly || newCallbacks.length == 0;final Callbacks[] callbacksList = bindAllCallbacks ? getCallbacks() : newCallbacks;if (callbacksList.length > 0) {// Clear any pending bind-runnables from the synchronized load process.for (Callbacks cb : callbacksList) {MAIN_EXECUTOR.execute(cb::clearPendingBinds);}LoaderResults loaderResults = new LoaderResults(mApp, mBgDataModel, mBgAllAppsList, callbacksList);if (bindDirectly) {// Divide the set of loaded items into those that we are binding synchronously,// and everything else that is to be bound normally (asynchronously).loaderResults.bindWorkspace(bindAllCallbacks);// For now, continue posting the binding of AllApps as there are other// issues that arise from that.loaderResults.bindAllApps();loaderResults.bindDeepShortcuts();loaderResults.bindWidgets();return true;} else {stopLoader();// 数据加载 调用工作线程,规避主线程阻塞mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, loaderResults);// Always post the loader task, instead of running directly// (even on same thread) so that we exit any nested synchronized blocksMODEL_EXECUTOR.post(mLoaderTask);}}}return false;}
这里找到相关的加载App 位置了:
loaderResults.bindWorkspace(bindAllCallbacks);loaderResults.bindAllApps();loaderResults.bindDeepShortcuts();loaderResults.bindWidgets();
LoaderResults
源码如下: 它是一个中间方法,暂未实质性功能,应该后面方便系统扩展和用户自己扩展了
/*** Helper class to handle results of {@link com.android.launcher3.model.LoaderTask}.*/
public class LoaderResults extends BaseLoaderResults {public LoaderResults(LauncherAppState app, BgDataModel dataModel,AllAppsList allAppsList, Callbacks[] callbacks) {super(app, dataModel, allAppsList, callbacks, MAIN_EXECUTOR);}@Overridepublic void bindDeepShortcuts() {}@Overridepublic void bindWidgets() {}
}
BaseLoaderResults
我们看看这个类的定义:
/*** Stores the list of all applications for the all apps view.*/
public class AllAppsList {
存储app 界面所有应用的集合。
bindAllApps
public void bindAllApps() {// shallow copyAppInfo[] apps = mBgAllAppsList.copyData();int flags = mBgAllAppsList.getFlags();executeCallbacksTask(c -> c.bindAllApplications(apps, flags), mUiExecutor);}
这里看到 AppInfo[] apps = mBgAllAppsList.copyData();,下面看到的 bindAllApplications 绑定所有app ,我们最好从顶层来处理拦截 部分不想显示的应用
那就看一下 mBgAllAppsList 在哪里定义的:
private final AllAppsList mBgAllAppsList;public BaseLoaderResults(LauncherAppState app, BgDataModel dataModel,AllAppsList allAppsList, Callbacks[] callbacksList, LooperExecutor uiExecutor) {。。。。mBgAllAppsList = allAppsList;。。。。}所以继续找到 它的子类,上面我们说了它的子类LoadResults 只是一个中间类,再次贴出它的部分代码:public class LoaderResults extends BaseLoaderResults {public LoaderResults(LauncherAppState app, BgDataModel dataModel,AllAppsList allAppsList, Callbacks[] callbacks) {super(app, dataModel, allAppsList, callbacks, MAIN_EXECUTOR);}那么我们再次回到如上 LauncherModel 的startLoader 方法private boolean startLoader(Callbacks[] newCallbacks) {........................synchronized (mLock) {// If there is already one running, tell it to stop.boolean wasRunning = stopLoader();boolean bindDirectly = mModelLoaded && !mIsLoaderTaskRunning;boolean bindAllCallbacks = wasRunning || !bindDirectly || newCallbacks.length == 0;final Callbacks[] callbacksList = bindAllCallbacks ? getCallbacks() : newCallbacks;if (callbacksList.length > 0) {...............LoaderResults loaderResults = new LoaderResults(mApp, mBgDataModel, mBgAllAppsList, callbacksList);if (bindDirectly) {// Divide the set of loaded items into those that we are binding synchronously,// and everything else that is to be bound normally (asynchronously).loaderResults.bindWorkspace(bindAllCallbacks);// For now, continue posting the binding of AllApps as there are other// issues that arise from that.loaderResults.bindAllApps();loaderResults.bindDeepShortcuts();loaderResults.bindWidgets();return true;} else {stopLoader();// 数据加载 调用工作线程,规避主线程阻塞mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, loaderResults);// Always post the loader task, instead of running directly// (even on same thread) so that we exit any nested synchronized blocksMODEL_EXECUTOR.post(mLoaderTask);}}}return false;}那就继续追 LoaderResults 构造方法里面的第三个参数 mBgAllAppsList找到变量定义如下:// < only access in worker thread >private final AllAppsList mBgAllAppsList;找到它初始化地方:LauncherModel(Context context, LauncherAppState app, IconCache iconCache, AppFilter appFilter,boolean isPrimaryInstance) {mApp = app;mBgAllAppsList = new AllAppsList(iconCache, appFilter);mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel,isPrimaryInstance);}那么接下来要分析的就是 AllAppsList
AllAppsList
如上在分析 BaseLoaderResults 类的时候 ,已经分析到了 AllAppsList ,然后在bindAllApps 方法里面找到了 mBgAllAppsList.copyData(); ,最后反推到 AllAppsList , 这里需要分析的不就是 如上提到的 copyData嘛。
public AppInfo[] copyData() {AppInfo[] result = data.toArray(EMPTY_ARRAY);Arrays.sort(result, COMPONENT_KEY_COMPARATOR);return result;}
返回的是AppInfo 数组,那么我们过滤掉 我们不让显示的 App 不就解决了需求了嘛。 先看看 AppInfo
如类注释说明:它代表的就是一个展示在所有AppView 中的一个App . 我们可以通过它的属性类ComponentName 的包名来过滤掉我们想要隐藏的App
修改实现-举例说明
在第一个内容模块,已经说明了修改路径和修改方法,里面其实已经举例了修改的隐藏文件App
修改前:
修改之后,编译固件,开机后查看日志如下:说明修改已经起作用了。
最后看实际界面效果:可以看到文件app 已经被隐藏了,没有显示出来,但是这个app 是安装成功了的。
去系统设置看看,有木有这个app:看到是有这个app,已经安装过了的。 说明 隐藏成功了…
总结
- 这个需求解决方案,完全根据代码找到并进行修改实现,思路还是很清晰的
- 建议多看看Launcher 相关基础知识,对业务和流程分析非常有好处的。
相关文章:

MTKAndroid13-Launcher3 屏蔽部分app不让显示
实现Launcher3 桌面屏蔽部分内容,不让显示 文章目录 修改文件路径-实现方式基础-源码模块配置Launcher3 源码位置编译模块配置配置如下参数 属性配置:默认的Launcher3 选项配置GMS的Launcher3 配置 第三方Launcher需要默认为Launcher时候-系统Launcher3 …...

PostgreSQL 数据库备份与恢复全面指南20250424
PostgreSQL 数据库备份与恢复全面指南 在数据库管理中,备份与恢复操作对于确保数据安全性、可用性和完整性至关重要。PostgreSQL 作为一款开源关系型数据库系统,广泛应用于各行各业,尤其在现代 AI 和大数据应用中,作为数据存储的…...

专家系统的知识获取、检测与组织管理——基于《人工智能原理与方法》的深度解析
前文我们已经了解了专家系统的基本概念和一般结构,系统中有专业的知识才是专家系统的关键,接下来对专家系统中的知识是如何获取、检测、组织和管理的进行探讨。 1.专家系统的基本概念:专家系统的基本概念解析——基于《人工智能原理与方法》…...
contenthash 持久化缓存
以下是关于持久化缓存(contenthash)的深度技术解析,涵盖原理、配置策略及最佳实践,帮助我们构建高性能前端应用的缓存体系: 一、缓存机制核心原理 1. 浏览器缓存决策矩阵 触发条件缓存行为对应场景URL 未变化 + 强缓存有效直接读取磁盘/内存缓存未修改的静态资源URL 变化…...

让Editplus支持squirrel语言
用EditPlus配置完实现关键字、函数、高光代码、自动完成、代码调试。先看看效果: 主要是由 nut.stx (语法文件)和 nut.acp (自动完成)两个文件 实现 Nut.stx文件内容: ---------------------------------…...
Arm GICv3中断处理模型解析
1. Targeted Distribution Model(目标分发模型) 中断会被发送到软件指定的目标PE,且仅由该PE处理。 2. Targeted List Model(目标列表模型) 主要针对于SGIs(Software Generated Interrupts,软件生成中断)中断。 多个PE可以独立接收同一个中断。 当一个PE确认(ackn…...

Leetcode 2845 题解
还是要把自己做题的思路写出来的,但是结果可能还是得去观摩一下题解,无论是大佬写的题解还是leetcode官方写的题解,看完题解后再去反思才能有收获,即使下次遇见一样的题不见得能写出来,但有思路比没思路更重要。 今天写…...

【爬虫】DrissionPage-获取douyim用户下的视频
之前看过DrissionPage,觉得很厉害,比selenium简单,适合新手。因为盲目跟风逆向,今天看了一个DrissionPage案例直播,学习一下,真香哈。 DrissionPage官网:🛰️ 概述 | DrissionPage官…...

【Python爬虫基础篇】--3.cookie和session
目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。 例子࿱…...
React 文件链条
在 React 项目中,首次展示在前台的是以下文件组合作用的结果: --- ### **核心文件链条** 1. **public/index.html** - 这是浏览器实际加载的入口文件 - 包含一个 <div id"root"></div> 容器 - 通过 <script> 标…...

分数线降低,25西电马克思主义学院(考研录取情况)
1、马克思主义学院各个方向 2、马克思主义学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、马克思主义理论25年相较于24年下降10分,为355分 3、25vs24推免/统招人数对比 学长、学姐分析 由表可看出: 1、 马克思主义学院25年共接…...
微信、抖音、小红书emoji符号大全
1、Emoji 日常符号 👣👀👁️👄💋👂🦻👃👅🧠🫀🫁🦷🦴💪🦾🦿🦵&a…...

Cancer Cell|scRNA-seq + scTCR + 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” | 临床问题的组学解答
Cancer Cell|scRNA-seq scTCR 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” 👋 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论,一起学习 近日,《Cancer Cell》…...
ubuntu(28):ubuntu系统多版本conda和多版本cuda共存
0. cuda(包括cudnn)、conda安装照常 注意: (1)多个conda不要安装到一个目录了,可以见下面的示例目录; (2)cuda(包括cudnn)不用纠结是否添加超链接 1. 需要修改环境配置…...

C# 下 using 块的作用 + VS2022 下 using 语法糖怎样工作
🔍 using 的本意是什么? using 是 C# 中用于 自动释放资源 的语法糖,适用于实现了 IDisposable 接口的对象(比如数据库连接、文件、网络流等)。 🧐 首先看下SqlSugarClient类部分源码: SqlSug…...

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客
实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下,实体店面临着前所未有的挑战,但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据,据相关统计ÿ…...

UML 类图基础和类关系辨析
UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现(Realization)3.1.2 继承/泛化(Inheritance/Generalization) 3.2 聚合和组合 3.2.1 组合(Composition)3.2.2 聚…...

15.三数之和(LeetCode)java
个人理解: 1.使用双指针做法,首先对数组进行排序 第一重for循环控制第一个数,对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数,不是下标,数不能…...
Spark读取Apollo配置
--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

如何通过 Websoft9 应用自托管平台一键安装任意版本 Odoo?
手工安装 Odoo 的复杂流程 环境准备阶段:安装 Docker 需熟悉 Linux 系统操作,需配置软件源、解决依赖冲突; 镜像获取阶段:从 Docker Hub 拉取官方镜像时可能因网络问题失败,且需自行验证版本兼容性; 容器…...
Anaconda3使用conda进行包管理
一、基础包管理操作 安装包 使用 conda install <包名> 安装指定包,支持多包批量安装和版本指定: conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...
exec和spawn
前言 需求:做一个electron应用,用node打开exe软件,打开后返回成功与否,打开的软件不会随electron应用的关闭而关闭 exec exec 第一个参数为要运行的command命令,参数以空格分隔。 child_process.exec(command[, opti…...
整平机:精密制造的“隐形守护者”
在金属加工车间里,一块表面凹凸不平的钢板经过一组高速旋转的辊轮后,神奇地变得如镜面般平整——这看似简单的场景背后,隐藏着现代工业对材料精度近乎苛刻的追求。整平机,这个常被忽视的工业设备,实则是高端制造业的基…...
Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具
在《同步反应式系统》的第一课中,介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...
C++中的vector和list的区别与适用场景
区别 特性vectorlist底层实现动态数组双向链表内存分配连续内存块非连续内存块随机访问支持,通过索引访问,时间复杂度O(1)不支持,需遍历,时间复杂度O(n)插入/删除末尾操作效率高,时间复杂度O(1)任意位置操作效率高&am…...

VRRP与防火墙双机热备实验
目录 实验一:VRRP负载均衡与故障切换 实验拓扑编辑一、实验配置步骤 1. 基础网络配置 2. VRRP双组配置 二、关键验证命令 1. 查看VRRP状态 2. 路由表验证 三、流量分析 正常负载均衡场景: 故障切换验证: 实验二:防火…...

win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
现象: 1. 当时新建运行的资源管理器的任务卡了或者原本资源管理器卡了 比如:当时在文本框中输入explorer 注:explorer.exe是Windows的文件资源管理器,它用于管理Windows的图形外壳,包括桌面和文件管理 按住CtrlAltEs…...
【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时
SVG 性能优化:循序渐进 4 步法 目标:先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…...

基于LAB颜色空间的增强型颜色迁移算法
本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中,SIMMECHANICS是M…...