【发布时间】:2014-01-21 13:41:26
【问题描述】:
我必须使用 adb 安装一个包名称如“com.xyz.game”的 android 应用程序。 我想使用 shell 脚本自动化这个过程。这个过程就像已经安装了应用程序,卸载它(使用命令 adb uninstall com.xyz.game)并使用“adb install game.apk”安装,否则简单的“adb install game.apk”。
我怎样才能做到这一点?
【问题讨论】:
我必须使用 adb 安装一个包名称如“com.xyz.game”的 android 应用程序。 我想使用 shell 脚本自动化这个过程。这个过程就像已经安装了应用程序,卸载它(使用命令 adb uninstall com.xyz.game)并使用“adb install game.apk”安装,否则简单的“adb install game.apk”。
我怎样才能做到这一点?
【问题讨论】:
考虑到@Joel 的回答,只需单线即可
# uninstall only if exists
adb shell pm list packages | grep com.your.app.package && adb uninstall com.your.app.package
【讨论】:
[更新 2]
不使用grep
adb shell pm list packages [your.package.name] 如below 回答中所述
[更新]
根据下面的(也)正确答案,尝试 grep 来自 pm list packages 的结果。
adb shell pm list packages | grep com.your.app.package
[原创]
如果应用程序已经安装,并且如果您尝试再次安装相同的应用程序,adb 将返回错误 - Failure [INSTALL_FAILED_ALREADY_EXISTS]。但是,如果要重新安装已经安装的应用程序,请使用-r 参数。
例如:
adb install -r game.apk
【讨论】:
adb uninstall 的主要方式之一是,如果我怀疑在重新部署构建时某些缓存数据没有被清理,并且想要确保我是从全新的状态安装。
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 进行单词匹配。
Android 7.0 引入了cmd(一种新的基于本机代码的)工具,与PackageManager 等Android 服务进行交互的速度比pm 等基于Java 字节码的旧工具要快得多。所以对于最近的 Android 版本而不是 adb shell pm list packages <package.name.substring> 你应该使用
adb shell cmd package list packages <package.name.substring>
【讨论】:
无需使用 grep。使用以下命令,您可以简单地检查应用程序是否已经存在。
运行 ADB 命令
adb shell pm list packages [your.package.name]
如果应用程序已经安装,那么上面的命令将返回,
包:[your.package.name]
否则它不会返回任何东西,即空字符串。
【讨论】:
grep,无需输入| grep。
尝试 grep 来自 pm list packages 的结果。
adb shell pm list packages | grep com.xyz.game
如果已经安装,您可能会看到结果。
package:com.xyz.game
【讨论】: