pms 介绍:
这是 android studio编译 apk,安装成功后的截图
adb shell pm install -r "/data/local/tmp/com.crg.installtest"
就是安装 apk。
Android系统中PackageManagerService简称PMS,主要负责各种APK的安装,卸载,优化和查询。
Android系统中,pm工具是PMS的一个展现命令。通过了解pm的使用,可以了解PMS究竟提供了哪些具体的功能,进而帮助我们理解和分析PMS的源码实现。
pm使用
利用adb shell命令,进入Android设备的终端,pm工具在/system/bin中,所以可以直接使用:
bullhead:/ $ which pm
/system/bin/pm
pm list packages [options] [FILTER]
打印所有的已经安装的应用的包名,如果设置了文件过滤则值显示包含过滤文字的内容.
参数:
-f 显示每个包的文件位置
-d 使用过滤器,只显示禁用的应用的包名
-e 使用过滤器,只显示可用的应用的包名
-s 使用过滤器,只显示系统应用的包名
-3 使用过滤器,只显示第三方应用的包名
-i 查看应用的安装者
示例: 显示第三方的安装包
127|bullhead:/ $ pm list packages -3
package:com.sohu.inputmethod.sogou
package:com.baidu.searchbox
package:com.crg.installtest
package:com.tencent.mobileqq
package:com.willme.topactivity
安装与卸载apk
pm install [-lrtsfd] [-i PACKAGE] [--user USER_ID] [PATH]
adb install实际上就是对pm install的封装调用。
参数:
-l 锁定应用程序
-r 重新安装应用,且保留应用数据
-t 允许测试apk被安装
-i INSTALLER_PACKAGE_NAME 指定安装包的包名
-s 安装到sd卡
-f 安装到系统内置存储中(默认安装位置)
-d 允许降级安装(同一应用低级换高级)
-g 授予应用程序清单中列出的所有权限(只有6.0系统可用)
包路径
pm path package_name
卸载apk:
pm uninstall [-k] [--user USER_ID] [--versionCode VERSION_CODE] PACKAGE
参数:
-k 卸载应用且保留数据与缓存(如果不加-k则全部删除)
PMS运行时的一些规则
PMS相关的目录与文件,以及PMS操作它们的规则
APK文件路径
APK主要分为两类:
系统自带的APK
用户安装的第三方APK
对于系统自带的APK,可以从下面的路径中查找:
/system/priv-app
该路径存放一些系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使用
android:protectionLevel=signatureOrSystem
那么该app必须放到priv-app目录中去。
——————————————————————————————————————————————————————
/system/app
该目录中存放的系统app权限相对较低,而且当拥有root权限时,就有可能卸载掉这些app。
——————————————————————————————————————————————————————
/vendor/app
该目录存放vendor厂商的app
——————————————————————————————————————————————————————
/oem/app
该目录中存放oem特有的app。
——————————————————————————————————————————————————————
/data/app
用户安装的第三方app
PMS启动的时候,也是按照上述顺序逐个扫描解析这些目录中的apk的。
安装APK的方法
系统应用的安装
PMS启动的时候完成,没有安装界面。
通过设备自带的应用商店下载的apk
下载完APK之后,调用Packagemanager接口安装,没有安装界面。
ADB命令安装
adb命令实际上是通过pm命令来安装的,同样没有安装界面。
第三方应用安装
通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。
在ANdroid 5.0之前,Android系统会监视前面所说的几个存放apk的路径,一旦发现有新的apk被放进去了,就会自带安装。5.0之后,不在采取此策略。只有系统启动的时候,才会扫描这写路径中的apk。
apk数据存储的位置
apk安装之后,产生的数据都存储在/data文件中。
/data/app
用户安装的第三方apk,以及app所依赖的native library都放在这里。
在Android 6.0时,此目录了一个文件夹“oat”,用来存放此app,第一次运行时由dex2oat生成的此app的oat文件。
手百的目录:
bullhead:/data/app/com.baidu.searchbox-EeE_6P6R7H8-djrQTbZyxg== # ls -al
total 49676
drwxr-xr-x 4 system system 4096 1970-01-04 23:31 .
drwxrwx--x 7 system system 4096 1970-01-04 23:31 ..
-rw-r--r-- 1 system system 50850328 1970-01-04 23:31 base.apk
drwxr-xr-x 3 system system 4096 1970-01-04 23:31 lib
drwxrwx--x 3 system install 4096 1970-01-04 23:31 oat
oat 目录:
bullhead:/data/app/com.baidu.searchbox-EeE_6P6R7H8-djrQTbZyxg==/oat/arm # ls -al
total 31500
drwxrwx--x 2 system install 4096 1970-01-05 00:00 .
drwxrwx--x 3 system install 4096 1970-01-04 23:31 ..
-rw-r----- 1 system all_a66 131072 1970-01-05 00: