【发布时间】:2021-01-11 18:01:19
【问题描述】:
背景
您可以使用PackageManager.getInstalledPackages 获取已安装应用的列表。
而且,您可以通过以下方式访问每个应用的应用信息屏幕:
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:$appPackageName"))
startActivity(intent)
例子:
问题
问题是,我注意到(在有人告诉我之后)对于某些应用,您无法访问他们的应用信息屏幕。这些应用程序的此类包名称示例:“com.google.android.ext.services”(“Android 服务库”)、“com.google.mainline.tememetry”(“支持组件”)、com.google.android .modulemetadata”(主要组件”)。也许更多。
向谷歌举报后,我是told:
com.google.android.ext.services 是主线模块,因此设置不提供详细的应用信息。
我尝试过的
我尝试查看 PackageInfo 和 ApplicationInfo 的各个字段和功能。
我找到了“isApex”,但它似乎总是错误的,the docs 根本无助于理解它是什么(“该包是否为 APEX 包”)。编辑:如果我检查 API 30,它总是错误的。在 API 29 上,它实际上有时设置为 true。举报here。
我还发现了一个名为“coreApp”的私有布尔字段(我可以通过反射访问),确实有时它是真的,但并不总是当它是真的时,这意味着我无法访问它的应用程序-信息屏幕。
这是获取它的代码:
fun isProbablyCoreApp(packageInfo: PackageInfo): Boolean {
return try {
val field = PackageInfo::class.java.getField("coreApp")
field.getBoolean(packageInfo)
} catch (e: Throwable) {
false
}
}
问题
- “主线模块”是什么意思?它是操作系统的一部分,可以自行更新吗?与Android 10及以上的“项目主线”相关?
- 为什么我无法访问其应用信息?这不是一个真正的应用程序?但如果不是,为什么它会被列为应用列表的一部分?
- 有什么方法可以检测到安装的应用程序实际上是一个您无法访问其应用程序信息屏幕的模块?操作系统的 UI 如何从其列表中过滤掉这些应用?
- 是否还有更多我无法访问其应用信息屏幕的应用案例?
【问题讨论】:
-
看来
coreApp不是您要查找的属性。在我的设备上,"com.google.android.modulemetadata"对于coreApp的值为false。 -
你见过this吗?有一个关于 APEX 文件的内部结构及其与包管理器的关系的讨论,这可能是密切相关的。
-
@Cheticamp APEX 文件是否可能用于系统模块?我不确定我是否理解此链接所说的内容。而且我已经测试了“isApex”,它总是错误的(正如我所写的)......
-
您收到的回复中的关键词可能是“模块”而不是“主线”。请参阅 API 9 中新增的 PackageManager#getInstalledModules(int)。
-
这正是我所遵循的路径。我没有检查“文件”应用程序,但是,在 API 30 的股票模拟器上,app-info 适用于已安装的包,它们要么在模块中没有条目,要么在模块中有
isHidden为 false 的条目.我认为这是正确的轨道。
标签: android android-applicationinfo package-info