[英]Faster or cleaner way to find out if a package is installed on Android
我知道,我可以赶上NameNotFoundException
从调用PackageManager.getPackageInfo
通过或循环PackageInfo
通过返回的列表PackageManager.getInstalledPackages
知道是否安装了特定的软件包,但是这两个似乎无论是长篇大论还是丑陋。 在我的个人电话上,我安装了300多个软件包,所以每次我需要检查时,我都不想做这个操作。 捕获异常作为执行应用程序逻辑的一种方法只会让我感到错误。 我在某处错过了isPackageInstalled方法,还是只需要使用上述技术之一自己实现它? 如果是后者,那将被认为是更快,资源更少的选择?
由于PackageManager.getInstalledPackages()
返回List
,因此您无需手动循环。 您可以使用List.contains()
或List.containsAll()
在一行代码中完成任务。 当然,这不会改变效率,因为两种方法本身都可能包含循环。
如果使用API确实会让您感到烦恼,那么您可能会看到涉及以下内容的黑客攻击
获取PM列表的Bash shell表达式Java运行时表达式Java管道和缓冲区和流Java NIO Java grep
所以bash表达式将是:
pm list packages -f | sed's / ^ package .//'| awk -F“=”'{print $ 2“”$ 1}'| 分类
以及可能最快加快的方式从'pm list'处理stdout的引用列表...
处理NameNotFoundExcepetion不应该让你觉得“整个错误”恕我直言。 根据文档,如果自api级别1后包不存在,则抛出此异常。使用try / catch语句与使用if / then语句测试空值非常相似。
在这种情况下,不应将其视为变通方法或黑客,因为您正在使用已记录和预期的异常返回值来确定是否存在包。
我假设这个方法比通过getInstalledPackages()返回的List迭代更快。 但是,我不知道在返回NameNotFoundExcepetion之前android采取了什么步骤。 这将是一个有趣的基准测试。
我不知道有任何其他实用方法来测试已安装的软件包。
我写了一些基准测试并测试了捕获异常与几种不同的方法来获取已安装的软件包并循环遍历它们。 这是我的结果
调用PackageManager.getPackageInfo并捕获NameNotFoundException在所有情况下都需要1到4毫秒,无论是否安装了请求的包,我确保还包括这是第一次调用PackageManager以执行特定应用程序的情况并且作为后续调用,以防框架在每个应用程序启动时对此信息进行任何缓存。
在所有情况下,调用PackageManger.getPackageInfo也需要1到1.5秒。
调用getPackageInfo并捕获异常以确定是否未安装软件包是目前检查的更快方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.