Android11 系统/framework层禁止三方应用开机自启动。

背景介绍:客户给了定制的launcher,要求在设备上启动他们的launcher,实现过程中出现的问题是 开机引导还没走完,launcher就会自己弹出来打断开机引导,按道理来说launcher是在开机引导结束后,由开机引导通过intent启动才对。看了log之后发现是客户launcher监听了BOOT_COMPLETED广播实现了开机自启动导致了问题。

  像这种情况,开机引导还没走完,客户给的应用就开机自启动了,肯定是不行的,我们怎么在framework层禁止呢?下面给出一种实际可行的修改方式。
注:Android 每个大版本断层严重,本文章只针对Android 11 ,其它版本不一定适用,读者需自己斟酌一下。类似的文章还有 Android系统层面限制应用开机自启动详解

一、分析过程

   做framework层的修改,最好的思路是 找到相关log——>找到相关代码——>理解相关代码——>修改相关逻辑实现需求。很多人会走错路,一遇到问题就直接去搜某个模块的代码流程梳理博客来看,结果就是看半天看懵逼了,花了很多时间,结果还是不知道从何下手,浪费时间,原因是Android的代码调用了太多层,像这种代码启动流程平时看看就可以了,但绝对不是一个合理的系统层开发手段。这些都是血淋淋的教训,切记。 相关日志如下:

BroadcastQueue: Permission Denial: receiving Intent { act=android.intent.action.BOOT_COMPLETED flg=0x89000010 (has extras) }  to com.xinjing.hotel/com.mydlna.application.DmpBroadcastReceiver requires ...

  找到这段打印的位置:

frameworks\base\services\core\java\com\android\server\am\BroadcastQueue.java

    final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {
				. . . . . .
				. . . . . .
				. . . . . .
                    perm = PackageManager.PERMISSION_DENIED;
                }
                if (perm != PackageManager.PERMISSION_GRANTED) {
                    Slog.w(TAG, "Permission Denial: receiving "
                            + r.intent + " to "
                            + component.flattenToShortString()
                            + " requires " + requiredPermission
                            + " due to sender " + r.callerPackage
                            + " (uid " + r.callingUid + ")");
                    . . . . . .
                    . . . . . .
                    . . . . . .

  看了一下附近的逻辑,BroadcastQueue是负责发送广播的类,不管是系统还是上层应用发送广播都会调用到它,这里的意思是com.xinjing.hotel 监听了BOOT_COMPLETED广播,给com.xinjing.hotel 发送,那么思路就来了,可不可以在这里做截断呢?下面看看具体实现。

二、修改

  在代码如下位置加入注释//xuhao之间的代码即可。

frameworks\base\services\core\java\com\android\server\am\BroadcastQueue.java

    final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {
		. . . . . .
		. . . . . .
		. . . . . .
		ResolveInfo info = (ResolveInfo)nextReceiver;
        ComponentName component = new ComponentName(
                info.activityInfo.applicationInfo.packageName,
                info.activityInfo.name);	
                	
        //xuhao
        if(component.flattenToShortString().contains("com.xinjing.hotel")) {
            Slog.w(TAG,"component.flattenToShortString "+component.flattenToShortString());
            Slog.w(TAG,"r.intent.toString "+r.intent.toString());
        }
        if(component.flattenToShortString().contains("com.xinjing.hotel")) {
            if(r.intent.toString().contains("android.intent.action.BOOT_COMPLETED") || r.intent.toString().contains("android.intent.action.MEDIA_MOUNTED") ){
                Slog.w(TAG,"tongzhouzhixing return");
                return;
            }
        }
        //xuhao       

  上述代码修改解释:客户给的launcher com.xinjing.hotel,开机自启动监听了两个广播android.intent.action.BOOT_COMPLETED、android.intent.action.MEDIA_MOUNTED,屏蔽掉即可禁止该应用开机自启动。

三、思维发散

  上述的方案不完美但是可用,完美的方案是开机引导结束后设置一个系统属性为1,该属性初始值为0,伪代码如下:

        if(component.flattenToShortString().contains("com.xinjing.hotel")&& persisit.me.xuhao == 0) {
            if(r.intent.toString().contains("android.intent.action.BOOT_COMPLETED") || r.intent.toString().contains("android.intent.action.MEDIA_MOUNTED") ){
                Slog.w(TAG,"tongzhouzhixing return");
                return;
            }
        }

  这样能保证只在开机引导没完成前对应用有限制,完成后不对应用限制,逻辑得到完善。开发时间急就用上面现成的,不急就完善下。
  这个地方还可以做成读取配置文件的方式,xml里配置一堆需要禁止开机自启动的应用,这里读取xml文件解析,在开机引导没有完成前对所有xml中的APP做出限制,客户需求大的话,这样做最好。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于振动盘正反料下料逻辑编写

写在前文 借鉴某个程序的逻辑套路写的 1.就是第一个料是正方向,第二个料是反方向。 (* 基础逻辑应该都差不多,这个是一个振动盘,振动盘的末端是一个上下对射的感应器,这个感应器的作用是对射感应到物料的到位信号,末端…

java LogUtil输出日志打日志的class文件内具体方法和行号

最近琢磨怎么把日志打的更清晰,方便查找问题,又不需要在每个class内都创建Logger对象;利用堆栈的方向顺序拿到日志的class问题。看效果,直接上代码。 1、demo test 2、输出效果 3、完整的LogUtil文件 import org.jetbrains.anno…

导入项目,JAVA文件是咖啡杯图标

问题 从图中可以看到,JAVA文件是咖啡杯图标 原因 项目没有识别为MAVEN项目 解决办法 进入pom.xml文件,右键点击Add as Maven Project即可

详解Linux的shell脚本基础指令

一、shell简介 是Linux系统的用户界面,它提供用户与内核的一种交互方式。它接收用户输入的命令,并把它送入内核去执行,是一个命令解释器。 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以…

CC4利用链分析

我的Github主页Java反序列化学习同步更新,有简单的利用链图 分析版本 Commons Collections 4.0 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 在Commons Collections 4.0中,TransformingComparator类变为可序列化类,增…

myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目

摘 要 随着计算机的广泛应用,其逐步成为现代化的标志。图书馆的信息量也会越来越大,因此需要对图书信息、借书信息、还书信息等进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高高…

吴恩达老师推荐的大模型分析网站 Artificial Analysis

是吴恩达老师推荐的一个提供各大模型的质量、输出速度、价格对比等多维度分析的网站。 比起 LMSYS Chatbot Arena 或者 HF 上的其他竞技场,它们更注重的输出的质量而这个网站其实更利于我们选择一个合适的大模型 API,强烈安利!

千帆大模型平台升级十大能力,企业级 RAG 全面升级

7 月 5 日,2024 世界人工智能大会(WAIC)期间,百度智能云大模型助力新质生产力发展论坛在在上海世博展览馆举办。会上,百度智能云宣布文心大模型 4.0 Turbo(ERNIE 4.0 Turbo)面向企业客户全面开放…

人工智能在三级淋巴结:肿瘤浸润淋巴细胞领域的系统研究进展|顶刊速递·24-07-08

小罗碎碎念 本期文献主题:人工智能在三级淋巴结/肿瘤浸润淋巴细胞领域的系统分析 关于三级淋巴结和肿瘤浸润淋巴细胞的文献,会是接下来的分析重点,期间也会穿插临床文献&项目复现的推文。 另外再说点科研道路上的题外话,也算是…

GitLab CI/CD实现项目自动化部署

1 GitLab CI/CD介绍 GitLab CI/CD 是 GitLab 中集成的一套用于软件开发的持续集成(Continuous Integration)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)工具。这套系统允许开发团队…

一手洞悉泰国slot线上游戏投放本土网盟CPI计费广告优势

一手洞悉泰国slot线上游戏投放本土网盟CPI计费广告优势 ​在泰国这个拥有独特文化背景和审美观念的国家,Slots游戏以其丰富的玩法和刺激的体验迅速赢得了玩家们的喜爱。然而,要在竞争激烈的市场中脱颖而出,有效的推广策略显得尤为重要。本土…

JVM专题之垃圾收集器

JVM参数 3.1.1 标准参数 -version -help -server -cp 3.1.2 -X参数 非标准参数,也就是在JDK各个版本中可能会变动 ``` -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM自己来决定 3.1.3 -XX参数 > 使用得最多的参数类型 > > 非…

Docassemble interview 未授权任意文件读取漏洞复现(CVE-2024-27292)

0x01 产品简介 Docassemble是一款强大的开源工具,主要用于自动化生成和定制复杂文档,特别是在法律文档处理领域表现出色。由Jonathan Pyle个人开发者开发,是一个免费的开源专家系统,用于指导访谈和文档组装。Docassemble基于Python编写,充分利用了Python的灵活性和广泛的…

【论文阅读】-- Visual Traffic Jam Analysis Based on Trajectory Data

基于轨迹数据的可视化交通拥堵分析 摘要1 引言2 相关工作2.1 交通事件检测2.2 交通可视化2.3 传播图可视化 3 概述3.1 设计要求3.2 输入数据说明3.3 交通拥堵数据模型3.4 工作流程 4 预处理4.1 路网处理4.2 GPS数据清理4.3 地图匹配4.4 道路速度计算4.5 交通拥堵检测4.6 传播图…

Spring Cloud: OpenFeign 超时重试机制

超时重试是一种用于网络通信的常用策略,目的是在请求未能在规定时间内获得响应或响应超时的情况下,重新发送请求。具体来说,当发起请求后,如果在设定的时间内未能收到预期的响应,就会启动超时重试机制,重新…

EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。 1、使用seq和mbbo的简单选择器 这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。 # 这个mbbo记录将选择将运行seq的哪段 record(mbbo, "CHOOSE") {field(VAL, "…

LVS+Nginx高可用集群--基础篇(二)

1.虚拟主机-使用nginx为静态资源提供服务 静态资源服务器:主要包括两类资源,网页;图片,音频等; 也可以通过别名设置静态资源路径。 配置代码: server {listen 88;server_name localhost;locatio…

DFS回溯剪枝|KMP通过数组记录减少判断子字符串|思路

KMP|DFS回溯剪枝 #1、NC149kmp 初步思路: 两层for循环,一个T的字符开始与 S的字符比较,挨个比较,遇到不同就continue当前T的字符,重复步骤》效率太低,超时 eg: TABSABABABD SABABD S!A时&#…

四川蔚澜时代电子商务有限公司持续领跑抖音电商

在当今这个数字化飞速发展的时代,电子商务已成为推动经济增长的重要引擎。而在众多电商平台中,抖音电商以其独特的社交属性和年轻化的用户群体,逐渐崭露头角。四川蔚澜时代电子商务有限公司正是这股潮流中的佼佼者,他们专注于抖音…

创建一个AXIS的初始IP核

参考自:https://www.cnblogs.com/milianke/p/17936380.html 以该博主文章为主,本文章做补充。 注意的点: edit ip 在导出axis的主机和从机的时候,记得选择edit ip,这样才能看到从机和主机的源代码,然后…