我需要使用adb安装一个包名为“com.xyz.game”的Android应用程序。 我想要使用shell脚本自动化这个过程。这个过程将是这样的,如果应用已经安装过了,则卸载它(使用命令adb uninstall com.xyz.game),然后使用“adb install game.apk”重新安装,否则直接使用“adb install game.apk”进行安装。
我该如何实现这个过程?
[更新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
尝试使用grep从pm list packages结果中获取结果。
adb shell pm list packages | grep com.xyz.game
如果已经安装了,您就可以看到结果。
package:com.xyz.game
无需使用grep。使用以下命令,您可以简单地检查应用程序是否已存在。
运行ADB命令
adb shell pm list packages [your.package.name]
如果应用程序已安装,则上述命令将返回以下内容:
package:[your.package.name]
否则它将不会返回任何东西,即返回空字符串。
| grep
的 grep
。 - user276648adb shell
命令,否则可以通过su
命令在同一设备上使用root。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 path
比pm list
更好,因为pm list <APP>
会列出所有包含<APP>
的包名;而pm path
只检查完全匹配的情况。 - J KluseczkaAndroid 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>
# uninstall only if exists
adb shell pm list packages | grep com.your.app.package && adb uninstall com.your.app.package
这个很好用:
adb shell pm list packages your.package.name
将“your.package.name”替换为所需的包名。
如果应用已安装:您将获得APK文件的路径
如果应用未安装:您将什么也得不到
grep
。 - mimarcellist 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