App安装方式:install和push。install命令安装到/data/app目录,push命令一般往/system/app或/system/priv-app目录推送
Android中不同应用权限级别从低到高总结场景
(1)/data/app 普通应用。只用到了普通权限,比如上网权限等等。
(2)/system/app 系统应用,用来可以限制无法手动卸载,对系统权限没有要求的情况,无法调用系统api
(3)/system/priv-app 系统应用(未设置uid.system),无法手动卸载,可以调用部分系统api
(4)系统签名应用普通安装的方式,可以调用系统相关api,同时也可以被手动卸载,可以添加privileged特殊权限
(5)system/priv-app 系统应用(设置uid.system),无法手动卸载,可以调用全部系统api,可以添加privileged特殊权限
如何查看一个应用的权限情况?
adb shell dumpsys package XXX包名
Packages:
Package [com.example.audiologdemo] (6b95b97):
appId=10205
pkg=Package{49e3184 com.example.audiologdemo}
# 代码路径
codePath=/data/app/~~sZWbsgqbPIIBWjmx3Dt6aA==/com.example.audiologdemo-iSYYu-qiwc7zAwkP_dA-wg==
# 资源路径
resourcePath=/data/app/~~sZWbsgqbPIIBWjmx3Dt6aA==/com.example.audiologdemo-iSYYu-qiwc7zAwkP_dA-wg==
# lib库路径
legacyNativeLibraryDir=/data/app/~~sZWbsgqbPIIBWjmx3Dt6aA==/com.example.audiologdemo-iSYYu-qiwc7zAwkP_dA-wg==/lib
extractNativeLibs=false
primaryCpuAbi=null
secondaryCpuAbi=null
cpuAbiOverride=null
# APP版本号
versionCode=1 minSdk=24 targetSdk=34
minExtensionVersions=[]
versionName=1.0
usesNonSdkApi=false
splits=[base]
apkSigningVersion=2
flags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA TEST_ONLY ALLOW_BACKUP ]
privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
forceQueryable=false
dataDir=/data/user/0/com.example.audiologdemo
supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
timeStamp=2024-10-09 23:21:47
lastUpdateTime=2024-10-09 23:21:47
installerPackageName=null
installerPackageUid=-1
initiatingPackageName=com.android.shell
originatingPackageName=null
packageSource=1
appMetadataFilePath=null
signatures=PackageSignatures{a897d6d version:2, signatures:[430e466a], past signatures:[]}
installPermissionsFixed=true
pkgFlags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA TEST_ONLY ALLOW_BACKUP ]
privatePkgFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
apexModuleName=null
# Manifest.xml中声明的权限
declared permissions:
com.example.audiologdemo.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION: prot=signature
requested permissions:
android.permission.FOREGROUND_SERVICE
android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION
android.permission.RECORD_AUDIO
android.permission.INTERNET
android.permission.SYSTEM_ALERT_WINDOW
android.permission.SYSTEM_OVERLAY_WINDOW
com.example.audiologdemo.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
# 安装的权限
install permissions:
android.permission.SYSTEM_ALERT_WINDOW: granted=false, flags=[ USER_SET]
android.permission.FOREGROUND_SERVICE: granted=true
android.permission.INTERNET: granted=true
com.example.audiologdemo.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION: granted=true
android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION: granted=true
User 0: ceDataInode=328481 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=0 instant=false virtual=false
installReason=0
# 首次安装时间
firstInstallTime=2024-10-04 20:20:35
uninstallReason=0
overlay paths:
/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay.apk
/data/resource-cache/com.android.systemui-neutral-un4G.frro
/data/resource-cache/com.android.systemui-accent-EIXS.frro
/data/resource-cache/com.android.systemui-dynamic-QAke.frro
legacy overlay paths:
/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay.apk
gids=[3003]
# 运行时请求的权限
runtime permissions:
android.permission.RECORD_AUDIO: granted=true, flags=[ USER_SET|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
从dumpsys package XXX 命令的日志,可以看到包名应用对应的Uid信息,版本信息,apk安装位置,安装时间,AndroidManifest声明的权限,实际获取到的权限等等信息。
requested permissions 下面的权限是应用声明的权限,runtime permissions的权限是当前获取到的权限。
值得注意的是即使是系统应用或者系统签名应用也是要在 AndroidManifest 中声明需要的权限。