dumpsys-package
ams和pms是android系統最重要的系統服務,本文解析dumpsys package
命令,看哪些PMS相關的系統信息,數據結構是運行時可以查看的。
命令提示
console:/ # dumpsys package -h
Package manager dump options:
[-h] [-f] [--checkin] [cmd] ...
--checkin: dump for a checkin
-f: print details of intent filters
-h: print this help
cmd may be one of:
l[ibraries]: list known shared libraries
f[eatures]: list device features
k[eysets]: print known keysets
r[esolvers] [activity|service|receiver|content]: dump intent resolvers
perm[issions]: dump permissions
permission [name ...]: dump declaration and use of given permission
pref[erred]: print preferred package settings
preferred-xml [--full]: print preferred package settings as xml
prov[iders]: dump content providers
p[ackages]: dump installed packages
s[hared-users]: dump shared user IDs
m[essages]: print collected runtime messages
v[erifiers]: print package verifier info
d[omain-preferred-apps]: print domains preferred apps
i[ntent-filter-verifiers]|ifv: print intent filter verifier info
version: print database version info
write: write current settings now
installs: details about install sessions
check-permission <permission> <package> [<user>]: does pkg hold perm?
dexopt: dump dexopt state
compiler-stats: dump compiler statistics
service-permissions: dump permissions required by services
<package.name>: info about given package
AuthBlog:秋城https://www.cnblogs.com/houser0323
數據結構
命令 | 源碼 | 關鍵字 | 釋義 |
---|---|---|---|
l[ibraries] | mSharedLibraries | Libraries: | 所有庫信息 |
f[eatures] | mAvailableFeatures | Features: | 系統支持的feature |
k[eysets] | mSettings.mKeySetManagerService.dumpLPr() | Key Set Manager: | keyset信息 |
r[esolvers] | IntentResolver.java#dump() | Activity Resolver Table: | 所有四大組件intent接收器信息 |
perm[issions] | mSettings.dumpPermissionsLPr() | Permissions: | 所有權限信息 |
permission [name ...] | mSettings.dumpPermissionsLPr() | Permissions: | 特定權限信息 |
pref[erred] | PreferredIntentResolver#dump() | Preferred Activities User | launcher activity偏好信息 |
preferred-xml [--full] | mSettings.writePreferredActivitiesLPr | 生成xml | |
prov[iders] | PackageParser.Provider mProviders.mProviders | Registered ContentProviders: | 所有ContentProvider信息 |
p[ackages] | mSettings.dumpPackagesLPr() | Packages: | 所有package信息 |
s[hared-users] | mSettings.dumpSharedUsersLPr() | Shared users: | 所有共享uid信息 |
m[essages] | mSettings.dumpReadMessagesLPr()/dumpCriticalInfo() | Settings parse messages | 讀系統packageSetting解析信息mReadMessages、讀uiderrors.txt |
v[erifiers] | mRequiredVerifierPackage | Verifiers: | 需要驗證的apk |
d[omain-preferred-apps] | PackageSetting#getIntentFilterVerificationInfo() | App verification status: | 域驗證信息 |
i[ntent-filter-verifiers] | mIntentFilterVerifierComponent | Intent Filter Verifier: | AppLink相關 |
version | mSettings.dumpVersionLPr() | Database versions: | 數據庫版本 |
write | mSettings.writeLPr() | 這是寫操作用於替換packages.xml | |
installs | mInstallerService.dump() | Active install sessions: | 活動中的install session信息 |
check-permission
|
checkPermission() | 返回值0表有;-1表無 | |
dexopt | dumpDexoptStateLPr() | Dexopt state: | 所有apk的dexopt信息 |
compiler-stats | dumpCompilerStatsLPr() | Compiler stats: | 所有apk的編譯器信息 |
service-permissions | serviceInfo.permission | Service permissions: | 所有service的權限信息 |
<package.name> | DumpState.OPTION_SHOW_FILTERS | 特定apk的所有信息-最常用 |
常用操作
1.包名和apk名互查
$ dumpsys package com.android.systemui |grep -i path
codePath=/system/priv-app/SystemUI
resourcePath=/system/priv-app/SystemUI
path: /system/priv-app/SystemUI/SystemUI.apk
知道包名查路徑還可以用pm path <package name>
更方便,但是知道apk名稱查包名就需要dumpsys了,如下
$ dumpsys package p |grep -B 5 SystemUI|grep Package
Package [com.android.systemui] (633b2ed):
pkg=Package{8e872f3 com.android.systemui}
2.查看系統支持的feature
與pm list features
命令作用相同
$ dumpsys package f
......
android.hardware.bluetooth
android.hardware.usb.host
......
3.查看apk權限信息
$ dumpsys package <package name>
打印中查找關鍵字
- "declared permissions:"應用自定義權限
- "requested permissions:"AndroidManifest.xml文件中所有request的權限
- "install permissions:"安裝時就賦予的權限
- "runtime permissions:"運行時權限
4.查看apk的flag信息
查看某個apk的flag信息,如systemui
$ dumpsys package com.android.systemui |grep Flags
privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PRIVILEGED ]
pkgFlags=[ SYSTEM HAS_CODE PERSISTENT ]
可以看到systemui是system系統應用也是persistent應用,如果要查找所有的system應用可以用pm list packages -s
,查找所有PERSISTENT的應用呢,可以dumpsys package p
然后在結果中過濾,除此之外還有另外兩種方法dumpsys meminfo
和logcat -b events |grep -i am_proc_start
總結
dumpsys是一個很強大的命令,大多數的系統信息都可以用它抓出來,當你想快捷獲取系統信息又沒有思路時,不妨嘗試一下dumpsys,會有驚喜。
dumpsys package能輕松獲取多數的PMS數據結構的值,還能替換更新packages.xml。
示例中也多次提到pm命令,這倆結合的話,有關PMS模塊的大部分系統信息和操作都可以便捷實現,有效提高開發調試速度。