-
-
[原创]绕过 Android11新特性之 “包的可见性“
-
发表于:
2024-1-31 18:58
4950
-
[原创]绕过 Android11新特性之 “包的可见性“
前言
距离Android11 发布已经过去了,当初我有大概了解过一些Android 11上的行为变更,总体变化虽然不少,但是要求我们必须去适配的地方并不算多。对于我而言可能需要注意的是文件相关权限,譬如从访问文件到访问媒体文件再到访问全部文件,Android 日益收缩的权限,对于普通用户而言更为安全、高效,从眼光放到开发者身上则不为然,一个APP不仅仅是运行在一部手机上,所以适配要做好,比如接下来我们要讲的 “包的可见性”
包的可见性
Google原文 对包的可见性介绍
原文是英文版的,阅读有诸多不便, 大概意思是这样
概述
当应用程序以 Android 11(API 级别 30)或更高版本为目标并查询有关设备上安装的其他应用程序的信息时,系统会默认过滤此信息。从您的应用的角度来看,有限的包可见性减少了似乎安装在设备上的应用数量。
1 | 一简单理解概括就是除了系统应用,别的应用需要先设置才能访问
|
那么回到问题,怎么设置呢? Google提供了两个办法
常规解决办法
一、设置 <queries>
增加包的可见性
如果您知道要查询或与之交互的特定应用程序集,例如与您的应用程序集成的应用程序,或您使用其服务的应用程序,请将其包名称包含在<package>
元素内的 一组<queries>
元素中:
1 2 3 4 5 6 7 | <manifest package = "com.example.game" >
<queries>
<package android:name = "com.example.store" / >
<package android:name = "com.example.services" / >
< / queries>
...
< / manifest>
|
使用以上办法需要注意的是如果<package>
在应用程序的清单中声明一个元素,则与该包名称关联的应用程序会出现在与 PackageManager该应用程序中的组件匹配的任何查询的结果中。
二、QUERY_ALL_PACKAGES 权限
在极少数情况下,您的应用可能需要查询设备上所有已安装的应用或与之交互,而与它们包含的组件无关。为了允许您的应用程序查看所有其他已安装的应用程序,系统提供了 QUERY_ALL_PACKAGES 权限。
以下列表提供了一些使用案例的示例,其中 QUERY_ALL_PACKAGES权限适合包括:
1 2 3 4 5 | ·无障碍应用
·浏览器
·设备管理应用
·安全应用
·防病毒应用程序
|
但是,在绝大多数情况下,可以通过与自动可见 的应用程序集进行交互并在清单文件中声明应用程序需要访问的其他应用程序来满足应用程序的用例。为了尊重用户隐私,应用应请求最小量的包可见性,以使应用正常工作。
非正常解决手段
以上则是比较正统的解决办法,而接下来要说的是通过Hook 系统函数来绕过对包的可见性限制
首先我们从日志判断,会有如下的日志打印
1 | Unable to start service Intent * * not found
|
通过以上输出的日志信息,通过BindService代码定位到系统位置在
com.android.server.am.ActiveServices类retrieveServiceLocked方法中,如下图
继续探究该类,发现是判断了 ServiceInfo == null 所以弹出了该Toast,且返回null,重点就是回到了 **resolveService()**方法中,如下图
在其内部,可以看到是将方法调用转到了 resolveServiceInternal(),下图是内部实现
由上图方法,并经过多次实验得知,核心函数跳转到了 queryIntentServicesInternal() ,明确在其内部执行了如下方法
其中,核心判断包的可见性相关参数限制的函数是在 applyPostServiceResoultionFilter() 中, 那么接下来再去跳转到该方法内部细致分析一下
仔细阅读该方法之后, 发现该方法的核心函数是 shouldFilterApplication() 中,该方法的介绍如下
1 2 3 4 5 6 | / * *
* Returns true if the calling package should not be able
* to see the target package, false if no
* filtering should be done.
* ......
* /
|
其大概意思是 如果调用包经过判断是否可以发现目标包,如果可以则返回 true,否则返回 false
那么明确该方法之后,我们在做的事情就会简单清晰,而且明了~
编写Code代码 ~
本篇文章到此结束咯...祝各位玩得愉快~
~have fun
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!