1.问题引入
在Android开发中,
1)Framework中PackageManager扫包后,会把app归类为SYSTEM, SYSTEM_EXT, PRIVILEGED 类别.
2)同样的, SeAndroid也会把APP归类程platform_app, system_app, untrusted_app(甚至还有其他,mediaprovider,gmscore_app).
flag SYSTEM和system_app我们都称之为系统app.
但是他们不是同一个概念的"系统app".
2.PackageSettings flag SYSTEM
dumpsys package com.android.systemui为例, 输出如下:
Packages:
Package [com.android.systemui] (d6f33bf):
appId=10187
sharedUser=SharedUserSetting{
4058ad4 android.uid.systemui/10187}
pkg=Package{
aa0e47d com.android.systemui}
codePath=/system_ext/priv-app/SystemUI
resourcePath=/system_ext/priv-app/SystemUI
legacyNativeLibraryDir=/system_ext/priv-app/SystemUI/lib
extractNativeLibs=true
primaryCpuAbi=arm64-v8a
secondaryCpuAbi=null
cpuAbiOverride=null
versionCode=1410014 minSdk=33 targetSdk=34
minExtensionVersions=[]
versionName=14.00.14
usesNonSdkApi=false
splits=[base]
apkSigningVersion=3
flags=[ SYSTEM HAS_CODE PERSISTENT ]
privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PARTIALLY_DIRECT_BOOT_AWARE PRIVILEGED SYSTEM_EXT PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING ]
forceQueryable=false
根据输出可以看到两个重要的flag,分别为flags和privateFlags.其中flags其中标签为SYSTEM和PERSISTENT, 而privateFlags其中两个输出为PRIVILEGED/SYSTEM_EXT.
对应的输出代码如下:
@NeverCompile // Avoid size overhead of debugging code.
void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
ArraySet<String> permissionNames, PackageSetting ps,
LegacyPermissionState permissionsState, SimpleDateFormat sdf, Date date,
List<UserInfo> users, boolean dumpAll, boolean dumpAllComponents) {
AndroidPackage pkg = ps.getPkg();
// 省略好多
if (pkg != null) {
pw.print(prefix); pw.print(" versionName="); pw.println(pkg.getVersionName());
pw.print(prefix); pw.print(