在 Android 开发过程中,通过 ADB (Android Debug Bridge) 命令可以很方便地在 Android 设备上安装和卸载 APK 文件。
一、安装apk:
1、正常安装APK
adb install xxxx.apk
2、覆盖安装APK
adb install -r xxxx.apk
-r 或 --replace,允许替换已存在的应用。即设置上已经存在该应用,这时如果安装就需要覆盖安装。
3、安装测试APK
adb install -t xxxx.apk
-t 或 --test-only,安装为测试应用。 很多时候开发人员为了方便,经常使用编译出来的测试 APK 进行验证,这种安装没有使用正式签名的 APK 可以使用该命令选项安装。
4、组合使用
adb install -r -t xxxx.apk
对于安装命令中的选项可以组合使用,最常见的就是这种 -r -t 的选项组合,即覆盖安装测试 APK。
5、安装低版本APK
adb install -d xxxx.apk
-d 或 --downgrade,允许降级安装。即安装比但前设备上现有版本低的应用。
5、安装并授予所有运行时权限
adb install -g xxxx.apk
-g 或 --grant-all-permissions,授予所有权限。
6、本地文件安装
adb install -l xxxx.apk
-l 或 --local,使用本地数据存储。即允许你在不通过 ADB 传输文件的情况下直接在设备上安装 APK 文件(本地路径),这可以提高安装效率,特别是在开发环境中频繁安装和调试 APK 文件时。
7、旁加载
adb install -s xxxx.apk
-s 或 --sideload,用于旁加载。旁加载是指绕过官方应用商店,直接在 Android 设备上安装 APK 文件的过程。通常在特殊情况下(如设备处于 Recovery 模式)通过 ADB 安装 APK 文件,这种安装方式常用于刷机或更新系统级别的应用。
其他选项
对于安装命令还有很多其他选项,这里就不做一一介绍了。
-c 或 --no-verify: 不验证 APK。
-S 或 --sync: 同步模式。
-U 或 --update-existing: 更新现有应用。
-W 或 --wait-for-debugger: 等待调试器。
-F 或 --forward-lock: 前置锁定。
-A 或 --auto-grant-permissions: 自动授予权限。
-D 或 --debuggable: 设置应用为可调试。
二、卸载apk:
1、直接执行卸载
查看包名
adb shell pm list packages
指定包名卸载
adb uninstall {包名}
如果想要保留应用数据,可以使用 -k 命令选项进行卸载。
2、root权限卸载
对于普通的应用可以直接使用上面的方式进行卸载,但是还有很多预装应用、系统应用以及不可卸载应用,直接使用上述命令是无法卸载的,这就需要获取 root 权限后,进入到 APK 的安装路径,直接删除对应的 APK 文件。
获取权限
获取root权限:adb root
获取读写权限:adb remount
查找文件位置
查看包名:adb shell pm list packages
获取路径:adb shell pm path {包名}
这里如果知道应用包名直接使用下面的命令可以直接获取 APK 的文件路径。
删除应用
adb shell rm {包名地址}
这里使用 rm 命令进行文件删除。
设备重启
adb reboot
这里也可以手动断电重启设备。
3、shell卸载
如果获取了 root 权限后,还是无法卸载应用,就只能使用 shell 命令进入到 APK 目录下执行删除了。
如果2方法还是无法卸载,就只能进入apk目录下进行删除了。
获取权限
获取root权限:adb root
获取读写权限:adb remount
首先,同样是获取 root 权限和文件的读写权限。
进入shell
adb shell
使用 shell 命令进行到设备系统。
查找文件位置
查看包名:pm list packages
获取路径:pm path {包名}
可以看到进入到设备后的命令相比于前面的 ADB 命令只是前面少了 adb shell,后面的完全一样。
进入文件目录
cd /system/app/***
这是使用 cd 命令进入到 APK 文件的指定目录。
删除应用
rm -rf xxx.apk
使用了 rm -rf 命令进行删除,相比于前面 ADB 的 rm 命令只是增加了一些选项。这里的 -r 和 -f 选项分别代表递归(recursive)和强制(force)。这是一个常用的组合,表示强制递归删除文件,对于一些具有特殊属性文件或目录、文件或目录正在被使用、文件系统错误、权限问题以及符号链接指向不存在的目标等异常文件的删除有很好的效果。
设备重启
reboot
三、应用更新
其实对于开发者来说,很多时候的是替换原有的应用,安装自己的应用进行功能验证,我们直接替换系统中原有的 apk 文件即可。
1、功能实现
确定文件位置
1)进入Shell:adb shell
2)确定应用包名:ps -ef | grep '应用包名关键字'
3)获取apk文件位置:pm path '应用包名'
这里对于知道应用包名的可以省略第二步。
替换apk文件
adb root
adb remount
adb push <本地APK路径> <系统APK路径>
这一步更新应用的关键步骤,同样需要获取系统权限,然后使用 adb push 命令将 apk 文件推送到系统指定位置。
后续处理
同步文件系统:adb shell sync
清除应用数据:adb shell pm clear '应用包名'
重启设备:adb reboot
sync 命令用于确保所有待处理的写入操作都已成功完成,并将数据从缓存刷新到存储介质上,这对于确保文件正确无误地写入非常重要。 清除应用数据确保会清除应用的所有数据(如设置、数据库等),基本上是恢复该应用到初始状态,保证验证功能的准确性。
2、使用示例
假如这里我们需要替换一个 xiaoxu.apk,并且我们还不知道它的包名。
1)adb shell
2)ps -ef | grep 'xiaoxu'
输出:system 2503 452 0 23:59:57 ? 00:00:03 com.my.xiaoxu
3)pm path com.my.xiaoxu
输出:package:/system/priv-app/MyXixoxu/xiaoxu.apk
4)exit
5)adb root
6)adb remount
输出:remount succeeded
7)adb push C:\Users\Desktop\xiaoxu.apk /system/priv-app/MyXixoxu/xiaoxu.apk
输出:C:\Users\Desktop\xiaoxu.apk: 1 file pushed, 0 skipped. 56.9 MB/s (22596653 bytes in 0.379s)
8)adb shell sync
9)adb shell pm clear com.my.xiaoxu
输出:Success
10)adb reboot
这里是一个比较详细的流程,可以根据个人需要进行删减。
3、对比Install
对于 path 的方式大都是系统应用,而 install 安装也适用于系统应用,但是他们安装包的位置是不同的。path 可以指定路径,一般是 /system/app/、/system/priv-app/ 或 vendor/ 对应路径下,而 install 安装则是位于 /data/app/ 下,所以对于系统应用使用 install 安装安装后,两个安装包会同时存在。
在 Android 系统中,如果同一个应用(相同的包名和签名)同时存在于 system/app/(系统预装)和通过 adb install 安装到 data/app/(用户安装),系统会优先加载并运行data/app/中的版本(用户安装的APK),因为用户分区的应用优先级高于系统分区。