关于目录
/system/priv-app 中包括 Launcher,SystemUI, SettingsProvider 等,均是系统的核心应用,这些应用能使用系统级的权限,4.4 之前的所有 /system/app 下的软件都能使用系统级的权限。
Google 这样做是把内置到系统的应用也做个级别的区别。
放到 /system/priv-app 下的应用比放到 /system/app 下的应用可以声明获得更多的权限。
在 Android 中,每个应用都有自己的权限声明,比如要使用系统限制的权限(例如 android.permission.WRITE_SECURE_SETTINGS),我们就需要把程序安装到 /system/app 下。
关于进程
从应用的运行角度来说,/system/priv-app 中的 service 是不能被 kill 掉的,就算通过 adb kill 掉后系统也会重新拉起。例如:
Line 14879: 09-28 10:07:06.352 1624 2165 W ActivityManager: Scheduling restart of crashed service com.xxx.xxx/.xxx.xxxin 1000ms Line 14907: 09-28 10:07:06.366 1624 2165 I ActivityManager: Start proc 5588:com.xxx.xxx/u0a96 for restart com.xxx.xxx 好处是进程可以保持始终运行,并且能拿到最多的权限;坏处是无法正常升级,因为一被 kill 马上又被拉起来,并且升级完成后,再起来的还是旧版本的 service。
关于 System App
在 PackageManagerService 中对是否是 System App 的判断:
private static boolean isSystemApp(PackageParser.Package pkg) { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; }
private static boolean isSystemApp(PackageSetting ps) { return (ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0; }
具有 ApplicationInfo.FLAG_SYSTEM 标记的,被视为 System App。
有两类 App 属于 System App :
特定 shared uid 的 App
例如: shared uid 为 android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell。这类 App 都被赋予了 ApplicationInfo.FLAG_SYSTEM 标志。
特定目录中的 App
特定目录包括:/vendor/overlay,/system/framework,/system/priv-app,/system/app,/vendor/app,/oem/app。这些目录中的 App,被视为 System App。
在Settings里面添加Global相关的值
secure
Settings.Secure
content://settings/secure
安全性的用户偏好系统设置,第三方APP有读没有写的权限
global
Settings.Global
content://settings/global
所有的编号设置,对系统的所有用户公开,第三方APP有读没有写的权限
system
Settings.system
content://settings/system
包含各种各样的用户偏好系统设置