Android系统提供了pm命令,可以在一定程度上为手机系统开发者提供了便利。本文会简单介绍相关的文件和本人经常使用的命令。
/system/bin/pm
-rwxr-xr-x root shell 191 2014-01-06 12:44 pm
/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
就这一个类,其中有一个main方法:
public static void main(String[] args) { new Pm().run(args); }
其中会根据用户不同的输入参数去执行不同的方法,当然,核心还是要通过PackageManagerService提供的相关服务来实现。
可以直接使用adb shell pm XXX来执行pm命令,或者先进入到shell(adb shell),然后执行pm XXX等命令。
直接输入pm,可以查看它的帮助文档。
pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f]
[--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>]
[--originating-uri <URI>] [--referrer <URI>] PATH
pm uninstall [-k] PACKAGE
pm install: installs a package to the system. Options:
-r 重新安装已经存在的app,保留它原有的数据 有时安装时会报错:应用已存在,添加此参数就不会报错
-s 将app安装到SD card中
-f 将app安装到内部flash中,一般应该会安装到data/app目录下
还有其它选项,这里不介绍。
pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
举例:输入pm list packages,就可以看到手机中的所有应用,如下
root@android:/ # pm list packages
package:android
package:com.Ama.PanicFlight
package:com.android.backupconfirm
package:com.android.browser
package:com.android.browser.provider
package:com.android.calculator2
package:com.android.calendar
……
那几个可选的参数也非常有用。
-f 同时显示对应的apk文件的绝对路径
举例:查找包名中包含vending的apk的路径或是apk名称
root@android:/ # pm list packages -f vending
package:/system/app/Phonesky.apk=com.android.vending
这样我们就知道Phonesky.apk是它的文件名称
-d 只显示被隐藏的apk
-e 只显示未被隐藏的apk
-s 只显示系统apk,应该是system目录下的apk,包括/system/framework, /system/app,/vendor(它是个链接,链接到/system/vendor,所以也是system目录下的)
-3 只显示第三方的apk
-u 还包含未安装的apk
pm set-install-location [0/auto] [1/internal] [2/external]
pm get-install-location
0 [auto]: 让系统决定安装在什么位置
1 [internal]: 安装在设备内部空间
2 [external]: 安装在外部空间中
一般内部就是只data/app目录下,外部是指SD卡中,装在内部空间中的apk之后就不能移动到SD卡中,而安装在SD卡中的可以通过settings-Apps去移动apk到内部空间。
一般地,auto也意味着internal,这点本人不确定。
需要说明一点,这里的安装位置并不意味着apk就会安装到相应的目录中,起决定性作用的还是apk自身是否对安装位置有要求,它可以再AndroidManifes.xml文件中通过声明installLocation(auto、internalOnly、preferExternal),如果apk没有指明这个,那么我们这里的才会生效。
pm path PACKAGE
举例:pm path com.android.vending
130|root@android:/ # pm path com.android.vending
package:/system/app/Phonesky.apk
pm list features
pm list libraries
命令如果有需要,多使用就会熟练。
pm命令只是把PackageManagerService提供的某些服务提供了一个接口方便使用,要了解详情,需要研究PackageManagerService。