Android系统提供了pm命令,可以在一定程度上为手机系统开发者提供了便利。本文会简单介绍相关的文件和本人经常使用的命令。


一、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,可以查看它的帮助文档。



1.安装、卸载apk
      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目录下
       还有其它选项,这里不介绍。

2.列表显示所有apk
        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

3.获取/修改系统默认安装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没有指明这个,那么我们这里的才会生效。

4.根据包名获取apk的位置
       pm path PACKAGE
       举例:pm path com.android.vending
130|root@android:/ # pm path com.android.vending
 package:/system/app/Phonesky.apk
5.列表显示所有的features和libraries
       pm list features
        pm list libraries


四、小结

       命令如果有需要,多使用就会熟练。

       pm命令只是把PackageManagerService提供的某些服务提供了一个接口方便使用,要了解详情,需要研究PackageManagerService。