Android: 如何使用adb知道是否已在Android设备上安装任何应用程序?

32

我需要使用adb安装一个包名为“com.xyz.game”的Android应用程序。 我想要使用shell脚本自动化这个过程。这个过程将是这样的,如果应用已经安装过了,则卸载它(使用命令adb uninstall com.xyz.game),然后使用“adb install game.apk”重新安装,否则直接使用“adb install game.apk”进行安装。

我该如何实现这个过程?

7个回答

34

[更新2]

不使用 grep

如下方答案所述, 使用 adb shell pm list packages [your.package.name]

[更新]

根据下面正确的答案,尝试从 pm list packages 中使用 grep 进行结果筛选。

adb shell pm list packages | grep com.your.app.package


[翻译]

如果应用程序已经安装,而您尝试重新安装相同的应用程序,则adb将返回一个错误 - Failure [INSTALL_FAILED_ALREADY_EXISTS]。但是,如果您想重新安装已安装的应用程序,则使用-r参数。

例如:

adb install -r game.apk

看起来,“-r”标志不起作用!如果应用程序已经安装,它会忽略安装。 - dg_no_9
由于我有时需要对使用不同证书签名的发布版和调试版应用进行测试,因此我必须手动卸载并重新安装以确保它能够正确进行。 - RyanLeonard
这是一个不好的解决方案。最好使用“pm list packages”命令进行检查,正如其他答案中建议的那样。 - artem
“-r”标志在重新安装之前是否完全清除旧应用程序?我使用“adb uninstall”的主要方式之一是,如果我怀疑重新部署构建时未清除某些缓存数据,并且想确保我从干净的状态安装,则可以使用该命令。 - user62171
以下答案中有一种更好的替代方案,不需要使用 grep - mimarcel
1
使用grep更好,因为list packages com package_name将返回一个数组,其中包含部分匹配package_name的所有包(基本上就像grep一样)。如果您正在寻找预安装的应用程序,则可能会出现问题,因为这可能是一个巨大的命名空间。案例:我想卸载gmail(即com.google.android.gm),并且我的脚本在删除之前使用adb shell pm list packages com.google.android.gm测试其是否存在,但是在我的设备上返回了三个包,包括com.google.android.gm。我使用| grep -w package_name进行修复,其中-w表示单词匹配。 - Stephen Hosking

18

尝试使用grep从pm list packages结果中获取结果。

adb shell pm list packages | grep com.xyz.game

如果已经安装了,您就可以看到结果。

package:com.xyz.game

15

无需使用grep。使用以下命令,您可以简单地检查应用程序是否已存在。

运行ADB命令

adb shell pm list packages [your.package.name]

如果应用程序已安装,则上述命令将返回以下内容:

package:[your.package.name]

否则它将不会返回任何东西,即返回空字符串。


1
你甚至不需要写完整的准确名称,这就像是一个没有输入 | grepgrep - user276648
这对我很有用,因为如果找不到grep,则grep返回非零退出代码,而这始终返回零退出代码。 - Ujjwal Arora

2
如果您正在使用adb,则使用首个adb shell命令,否则可以通过su命令在同一设备上使用root。
然后,我们可以通过他们的pkg名称获取已安装apk文件的路径,例如在我们的情况下,pkg名称是com.tencent.ig。
pm path com.tencent.ig | sed 's/package://'

如果应用已安装:您将获得APK文件的路径。

如果应用未安装:您将什么也得不到。

以前的答案是有限的,但通过使用上述逻辑,我们也可以轻松使用if语句,例如:

pkg=com.tencent.ig #Add pkg of your app only here
if [ -f $(pm path $pkg | sed 's/package://') ]
then 
echo "YES, app is installed"
#further commands if app is installed
else 
echo "NO, app is not installed"
#further commands if app not installed
fi

我认为那会非常方便。


pm pathpm list更好,因为pm list <APP>会列出所有包含<APP>的包名;而pm path只检查完全匹配的情况。 - J Kluseczka

2

Android 7.0引入了cmd(一种新的基于本地代码的)工具,可以比旧的基于Java字节码的工具如pm更快地与Android服务交互,例如PackageManager。因此,对于最近的Android版本,您应该使用adb shell cmd package list packages <package.name.substring>而不是之前的adb shell pm list packages <package.name.substring>

adb shell cmd package list packages <package.name.substring>

1
考虑到@Joel的回答,只需用一行代码即可完成。
# uninstall only if exists
adb shell pm list packages | grep com.your.app.package && adb uninstall com.your.app.package

0

这个很好用:

adb shell pm list packages your.package.name

将“your.package.name”替换为所需的包名。

如果应用已安装:您将获得APK文件的路径

如果应用未安装:您将什么也得不到


你的回答可以通过提供更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接